From cc9a63dbc2b5569ef65ec3a04d86dbdfdee3f134 Mon Sep 17 00:00:00 2001 From: Mike Lockwood Date: Tue, 10 Nov 2009 07:50:28 -0500 Subject: [PATCH] Add support for specifying the current LCD brightness mode to the backlight driver. This allows the driver to behave differently depending on if the lighting is being managed by the light sensor or by a user preference. Change-Id: I4b9325f82b7aded0ce5cfc6c07658666bbdae331 Signed-off-by: Mike Lockwood --- .../com/android/server/HardwareService.java | 28 +++++++---- .../android/server/PowerManagerService.java | 47 ++++++++++++++----- .../com_android_server_HardwareService.cpp | 5 +- 3 files changed, 58 insertions(+), 22 deletions(-) diff --git a/services/java/com/android/server/HardwareService.java b/services/java/com/android/server/HardwareService.java index 3e3cf065bedba..88074c2c59eab 100755 --- a/services/java/com/android/server/HardwareService.java +++ b/services/java/com/android/server/HardwareService.java @@ -54,6 +54,16 @@ public class HardwareService extends IHardwareService.Stub { static final int LIGHT_FLASH_TIMED = 1; static final int LIGHT_FLASH_HARDWARE = 2; + /** + * Light brightness is managed by a user setting. + */ + static final int BRIGHTNESS_MODE_USER = 0; + + /** + * Light brightness is managed by a light sensor. + */ + static final int BRIGHTNESS_MODE_SENSOR = 1; + private final LinkedList mVibrations; private Vibration mCurrentVibration; @@ -266,21 +276,21 @@ public class HardwareService extends IHardwareService.Stub { } void setLightOff_UNCHECKED(int light) { - setLight_native(mNativePointer, light, 0, LIGHT_FLASH_NONE, 0, 0); + setLight_native(mNativePointer, light, 0, LIGHT_FLASH_NONE, 0, 0, 0); } - void setLightBrightness_UNCHECKED(int light, int brightness) { + void setLightBrightness_UNCHECKED(int light, int brightness, int brightnessMode) { int b = brightness & 0x000000ff; b = 0xff000000 | (b << 16) | (b << 8) | b; - setLight_native(mNativePointer, light, b, LIGHT_FLASH_NONE, 0, 0); + setLight_native(mNativePointer, light, b, LIGHT_FLASH_NONE, 0, 0, brightnessMode); } void setLightColor_UNCHECKED(int light, int color) { - setLight_native(mNativePointer, light, color, LIGHT_FLASH_NONE, 0, 0); + setLight_native(mNativePointer, light, color, LIGHT_FLASH_NONE, 0, 0, 0); } void setLightFlashing_UNCHECKED(int light, int color, int mode, int onMS, int offMS) { - setLight_native(mNativePointer, light, color, mode, onMS, offMS); + setLight_native(mNativePointer, light, color, mode, onMS, offMS, 0); } public void setAttentionLight(boolean on, int color) { @@ -289,7 +299,7 @@ public class HardwareService extends IHardwareService.Stub { mAttentionLightOn = on; mPulsing = false; setLight_native(mNativePointer, LIGHT_ID_ATTENTION, color, - LIGHT_FLASH_HARDWARE, on ? 3 : 0, 0); + LIGHT_FLASH_HARDWARE, on ? 3 : 0, 0, 0); } } @@ -304,7 +314,7 @@ public class HardwareService extends IHardwareService.Stub { if (!mAttentionLightOn && !mPulsing) { mPulsing = true; setLight_native(mNativePointer, LIGHT_ID_ATTENTION, 0x00ffffff, - LIGHT_FLASH_HARDWARE, 7, 0); + LIGHT_FLASH_HARDWARE, 7, 0, 0); mH.sendMessageDelayed(Message.obtain(mH, 1), 3000); } } @@ -321,7 +331,7 @@ public class HardwareService extends IHardwareService.Stub { mPulsing = false; setLight_native(mNativePointer, LIGHT_ID_ATTENTION, mAttentionLightOn ? 0xffffffff : 0, - LIGHT_FLASH_NONE, 0, 0); + LIGHT_FLASH_NONE, 0, 0, 0); } } } @@ -484,7 +494,7 @@ public class HardwareService extends IHardwareService.Stub { private static native void finalize_native(int ptr); private static native void setLight_native(int ptr, int light, int color, int mode, - int onMS, int offMS); + int onMS, int offMS, int brightnessMode); private final Context mContext; private final PowerManager.WakeLock mWakeLock; diff --git a/services/java/com/android/server/PowerManagerService.java b/services/java/com/android/server/PowerManagerService.java index 3000e9d4e4ee3..e1425d444c345 100644 --- a/services/java/com/android/server/PowerManagerService.java +++ b/services/java/com/android/server/PowerManagerService.java @@ -1324,8 +1324,13 @@ class PowerManagerService extends IPowerManager.Stub enableLightSensor(on); if (!on) { // make sure button and key backlights are off too - mHardware.setLightBrightness_UNCHECKED(HardwareService.LIGHT_ID_BUTTONS, 0); - mHardware.setLightBrightness_UNCHECKED(HardwareService.LIGHT_ID_KEYBOARD, 0); + int brightnessMode = (mUseSoftwareAutoBrightness + ? HardwareService.BRIGHTNESS_MODE_SENSOR + : HardwareService.BRIGHTNESS_MODE_USER); + mHardware.setLightBrightness_UNCHECKED(HardwareService.LIGHT_ID_BUTTONS, 0, + brightnessMode); + mHardware.setLightBrightness_UNCHECKED(HardwareService.LIGHT_ID_KEYBOARD, 0, + brightnessMode); // clear current value so we will update based on the new conditions // when the sensor is reenabled. mLightSensorValue = -1; @@ -1680,14 +1685,23 @@ class PowerManagerService extends IPowerManager.Stub } private void setLightBrightness(int mask, int value) { + int brightnessMode = (mAutoBrightessEnabled + ? HardwareService.BRIGHTNESS_MODE_SENSOR + : HardwareService.BRIGHTNESS_MODE_USER); if ((mask & SCREEN_BRIGHT_BIT) != 0) { - mHardware.setLightBrightness_UNCHECKED(HardwareService.LIGHT_ID_BACKLIGHT, value); + mHardware.setLightBrightness_UNCHECKED(HardwareService.LIGHT_ID_BACKLIGHT, value, + brightnessMode); } + brightnessMode = (mUseSoftwareAutoBrightness + ? HardwareService.BRIGHTNESS_MODE_SENSOR + : HardwareService.BRIGHTNESS_MODE_USER); if ((mask & BUTTON_BRIGHT_BIT) != 0) { - mHardware.setLightBrightness_UNCHECKED(HardwareService.LIGHT_ID_BUTTONS, value); + mHardware.setLightBrightness_UNCHECKED(HardwareService.LIGHT_ID_BUTTONS, value, + brightnessMode); } if ((mask & KEYBOARD_BRIGHT_BIT) != 0) { - mHardware.setLightBrightness_UNCHECKED(HardwareService.LIGHT_ID_KEYBOARD, value); + mHardware.setLightBrightness_UNCHECKED(HardwareService.LIGHT_ID_KEYBOARD, value, + brightnessMode); } } @@ -1986,8 +2000,11 @@ class PowerManagerService extends IPowerManager.Stub startAnimation = true; } } else { + int brightnessMode = (mAutoBrightessEnabled + ? HardwareService.BRIGHTNESS_MODE_SENSOR + : HardwareService.BRIGHTNESS_MODE_USER); mHardware.setLightBrightness_UNCHECKED(HardwareService.LIGHT_ID_BACKLIGHT, - lcdValue); + lcdValue, brightnessMode); } } if (ANIMATE_BUTTON_LIGHTS) { @@ -1997,8 +2014,11 @@ class PowerManagerService extends IPowerManager.Stub startAnimation = true; } } else { + int brightnessMode = (mUseSoftwareAutoBrightness + ? HardwareService.BRIGHTNESS_MODE_SENSOR + : HardwareService.BRIGHTNESS_MODE_USER); mHardware.setLightBrightness_UNCHECKED(HardwareService.LIGHT_ID_BUTTONS, - buttonValue); + buttonValue, brightnessMode); } if (ANIMATE_KEYBOARD_LIGHTS) { if (mKeyboardBrightness.setTargetLocked(keyboardValue, @@ -2007,8 +2027,11 @@ class PowerManagerService extends IPowerManager.Stub startAnimation = true; } } else { + int brightnessMode = (mUseSoftwareAutoBrightness + ? HardwareService.BRIGHTNESS_MODE_SENSOR + : HardwareService.BRIGHTNESS_MODE_USER); mHardware.setLightBrightness_UNCHECKED(HardwareService.LIGHT_ID_KEYBOARD, - keyboardValue); + keyboardValue, brightnessMode); } if (startAnimation) { if (mDebugLightSensor) { @@ -2329,10 +2352,12 @@ class PowerManagerService extends IPowerManager.Stub mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER, null); // Don't let applications turn the screen all the way off brightness = Math.max(brightness, Power.BRIGHTNESS_DIM); - mHardware.setLightBrightness_UNCHECKED(HardwareService.LIGHT_ID_BACKLIGHT, brightness); + mHardware.setLightBrightness_UNCHECKED(HardwareService.LIGHT_ID_BACKLIGHT, brightness, + HardwareService.BRIGHTNESS_MODE_USER); mHardware.setLightBrightness_UNCHECKED(HardwareService.LIGHT_ID_KEYBOARD, - (mKeyboardVisible ? brightness : 0)); - mHardware.setLightBrightness_UNCHECKED(HardwareService.LIGHT_ID_BUTTONS, brightness); + (mKeyboardVisible ? brightness : 0), HardwareService.BRIGHTNESS_MODE_USER); + mHardware.setLightBrightness_UNCHECKED(HardwareService.LIGHT_ID_BUTTONS, brightness, + HardwareService.BRIGHTNESS_MODE_USER); long identity = Binder.clearCallingIdentity(); try { mBatteryStats.noteScreenBrightness(brightness); diff --git a/services/jni/com_android_server_HardwareService.cpp b/services/jni/com_android_server_HardwareService.cpp index 22d4bd8766e89..253e6558de36f 100644 --- a/services/jni/com_android_server_HardwareService.cpp +++ b/services/jni/com_android_server_HardwareService.cpp @@ -101,7 +101,7 @@ static void finalize_native(JNIEnv *env, jobject clazz, int ptr) } static void setLight_native(JNIEnv *env, jobject clazz, int ptr, - int light, int colorARGB, int flashMode, int onMS, int offMS) + int light, int colorARGB, int flashMode, int onMS, int offMS, int brightnessMode) { Devices* devices = (Devices*)ptr; light_state_t state; @@ -115,6 +115,7 @@ static void setLight_native(JNIEnv *env, jobject clazz, int ptr, state.flashMode = flashMode; state.flashOnMS = onMS; state.flashOffMS = offMS; + state.brightnessMode = brightnessMode; devices->lights[light]->set_light(devices->lights[light], &state); } @@ -134,7 +135,7 @@ static void vibratorOff(JNIEnv *env, jobject clazz) static JNINativeMethod method_table[] = { { "init_native", "()I", (void*)init_native }, { "finalize_native", "(I)V", (void*)finalize_native }, - { "setLight_native", "(IIIIII)V", (void*)setLight_native }, + { "setLight_native", "(IIIIIII)V", (void*)setLight_native }, { "vibratorOn", "(J)V", (void*)vibratorOn }, { "vibratorOff", "()V", (void*)vibratorOff } };