AppWindowAnimator.java revision 72669d18016446d874e4fa1005464e36375124e4
1594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner// Copyright 2012 Google Inc. All Rights Reserved. 2594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner 3594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautnerpackage com.android.server.wm; 4594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner 5594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautnerimport android.graphics.Matrix; 6594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautnerimport android.util.Slog; 7a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautnerimport android.view.Display; 8594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautnerimport android.view.Surface; 9594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautnerimport android.view.WindowManagerPolicy; 10594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautnerimport android.view.animation.Animation; 11594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautnerimport android.view.animation.Transformation; 12594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner 13594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautnerimport java.io.PrintWriter; 14322e40315609acd5a608440bc469d873e09559caCraig Mautnerimport java.util.ArrayList; 15594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner 16594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautnerpublic class AppWindowAnimator { 17fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner static final String TAG = "AppWindowAnimator"; 18594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner 19594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner final AppWindowToken mAppToken; 20594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner final WindowManagerService mService; 21594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner final WindowAnimator mAnimator; 22594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner 23594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner boolean animating; 24594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner Animation animation; 25594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner boolean hasTransformation; 26594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner final Transformation transformation = new Transformation(); 27594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner 28594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner // Have we been asked to have this token keep the screen frozen? 29594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner // Protect with mAnimator. 30594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner boolean freezingScreen; 31594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner 32594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner // Offset to the window of all layers in the token, for use by 33594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner // AppWindowToken animations. 34594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner int animLayerAdjustment; 35594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner 366fbda63e68513ece4409dac845588711ab25c39dCraig Mautner // Propagated from AppWindowToken.allDrawn, to determine when 376fbda63e68513ece4409dac845588711ab25c39dCraig Mautner // the state changes. 386fbda63e68513ece4409dac845588711ab25c39dCraig Mautner boolean allDrawn; 396fbda63e68513ece4409dac845588711ab25c39dCraig Mautner 40594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner // Special surface for thumbnail animation. 41594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner Surface thumbnail; 42594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner int thumbnailTransactionSeq; 43594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner int thumbnailX; 44594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner int thumbnailY; 45594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner int thumbnailLayer; 46594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner Animation thumbnailAnimation; 47594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner final Transformation thumbnailTransformation = new Transformation(); 48594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner 49322e40315609acd5a608440bc469d873e09559caCraig Mautner /** WindowStateAnimator from mAppAnimator.allAppWindows as of last performLayout */ 50bea12bdc2e6d2b1158c1faa58a8197d5e971a817Craig Mautner ArrayList<WindowStateAnimator> mAllAppWinAnimators = new ArrayList<WindowStateAnimator>(); 51322e40315609acd5a608440bc469d873e09559caCraig Mautner 52fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner static final Animation sDummyAnimation = new DummyAnimation(); 53fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner 54322e40315609acd5a608440bc469d873e09559caCraig Mautner public AppWindowAnimator(final AppWindowToken atoken) { 55594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner mAppToken = atoken; 56322e40315609acd5a608440bc469d873e09559caCraig Mautner mService = atoken.service; 57322e40315609acd5a608440bc469d873e09559caCraig Mautner mAnimator = atoken.mAnimator; 58594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner } 59594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner 609339c401cf1a056a3a1caddc648334069e6bd267Craig Mautner public void setAnimation(Animation anim, int width, int height) { 6172669d18016446d874e4fa1005464e36375124e4Craig Mautner if (WindowManagerService.localLOGV) Slog.v(TAG, "Setting animation in " + mAppToken 6272669d18016446d874e4fa1005464e36375124e4Craig Mautner + ": " + anim + " wxh=" + width + "x" + height 6372669d18016446d874e4fa1005464e36375124e4Craig Mautner + " isVisible=" + mAppToken.isVisible()); 64594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner animation = anim; 65594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner animating = false; 669339c401cf1a056a3a1caddc648334069e6bd267Craig Mautner if (!anim.isInitialized()) { 679339c401cf1a056a3a1caddc648334069e6bd267Craig Mautner anim.initialize(width, height, width, height); 689339c401cf1a056a3a1caddc648334069e6bd267Craig Mautner } 69594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner anim.restrictDuration(WindowManagerService.MAX_ANIMATION_DURATION); 70594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner anim.scaleCurrentDuration(mService.mTransitionAnimationScale); 71594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner int zorder = anim.getZAdjustment(); 72594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner int adj = 0; 73594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner if (zorder == Animation.ZORDER_TOP) { 74594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner adj = WindowManagerService.TYPE_LAYER_OFFSET; 75594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner } else if (zorder == Animation.ZORDER_BOTTOM) { 76594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner adj = -WindowManagerService.TYPE_LAYER_OFFSET; 77594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner } 78594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner 79594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner if (animLayerAdjustment != adj) { 80594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner animLayerAdjustment = adj; 81594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner updateLayers(); 82594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner } 83594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner // Start out animation gone if window is gone, or visible if window is visible. 84594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner transformation.clear(); 8572669d18016446d874e4fa1005464e36375124e4Craig Mautner transformation.setAlpha(mAppToken.isVisible() ? 1 : 0); 86594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner hasTransformation = true; 87594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner } 88594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner 89594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner public void setDummyAnimation() { 9072669d18016446d874e4fa1005464e36375124e4Craig Mautner if (WindowManagerService.localLOGV) Slog.v(TAG, "Setting dummy animation in " + mAppToken 9172669d18016446d874e4fa1005464e36375124e4Craig Mautner + " isVisible=" + mAppToken.isVisible()); 921d961d46d68eb3134e4bd6c3751f9730e9d32f17Craig Mautner animation = sDummyAnimation; 9394ef9df22c5960b74359e1a98e5c210787d382f2Craig Mautner hasTransformation = true; 9494ef9df22c5960b74359e1a98e5c210787d382f2Craig Mautner transformation.clear(); 9572669d18016446d874e4fa1005464e36375124e4Craig Mautner transformation.setAlpha(mAppToken.isVisible() ? 1 : 0); 96594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner } 97594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner 98594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner public void clearAnimation() { 99594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner if (animation != null) { 100594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner animation = null; 101594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner animating = true; 102594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner } 103594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner clearThumbnail(); 1047636dfbc3331dec0cea374a9540a1f31fb7dbf77Craig Mautner if (mAppToken.deferClearAllDrawn) { 1057636dfbc3331dec0cea374a9540a1f31fb7dbf77Craig Mautner mAppToken.allDrawn = false; 1067636dfbc3331dec0cea374a9540a1f31fb7dbf77Craig Mautner mAppToken.deferClearAllDrawn = false; 1077636dfbc3331dec0cea374a9540a1f31fb7dbf77Craig Mautner } 108594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner } 109594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner 110594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner public void clearThumbnail() { 111594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner if (thumbnail != null) { 112594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner thumbnail.destroy(); 113594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner thumbnail = null; 114594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner } 115594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner } 116594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner 117594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner void updateLayers() { 118594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner final int N = mAppToken.allAppWindows.size(); 119594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner final int adj = animLayerAdjustment; 120594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner thumbnailLayer = -1; 121594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner for (int i=0; i<N; i++) { 122594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner final WindowState w = mAppToken.allAppWindows.get(i); 123594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner final WindowStateAnimator winAnimator = w.mWinAnimator; 124594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner winAnimator.mAnimLayer = w.mLayer + adj; 125594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner if (winAnimator.mAnimLayer > thumbnailLayer) { 126594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner thumbnailLayer = winAnimator.mAnimLayer; 127594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner } 128fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner if (WindowManagerService.DEBUG_LAYERS) Slog.v(TAG, "Updating layer " + w + ": " 129594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner + winAnimator.mAnimLayer); 130594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner if (w == mService.mInputMethodTarget && !mService.mInputMethodTargetWaitingAnim) { 131594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner mService.setInputMethodAnimLayerAdjustment(adj); 132594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner } 133968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner if (w == mService.mWallpaperTarget && mService.mLowerWallpaperTarget == null) { 134594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner mService.setWallpaperAnimLayerAdjustmentLocked(adj); 135594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner } 136594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner } 137594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner } 138594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner 139594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner private void stepThumbnailAnimation(long currentTime) { 140594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner thumbnailTransformation.clear(); 141594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner thumbnailAnimation.getTransformation(currentTime, thumbnailTransformation); 142594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner thumbnailTransformation.getMatrix().preTranslate(thumbnailX, thumbnailY); 143a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner 144a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner ScreenRotationAnimation screenRotationAnimation = 145a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner mAnimator.getScreenRotationAnimationLocked(Display.DEFAULT_DISPLAY); 146a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner final boolean screenAnimation = screenRotationAnimation != null 147a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner && screenRotationAnimation.isAnimating(); 148594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner if (screenAnimation) { 149a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner thumbnailTransformation.postCompose(screenRotationAnimation.getEnterTransformation()); 150594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner } 151594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner // cache often used attributes locally 152594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner final float tmpFloats[] = mService.mTmpFloats; 153594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner thumbnailTransformation.getMatrix().getValues(tmpFloats); 154594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner if (WindowManagerService.SHOW_TRANSACTIONS) WindowManagerService.logSurface(thumbnail, 155594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner "thumbnail", "POS " + tmpFloats[Matrix.MTRANS_X] 156594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner + ", " + tmpFloats[Matrix.MTRANS_Y], null); 157594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner thumbnail.setPosition(tmpFloats[Matrix.MTRANS_X], tmpFloats[Matrix.MTRANS_Y]); 158594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner if (WindowManagerService.SHOW_TRANSACTIONS) WindowManagerService.logSurface(thumbnail, 159594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner "thumbnail", "alpha=" + thumbnailTransformation.getAlpha() 160594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner + " layer=" + thumbnailLayer 161594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner + " matrix=[" + tmpFloats[Matrix.MSCALE_X] 162594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner + "," + tmpFloats[Matrix.MSKEW_Y] 163594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner + "][" + tmpFloats[Matrix.MSKEW_X] 164594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner + "," + tmpFloats[Matrix.MSCALE_Y] + "]", null); 165594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner thumbnail.setAlpha(thumbnailTransformation.getAlpha()); 166594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner // The thumbnail is layered below the window immediately above this 167594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner // token's anim layer. 168594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner thumbnail.setLayer(thumbnailLayer + WindowManagerService.WINDOW_LAYER_MULTIPLIER 169594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner - WindowManagerService.LAYER_OFFSET_THUMBNAIL); 170594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner thumbnail.setMatrix(tmpFloats[Matrix.MSCALE_X], tmpFloats[Matrix.MSKEW_Y], 171594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner tmpFloats[Matrix.MSKEW_X], tmpFloats[Matrix.MSCALE_Y]); 172594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner } 173594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner 174594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner private boolean stepAnimation(long currentTime) { 175594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner if (animation == null) { 176594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner return false; 177594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner } 178594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner transformation.clear(); 179594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner final boolean more = animation.getTransformation(currentTime, transformation); 1809e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner if (false && WindowManagerService.DEBUG_ANIM) Slog.v( 1818a197a4e0887000241dfd183d1e83e6e0f9b2268Craig Mautner TAG, "Stepped animation in " + mAppToken + ": more=" + more + ", xform=" + transformation); 182594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner if (!more) { 183594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner animation = null; 184594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner clearThumbnail(); 185594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner if (WindowManagerService.DEBUG_ANIM) Slog.v( 1868a197a4e0887000241dfd183d1e83e6e0f9b2268Craig Mautner TAG, "Finished animation in " + mAppToken + " @ " + currentTime); 187594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner } 188594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner hasTransformation = more; 189594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner return more; 190594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner } 191594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner 192594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner // This must be called while inside a transaction. 1939339c401cf1a056a3a1caddc648334069e6bd267Craig Mautner boolean stepAnimationLocked(long currentTime) { 194594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner if (mService.okToDisplay()) { 195594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner // We will run animations as long as the display isn't frozen. 196594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner 197fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner if (animation == sDummyAnimation) { 198594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner // This guy is going to animate, but not yet. For now count 199594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner // it as not animating for purposes of scheduling transactions; 200594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner // when it is really time to animate, this will be set to 201594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner // a real animation and the next call will execute normally. 202594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner return false; 203594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner } 204594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner 205594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner if ((mAppToken.allDrawn || animating || mAppToken.startingDisplayed) 206594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner && animation != null) { 207594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner if (!animating) { 208594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner if (WindowManagerService.DEBUG_ANIM) Slog.v( 2098a197a4e0887000241dfd183d1e83e6e0f9b2268Craig Mautner TAG, "Starting animation in " + mAppToken + 2109339c401cf1a056a3a1caddc648334069e6bd267Craig Mautner " @ " + currentTime + " scale=" + mService.mTransitionAnimationScale 211594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner + " allDrawn=" + mAppToken.allDrawn + " animating=" + animating); 212594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner animation.setStartTime(currentTime); 213594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner animating = true; 214594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner if (thumbnail != null) { 215594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner thumbnail.show(); 216594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner thumbnailAnimation.setStartTime(currentTime); 217594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner } 218594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner } 219594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner if (stepAnimation(currentTime)) { 220594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner // animation isn't over, step any thumbnail and that's 221594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner // it for now. 222594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner if (thumbnail != null) { 223594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner stepThumbnailAnimation(currentTime); 224594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner } 225594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner return true; 226594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner } 227594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner } 228594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner } else if (animation != null) { 229594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner // If the display is frozen, and there is a pending animation, 230594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner // clear it and make sure we run the cleanup code. 231594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner animating = true; 232594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner animation = null; 233594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner } 234594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner 235594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner hasTransformation = false; 236594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner 2373de422fe4fe903b1370f3f7ee9c7086966e15b28Craig Mautner if (!animating && animation == null) { 238594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner return false; 239594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner } 240594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner 24176a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner mAnimator.setAppLayoutChanges(this, WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM, 24276a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner "AppWindowToken"); 243594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner 244594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner clearAnimation(); 245594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner animating = false; 246594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner if (animLayerAdjustment != 0) { 247594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner animLayerAdjustment = 0; 248594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner updateLayers(); 249594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner } 250594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner if (mService.mInputMethodTarget != null 251594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner && mService.mInputMethodTarget.mAppToken == mAppToken) { 252594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner mService.moveInputMethodWindowsIfNeededLocked(true); 253594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner } 254594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner 255594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner if (WindowManagerService.DEBUG_ANIM) Slog.v( 2568a197a4e0887000241dfd183d1e83e6e0f9b2268Craig Mautner TAG, "Animation done in " + mAppToken 257594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner + ": reportedVisible=" + mAppToken.reportedVisible); 258594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner 259594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner transformation.clear(); 260594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner 261322e40315609acd5a608440bc469d873e09559caCraig Mautner final int N = mAllAppWinAnimators.size(); 262594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner for (int i=0; i<N; i++) { 263322e40315609acd5a608440bc469d873e09559caCraig Mautner mAllAppWinAnimators.get(i).finishExit(); 264594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner } 265594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner mAppToken.updateReportedVisibilityLocked(); 266594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner 267594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner return false; 268594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner } 269594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner 270bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner boolean showAllWindowsLocked() { 271bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner boolean isAnimating = false; 272322e40315609acd5a608440bc469d873e09559caCraig Mautner final int NW = mAllAppWinAnimators.size(); 273bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner for (int i=0; i<NW; i++) { 274322e40315609acd5a608440bc469d873e09559caCraig Mautner WindowStateAnimator winAnimator = mAllAppWinAnimators.get(i); 275fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG, 276bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner "performing show on: " + winAnimator); 277bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner winAnimator.performShowLocked(); 278bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner isAnimating |= winAnimator.isAnimating(); 279bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner } 280bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner return isAnimating; 281bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner } 282bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner 283529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn void dump(PrintWriter pw, String prefix, boolean dumpAll) { 284529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn pw.print(prefix); pw.print("mAppToken="); pw.println(mAppToken); 285529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn pw.print(prefix); pw.print("mAnimator="); pw.println(mAnimator); 286529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn pw.print(prefix); pw.print("freezingScreen="); pw.print(freezingScreen); 287529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn pw.print(" allDrawn="); pw.print(allDrawn); 288529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn pw.print(" animLayerAdjustment="); pw.println(animLayerAdjustment); 289594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner if (animating || animation != null) { 2909339c401cf1a056a3a1caddc648334069e6bd267Craig Mautner pw.print(prefix); pw.print("animating="); pw.println(animating); 291529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn pw.print(prefix); pw.print("animation="); pw.println(animation); 292594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner } 293594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner if (hasTransformation) { 294594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner pw.print(prefix); pw.print("XForm: "); 295594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner transformation.printShortString(pw); 296594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner pw.println(); 297594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner } 298594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner if (thumbnail != null) { 299594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner pw.print(prefix); pw.print("thumbnail="); pw.print(thumbnail); 300594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner pw.print(" x="); pw.print(thumbnailX); 301594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner pw.print(" y="); pw.print(thumbnailY); 302594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner pw.print(" layer="); pw.println(thumbnailLayer); 303594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner pw.print(prefix); pw.print("thumbnailAnimation="); pw.println(thumbnailAnimation); 304594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner pw.print(prefix); pw.print("thumbnailTransformation="); 305594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner pw.println(thumbnailTransformation.toShortString()); 306594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner } 307529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn for (int i=0; i<mAllAppWinAnimators.size(); i++) { 308529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn WindowStateAnimator wanim = mAllAppWinAnimators.get(i); 309529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn pw.print(prefix); pw.print("App Win Anim #"); pw.print(i); 310529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn pw.print(": "); pw.println(wanim); 311529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn } 312594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner } 313fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner 314fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner // This is an animation that does nothing: it just immediately finishes 315fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner // itself every time it is called. It is used as a stub animation in cases 316fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner // where we want to synchronize multiple things that may be animating. 317fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner static final class DummyAnimation extends Animation { 318fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner @Override 319fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner public boolean getTransformation(long currentTime, Transformation outTransformation) { 320fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner return false; 321fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner } 322fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner } 323fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner 324594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner} 325