From 83339b465c3299abc47ced7dffdf470c5b0c0750 Mon Sep 17 00:00:00 2001 From: Craig Mautner Date: Tue, 1 May 2012 22:13:23 -0700 Subject: [PATCH] Fix Home key causes wrong animation Wallpaper logic assumed that if mWallpaperTarget was non-null then any wallpaper animation should be exiting. However, if the existing wallpaper target was already animating away then mWallpaperTarget remains non-null until it is completely gone. Pressing Home during this time was causing the next animation to exit rather than reverse and enter. This fix looks to see if the wallpaper target is animating and if it is to treat it as null for the purpose of determining which direction the animation should go. Fixes bug 6407941. Change-Id: I731267328db0f9972a5aed6f214962f96737dd07 --- .../com/android/server/wm/WindowAnimator.java | 12 +++++++---- .../server/wm/WindowManagerService.java | 21 +++++++++++++------ .../server/wm/WindowStateAnimator.java | 18 ++++++++++------ 3 files changed, 35 insertions(+), 16 deletions(-) diff --git a/services/java/com/android/server/wm/WindowAnimator.java b/services/java/com/android/server/wm/WindowAnimator.java index e5b1f2c27fc1a..2e817cadc8018 100644 --- a/services/java/com/android/server/wm/WindowAnimator.java +++ b/services/java/com/android/server/wm/WindowAnimator.java @@ -140,6 +140,8 @@ public class WindowAnimator { mService.debugLayoutRepeats("appToken " + appAnimator.mAppToken + " done", mPendingLayoutChanges); } + if (WindowManagerService.DEBUG_ANIM) Slog.v(TAG, + "updateWindowsApps...: done animating " + appAnimator.mAppToken); } } @@ -154,9 +156,11 @@ public class WindowAnimator { // stopped animating, do one more pass through the layout mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER; if (WindowManagerService.DEBUG_LAYOUT_REPEATS) { - mService.debugLayoutRepeats("exiting appToken " + appAnimator.mAppToken + mService.debugLayoutRepeats("exiting appToken " + appAnimator.mAppToken + " done", mPendingLayoutChanges); } + if (WindowManagerService.DEBUG_ANIM) Slog.v(TAG, + "updateWindowsApps...: done animating exiting " + appAnimator.mAppToken); } } @@ -246,9 +250,9 @@ public class WindowAnimator { if (mPolicy.doesForceHide(win, win.mAttrs)) { if (!wasAnimating && nowAnimating) { - if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG, - "Animation started that could impact force hide: " - + win); + if (WindowManagerService.DEBUG_ANIM || + WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG, + "Animation started that could impact force hide: " + win); mBulkUpdateParams |= SET_FORCE_HIDING_CHANGED; mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER; if (WindowManagerService.DEBUG_LAYOUT_REPEATS) { diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java index d39eab49a9e2a..df3965d46d38b 100755 --- a/services/java/com/android/server/wm/WindowManagerService.java +++ b/services/java/com/android/server/wm/WindowManagerService.java @@ -130,8 +130,6 @@ import android.view.animation.AnimationSet; import android.view.animation.AnimationUtils; import android.view.animation.Interpolator; import android.view.animation.ScaleAnimation; -import android.view.animation.Transformation; -import android.view.animation.TranslateAnimation; import java.io.BufferedWriter; import java.io.DataInputStream; @@ -3231,12 +3229,21 @@ public class WindowManagerService extends IWindowManager.Stub if (mNextAppTransitionType == ActivityOptions.ANIM_CUSTOM) { a = loadAnimation(mNextAppTransitionPackage, enter ? mNextAppTransitionEnter : mNextAppTransitionExit); + if (DEBUG_ANIM) Slog.v(TAG, "applyAnimation: wtoken=" + wtoken + + " anim=" + a + " nextAppTransition=ANIM_CUSTOM" + + " transit=" + transit + " Callers " + Debug.getCallers(3)); } else if (mNextAppTransitionType == ActivityOptions.ANIM_SCALE_UP) { a = createScaleUpAnimationLocked(transit, enter); initialized = true; + if (DEBUG_ANIM) Slog.v(TAG, "applyAnimation: wtoken=" + wtoken + + " anim=" + a + " nextAppTransition=ANIM_SCALE_UP" + + " transit=" + transit + " Callers " + Debug.getCallers(3)); } else if (mNextAppTransitionType == ActivityOptions.ANIM_THUMBNAIL) { a = createThumbnailAnimationLocked(transit, enter, false); initialized = true; + if (DEBUG_ANIM) Slog.v(TAG, "applyAnimation: wtoken=" + wtoken + + " anim=" + a + " nextAppTransition=ANIM_THUMBNAIL" + + " transit=" + transit + " Callers " + Debug.getCallers(3)); } else { int animAttr = 0; switch (transit) { @@ -3295,7 +3302,7 @@ public class WindowManagerService extends IWindowManager.Stub if (DEBUG_ANIM) Slog.v(TAG, "applyAnimation: wtoken=" + wtoken + " anim=" + a + " animAttr=0x" + Integer.toHexString(animAttr) - + " transit=" + transit); + + " transit=" + transit + " Callers " + Debug.getCallers(3)); } if (a != null) { if (DEBUG_ANIM) { @@ -7810,7 +7817,9 @@ public class WindowManagerService extends IWindowManager.Stub mToTopApps.clear(); } - WindowState oldWallpaper = mWallpaperTarget; + WindowState oldWallpaper = + mWallpaperTarget != null && mWallpaperTarget.mWinAnimator.isAnimating() + ? null : mWallpaperTarget; adjustWallpaperWindowsLocked(); mInnerFields.mWallpaperMayChange = false; @@ -8117,8 +8126,8 @@ public class WindowManagerService extends IWindowManager.Stub // to go through the process of getting informed // by the application when it has finished drawing. if (w.mOrientationChanging) { - if (DEBUG_ORIENTATION) Slog.v(TAG, - "Orientation start waiting for draw in " + if (DEBUG_ANIM || DEBUG_ORIENTATION) Slog.v(TAG, + "Orientation start waiting for draw mDrawState=DRAW_PENDING in " + w + ", surface " + winAnimator.mSurface); winAnimator.mDrawState = WindowStateAnimator.DRAW_PENDING; if (w.mAppToken != null) { diff --git a/services/java/com/android/server/wm/WindowStateAnimator.java b/services/java/com/android/server/wm/WindowStateAnimator.java index 9147a10626901..2e3833249d04a 100644 --- a/services/java/com/android/server/wm/WindowStateAnimator.java +++ b/services/java/com/android/server/wm/WindowStateAnimator.java @@ -380,8 +380,9 @@ class WindowStateAnimator { boolean finishDrawingLocked() { if (mDrawState == DRAW_PENDING) { - if (SHOW_TRANSACTIONS || DEBUG_ORIENTATION) Slog.v( - TAG, "finishDrawingLocked: " + this + " in " + mSurface); + if (DEBUG_ANIM || SHOW_TRANSACTIONS || DEBUG_ORIENTATION) Slog.v( + TAG, "finishDrawingLocked: mDrawState=COMMIT_DRAW_PENDING " + this + " in " + + mSurface); mDrawState = COMMIT_DRAW_PENDING; return true; } @@ -393,7 +394,8 @@ class WindowStateAnimator { if (mDrawState != COMMIT_DRAW_PENDING) { return false; } - //Slog.i(TAG, "commitFinishDrawingLocked: Draw pending. " + mSurface); + if (DEBUG_ANIM) + Slog.i(TAG, "commitFinishDrawingLocked: mDrawState=READY_TO_SHOW " + mSurface); mDrawState = READY_TO_SHOW; final boolean starting = mWin.mAttrs.type == TYPE_APPLICATION_STARTING; final AppWindowToken atoken = mWin.mAppToken; @@ -526,8 +528,8 @@ class WindowStateAnimator { if (mSurface == null) { mReportDestroySurface = false; mSurfacePendingDestroy = false; - if (DEBUG_ORIENTATION) Slog.i(TAG, - "createSurface " + this + ": DRAW NOW PENDING"); + if (DEBUG_ANIM || DEBUG_ORIENTATION) Slog.i(TAG, + "createSurface " + this + ": mDrawState=DRAW_PENDING"); mDrawState = DRAW_PENDING; if (mWin.mAppToken != null) { mWin.mAppToken.allDrawn = false; @@ -1062,6 +1064,9 @@ class WindowStateAnimator { } } } else { + if (DEBUG_ANIM) { + Slog.v(TAG, "prepareSurface: No changes in animation for " + mWin); + } displayed = true; } @@ -1145,6 +1150,7 @@ class WindowStateAnimator { // Force the show in the next prepareSurfaceLocked() call. mLastAlpha = -1; + if (DEBUG_ANIM) Slog.v(TAG, "performShowLocked: mDrawState=HAS_DRAWN"); mDrawState = HAS_DRAWN; mService.scheduleAnimationLocked(); @@ -1285,7 +1291,7 @@ class WindowStateAnimator { + " anim=" + anim + " attr=0x" + Integer.toHexString(attr) + " a=" + a + " mAnimation=" + mAnimation - + " isEntrance=" + isEntrance); + + " isEntrance=" + isEntrance + " Callers " + Debug.getCallers(3)); if (a != null) { if (WindowManagerService.DEBUG_ANIM) { RuntimeException e = null;