From 3d3db601cdcb884ed8179cd3fd855454ea6bafac Mon Sep 17 00:00:00 2001 From: Joe Onorato Date: Mon, 18 Oct 2010 16:08:16 -0400 Subject: [PATCH] Pressing the power button quickly needs to turn the screen on and off correctly. This does the animation with the power manager lock held, which isn't great, but is safe. Bug: 3102208 Change-Id: Ib0af3fab1cf6ba47053c10ae8b701376d63802ff --- .../android/server/PowerManagerService.java | 43 +++++++++---------- 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/services/java/com/android/server/PowerManagerService.java b/services/java/com/android/server/PowerManagerService.java index b90b4bf704910..638bd45d105d6 100644 --- a/services/java/com/android/server/PowerManagerService.java +++ b/services/java/com/android/server/PowerManagerService.java @@ -1971,8 +1971,8 @@ class PowerManagerService extends IPowerManager.Stub / stepsToTarget; if (mSpew) { String noticeMe = nominalCurrentValue == curValue ? "" : " ******************"; - Slog.i(TAG, "Setting target " + mask + ": cur=" + curValue - + " target=" + targetValue + " delta=" + delta + Slog.i(TAG, "setTargetLocked mask=" + mask + " curValue=" + curValue + + " target=" + target + " targetValue=" + targetValue + " delta=" + delta + " nominalCurrentValue=" + nominalCurrentValue + noticeMe); } @@ -2010,20 +2010,20 @@ class PowerManagerService extends IPowerManager.Stub } if (mSpew) Slog.d(TAG, "Animating curIntValue=" + curIntValue + ": " + mask); setLightBrightness(mask, curIntValue); - finishAnimation(more, curIntValue); + finishAnimationLocked(more, curIntValue); return more; } - void jumpToTarget() { - if (mSpew) Slog.d(TAG, "jumpToTarget targetValue=" + targetValue + ": " + mask); + void jumpToTargetLocked() { + if (mSpew) Slog.d(TAG, "jumpToTargetLocked targetValue=" + targetValue + ": " + mask); setLightBrightness(mask, targetValue); final int tv = targetValue; curValue = tv; targetValue = -1; - finishAnimation(false, tv); + finishAnimationLocked(false, tv); } - private void finishAnimation(boolean more, int curIntValue) { + private void finishAnimationLocked(boolean more, int curIntValue) { animating = more; if (!more) { if (mask == SCREEN_BRIGHT_BIT && curIntValue == Power.BRIGHTNESS_OFF) { @@ -2042,21 +2042,18 @@ class PowerManagerService extends IPowerManager.Stub } } } else { - boolean animate; - boolean jump; synchronized (mLocks) { - jump = animating; // we haven't already run this animation - animate = jump && targetValue == Power.BRIGHTNESS_OFF; // we're turning off + // we're turning off + final boolean animate = animating && targetValue == Power.BRIGHTNESS_OFF; + if (animate) { + // It's pretty scary to hold mLocks for this long, and we should + // redesign this, but it works for now. + nativeStartSurfaceFlingerAnimation( + mScreenOffReason == WindowManagerPolicy.OFF_BECAUSE_OF_PROX_SENSOR + ? 0 : mAnimationSetting); + } + mScreenBrightness.jumpToTargetLocked(); } - if (animate) { - // TODO: I think it's possible that if you sleep & wake multiple times - // quickly for different reasons, mScreenOffReason for the first animation - // might get stomped on as it starts the second animation. - nativeStartSurfaceFlingerAnimation( - mScreenOffReason == WindowManagerPolicy.OFF_BECAUSE_OF_PROX_SENSOR - ? 0 : mAnimationSetting); - } - mScreenBrightness.jumpToTarget(); } } } @@ -2785,8 +2782,10 @@ class PowerManagerService extends IPowerManager.Stub } // update our animation state - mScreenBrightness.targetValue = brightness; - mScreenBrightness.jumpToTarget(); + synchronized (mLocks) { + mScreenBrightness.targetValue = brightness; + mScreenBrightness.jumpToTargetLocked(); + } } }