summaryrefslogtreecommitdiffstats
path: root/services/java
diff options
context:
space:
mode:
authorCraig Mautner <cmautner@google.com>2013-10-22 14:29:01 -0700
committerCraig Mautner <cmautner@google.com>2013-10-22 14:50:52 -0700
commit798adeffb0b9c22707b493895453e7dd2f608b75 (patch)
treee8ca6dbd92507ab12a48446194c0a12b2a74b8ac /services/java
parent40006309990c40f5b4b26646b98df222d8d27922 (diff)
downloadframeworks_base-798adeffb0b9c22707b493895453e7dd2f608b75.zip
frameworks_base-798adeffb0b9c22707b493895453e7dd2f608b75.tar.gz
frameworks_base-798adeffb0b9c22707b493895453e7dd2f608b75.tar.bz2
Don't use transient states for wallpaper animation.
The WindowManagerService member mLowerWallpaperTarget is not stable throughout an app transition. Relying on it to be stable causes the intra-wallpaper animation to start out right but after the windows have been relayed out there is no longer a lower wallpaper target. This causes the wallpaper to start tracking the animation of the current wallpaper target rather than remain stable. Switching to a new variable that saves the state of wallpaper animation at the start of the animation fixes bug 11240590. Change-Id: I336a59c47665fcf61019f567b8663956ff0e4940
Diffstat (limited to 'services/java')
-rw-r--r--services/java/com/android/server/wm/WindowAnimator.java6
-rw-r--r--services/java/com/android/server/wm/WindowManagerService.java4
-rw-r--r--services/java/com/android/server/wm/WindowStateAnimator.java11
3 files changed, 10 insertions, 11 deletions
diff --git a/services/java/com/android/server/wm/WindowAnimator.java b/services/java/com/android/server/wm/WindowAnimator.java
index ca87b4f..cd46bb8 100644
--- a/services/java/com/android/server/wm/WindowAnimator.java
+++ b/services/java/com/android/server/wm/WindowAnimator.java
@@ -121,12 +121,6 @@ public class WindowAnimator {
mDisplayContentsAnimators.delete(displayId);
}
- AppWindowAnimator getWallpaperAppAnimator() {
- return mService.mWallpaperTarget == null
- ? null : mService.mWallpaperTarget.mAppToken == null
- ? null : mService.mWallpaperTarget.mAppToken.mAppAnimator;
- }
-
void hideWallpapersLocked(final WindowState w) {
final WindowState wallpaperTarget = mService.mWallpaperTarget;
final WindowState lowerWallpaperTarget = mService.mLowerWallpaperTarget;
diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java
index 55d2e5d..f2a0cbd 100644
--- a/services/java/com/android/server/wm/WindowManagerService.java
+++ b/services/java/com/android/server/wm/WindowManagerService.java
@@ -530,6 +530,7 @@ public class WindowManagerService extends IWindowManager.Stub
static final long WALLPAPER_TIMEOUT = 150;
// Time we wait after a timeout before trying to wait again.
static final long WALLPAPER_TIMEOUT_RECOVERY = 10000;
+ boolean mAnimateWallpaperWithTarget;
AppWindowToken mFocusedApp = null;
@@ -8490,6 +8491,7 @@ public class WindowManagerService extends IWindowManager.Stub
}
}
+ mAnimateWallpaperWithTarget = false;
if (closingAppHasWallpaper && openingAppHasWallpaper) {
if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "Wallpaper animation!");
switch (transit) {
@@ -8517,6 +8519,8 @@ public class WindowManagerService extends IWindowManager.Stub
transit = AppTransition.TRANSIT_WALLPAPER_OPEN;
if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
"New transit into wallpaper: " + transit);
+ } else {
+ mAnimateWallpaperWithTarget = true;
}
// If all closing windows are obscured, then there is
diff --git a/services/java/com/android/server/wm/WindowStateAnimator.java b/services/java/com/android/server/wm/WindowStateAnimator.java
index e2fae89..af00d83 100644
--- a/services/java/com/android/server/wm/WindowStateAnimator.java
+++ b/services/java/com/android/server/wm/WindowStateAnimator.java
@@ -845,9 +845,9 @@ class WindowStateAnimator {
// Wallpapers are animated based on the "real" window they
// are currently targeting.
- if (mIsWallpaper && mService.mLowerWallpaperTarget == null
- && mService.mWallpaperTarget != null) {
- final WindowStateAnimator wallpaperAnimator = mService.mWallpaperTarget.mWinAnimator;
+ final WindowState wallpaperTarget = mService.mWallpaperTarget;
+ if (mIsWallpaper && wallpaperTarget != null && mService.mAnimateWallpaperWithTarget) {
+ final WindowStateAnimator wallpaperAnimator = wallpaperTarget.mWinAnimator;
if (wallpaperAnimator.mHasLocalTransformation &&
wallpaperAnimator.mAnimation != null &&
!wallpaperAnimator.mAnimation.getDetachWallpaper()) {
@@ -856,8 +856,9 @@ class WindowStateAnimator {
Slog.v(TAG, "WP target attached xform: " + attachedTransformation);
}
}
- final AppWindowAnimator wpAppAnimator = mAnimator.getWallpaperAppAnimator();
- if (wpAppAnimator != null && wpAppAnimator.hasTransformation
+ final AppWindowAnimator wpAppAnimator = wallpaperTarget.mAppToken == null ?
+ null : wallpaperTarget.mAppToken.mAppAnimator;
+ if (wpAppAnimator != null && wpAppAnimator.hasTransformation
&& wpAppAnimator.animation != null
&& !wpAppAnimator.animation.getDetachWallpaper()) {
appTransformation = wpAppAnimator.transformation;