OSDN Git Service

Improve the power off fade animation.
authorJeff Brown <jeffbrown@google.com>
Mon, 8 Oct 2012 23:21:01 +0000 (16:21 -0700)
committerJeff Brown <jeffbrown@google.com>
Mon, 8 Oct 2012 23:21:01 +0000 (16:21 -0700)
Fixes an issue where the dim surface alpha was not actually being
animated like it was supposed to.

Bug: 7224614
Change-Id: Iffd54367ca97ae7fd4b9603807f4e036750442b2

services/java/com/android/server/power/DisplayPowerController.java
services/java/com/android/server/power/ElectronBeam.java

index 25d2944..82c3617 100644 (file)
@@ -206,11 +206,9 @@ final class DisplayPowerController {
     // May be 0 if no warm-up is required.
     private int mLightSensorWarmUpTimeConfig;
 
-    // True if we should animate the backlight when turning the screen on or off, which
-    // tends to be efficient for LCD displays but not for OLED displays.
-    // False if we should play the electron beam animation instead, which is better for
-    // OLED displays.
-    private boolean mElectronBeamAnimatesBacklightConfig;
+    // True if we should fade the screen while turning it off, false if we should play
+    // a stylish electron beam animation instead.
+    private boolean mElectronBeamFadesConfig;
 
     // The pending power request.
     // Initially null until the first call to requestPowerState.
@@ -396,7 +394,7 @@ final class DisplayPowerController {
         mScreenBrightnessRangeMinimum = clampAbsoluteBrightness(screenBrightnessMinimum);
         mScreenBrightnessRangeMaximum = PowerManager.BRIGHTNESS_ON;
 
-        mElectronBeamAnimatesBacklightConfig = resources.getBoolean(
+        mElectronBeamFadesConfig = resources.getBoolean(
                 com.android.internal.R.bool.config_animateScreenLights);
 
         if (!DEBUG_PRETEND_PROXIMITY_SENSOR_ABSENT) {
@@ -682,8 +680,8 @@ final class DisplayPowerController {
                                 if (mPowerState.getElectronBeamLevel() == 1.0f) {
                                     mPowerState.dismissElectronBeam();
                                 } else if (mPowerState.prepareElectronBeam(
-                                        mElectronBeamAnimatesBacklightConfig ?
-                                                ElectronBeam.MODE_BLANK :
+                                        mElectronBeamFadesConfig ?
+                                                ElectronBeam.MODE_FADE :
                                                         ElectronBeam.MODE_WARM_UP)) {
                                     mElectronBeamOnAnimator.start();
                                 } else {
@@ -704,8 +702,8 @@ final class DisplayPowerController {
                         if (mPowerState.getElectronBeamLevel() == 0.0f) {
                             setScreenOn(false);
                         } else if (mPowerState.prepareElectronBeam(
-                                mElectronBeamAnimatesBacklightConfig ?
-                                        ElectronBeam.MODE_BLANK :
+                                mElectronBeamFadesConfig ?
+                                        ElectronBeam.MODE_FADE :
                                                 ElectronBeam.MODE_COOL_DOWN)
                                 && mPowerState.isScreenOn()) {
                             mElectronBeamOffAnimator.start();
index 8c242f7..6a567ba 100644 (file)
@@ -80,6 +80,7 @@ final class ElectronBeam {
     private EGLContext mEglContext;
     private EGLSurface mEglSurface;
     private boolean mSurfaceVisible;
+    private float mSurfaceAlpha;
 
     // Texture names.  We only use one texture, which contains the screenshot.
     private final int[] mTexNames = new int[1];
@@ -90,9 +91,20 @@ final class ElectronBeam {
     private final FloatBuffer mVertexBuffer = createNativeFloatBuffer(8);
     private final FloatBuffer mTexCoordBuffer = createNativeFloatBuffer(8);
 
+    /**
+     * Animates an electron beam warming up.
+     */
     public static final int MODE_WARM_UP = 0;
+
+    /**
+     * Animates an electron beam shutting off.
+     */
     public static final int MODE_COOL_DOWN = 1;
-    public static final int MODE_BLANK = 2;
+
+    /**
+     * Animates a simple dim layer to fade the contents of the screen in or out progressively.
+     */
+    public static final int MODE_FADE = 2;
 
     public ElectronBeam(Display display) {
         mDisplay = display;
@@ -138,7 +150,7 @@ final class ElectronBeam {
 
     private boolean tryPrepare() {
         if (createSurface()) {
-            if (mMode == MODE_BLANK) {
+            if (mMode == MODE_FADE) {
                 return true;
             }
             return createEglContext()
@@ -182,7 +194,7 @@ final class ElectronBeam {
             return false;
         }
 
-        if (mMode == MODE_BLANK) {
+        if (mMode == MODE_FADE) {
             return showSurface(1.0f - level);
         }
 
@@ -504,7 +516,7 @@ final class ElectronBeam {
             if (mSurface == null) {
                 try {
                     int flags;
-                    if (mMode == MODE_BLANK) {
+                    if (mMode == MODE_FADE) {
                         flags = Surface.FX_SURFACE_DIM | Surface.HIDDEN;
                     } else {
                         flags = Surface.OPAQUE | Surface.HIDDEN;
@@ -579,11 +591,12 @@ final class ElectronBeam {
             }
             mSurface = null;
             mSurfaceVisible = false;
+            mSurfaceAlpha = 0f;
         }
     }
 
     private boolean showSurface(float alpha) {
-        if (!mSurfaceVisible) {
+        if (!mSurfaceVisible || mSurfaceAlpha != alpha) {
             Surface.openTransaction();
             try {
                 mSurface.setLayer(ELECTRON_BEAM_LAYER);
@@ -593,6 +606,7 @@ final class ElectronBeam {
                 Surface.closeTransaction();
             }
             mSurfaceVisible = true;
+            mSurfaceAlpha = alpha;
         }
         return true;
     }
@@ -683,5 +697,6 @@ final class ElectronBeam {
         pw.println("  mDisplayWidth=" + mDisplayWidth);
         pw.println("  mDisplayHeight=" + mDisplayHeight);
         pw.println("  mSurfaceVisible=" + mSurfaceVisible);
+        pw.println("  mSurfaceAlpha=" + mSurfaceAlpha);
     }
 }