From acafd19c5ea05a8d465f97204f8d63468bdaa2a4 Mon Sep 17 00:00:00 2001 From: Craig Mautner Date: Thu, 10 May 2012 10:41:02 -0700 Subject: [PATCH] Update DimAnimator layer when its window changes. Prior to this fix once dimming had been turned on it stayed at the same layer and associated with the same window until it was turned off. Now the DimAnimator layer is updated if either the window layer changes or the dimming window changes. Fixes bug 6467865. Change-Id: I3e1765b92b51be26e3718c8a87e2583041a36af9 --- .../com/android/server/wm/WindowAnimator.java | 4 +++ .../server/wm/WindowManagerService.java | 33 ++++++++++++++----- 2 files changed, 28 insertions(+), 9 deletions(-) diff --git a/services/java/com/android/server/wm/WindowAnimator.java b/services/java/com/android/server/wm/WindowAnimator.java index 55365597eb8ea..bc84d3cb17dfe 100644 --- a/services/java/com/android/server/wm/WindowAnimator.java +++ b/services/java/com/android/server/wm/WindowAnimator.java @@ -548,6 +548,10 @@ public class WindowAnimator { return mDimParams != null; } + boolean isDimming(final WindowStateAnimator winAnimator) { + return mDimParams != null && mDimParams.mDimWinAnimator == winAnimator; + } + public void dump(PrintWriter pw, String prefix, boolean dumpAll) { if (mWindowDetachedWallpaper != null) { pw.print(" mWindowDetachedWallpaper="); pw.println(mWindowDetachedWallpaper); diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java index 8957edfd6af7a..2fcd05c3d8e8e 100755 --- a/services/java/com/android/server/wm/WindowManagerService.java +++ b/services/java/com/android/server/wm/WindowManagerService.java @@ -7510,7 +7510,10 @@ public class WindowManagerService extends IWindowManager.Stub } for (i=0; i 0 && w.mIsWallpaper)) { curLayer += WINDOW_LAYER_MULTIPLIER; @@ -7519,22 +7522,33 @@ public class WindowManagerService extends IWindowManager.Stub curBaseLayer = curLayer = w.mBaseLayer; w.mLayer = curLayer; } + if (w.mLayer != oldLayer) { + layerChanged = true; + } + oldLayer = winAnimator.mAnimLayer; if (w.mTargetAppToken != null) { - w.mWinAnimator.mAnimLayer = + winAnimator.mAnimLayer = w.mLayer + w.mTargetAppToken.mAppAnimator.animLayerAdjustment; } else if (w.mAppToken != null) { - w.mWinAnimator.mAnimLayer = + winAnimator.mAnimLayer = w.mLayer + w.mAppToken.mAppAnimator.animLayerAdjustment; } else { - w.mWinAnimator.mAnimLayer = w.mLayer; + winAnimator.mAnimLayer = w.mLayer; } if (w.mIsImWindow) { - w.mWinAnimator.mAnimLayer += mInputMethodAnimLayerAdjustment; + winAnimator.mAnimLayer += mInputMethodAnimLayerAdjustment; } else if (w.mIsWallpaper) { - w.mWinAnimator.mAnimLayer += mWallpaperAnimLayerAdjustment; + winAnimator.mAnimLayer += mWallpaperAnimLayerAdjustment; + } + if (winAnimator.mAnimLayer != oldLayer) { + layerChanged = true; + } + if (layerChanged && mAnimator.isDimming(winAnimator)) { + // Force an animation pass just to update the mDimAnimator layer. + scheduleAnimationLocked(); } if (DEBUG_LAYERS) Slog.v(TAG, "Assign layer " + w + ": " - + w.mWinAnimator.mAnimLayer); + + winAnimator.mAnimLayer); //System.out.println( // "Assigned layer " + curLayer + " to " + w.mClient.asBinder()); } @@ -8237,7 +8251,8 @@ public class WindowManagerService extends IWindowManager.Stub if (!mInnerFields.mDimming) { //Slog.i(TAG, "DIM BEHIND: " + w); mInnerFields.mDimming = true; - if (!mAnimator.isDimming()) { + final WindowStateAnimator winAnimator = w.mWinAnimator; + if (!mAnimator.isDimming(winAnimator)) { final int width, height; if (attrs.type == WindowManager.LayoutParams.TYPE_BOOT_PROGRESS) { width = mCurDisplayWidth; @@ -8246,7 +8261,7 @@ public class WindowManagerService extends IWindowManager.Stub width = innerDw; height = innerDh; } - mAnimator.startDimming(w.mWinAnimator, w.mExiting ? 0 : w.mAttrs.dimAmount, + mAnimator.startDimming(winAnimator, w.mExiting ? 0 : w.mAttrs.dimAmount, width, height); } }