diff --git a/core/java/android/os/IHardwareService.aidl b/core/java/android/os/IHardwareService.aidl
index aebcb3c049fc6..a6ef64739434b 100755
--- a/core/java/android/os/IHardwareService.aidl
+++ b/core/java/android/os/IHardwareService.aidl
@@ -32,6 +32,9 @@ interface IHardwareService
// sets the brightness of the backlights (screen, keyboard, button) 0-255
void setBacklights(int brightness);
+ // enables or disables automatic brightness mode
+ void setAutoBrightness(boolean on);
+
// for the phone
void setAttentionLight(boolean on);
}
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 688f37720541b..0bbd1fc57f209 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -1060,6 +1060,12 @@ public final class Settings {
*/
public static final String SCREEN_BRIGHTNESS = "screen_brightness";
+ /**
+ * Control whether to enable automatic brightness mode.
+ * @hide
+ */
+ public static final String SCREEN_BRIGHTNESS_MODE = "screen_brightness_mode";
+
/**
* Control whether the process CPU usage meter should be shown.
*/
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index abb575c7d9d0c..117e1398e6ea9 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -81,4 +81,6 @@
- 30
+
+ false
diff --git a/packages/SettingsProvider/res/values/defaults.xml b/packages/SettingsProvider/res/values/defaults.xml
index 6b2044590e432..d5f1c614192fe 100644
--- a/packages/SettingsProvider/res/values/defaults.xml
+++ b/packages/SettingsProvider/res/values/defaults.xml
@@ -27,6 +27,7 @@
true
102
+ false
100%
0%
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
index 2524a305b9736..f99eb5859d68d 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
@@ -71,7 +71,7 @@ public class DatabaseHelper extends SQLiteOpenHelper {
// database gets upgraded properly. At a minimum, please confirm that 'upgradeVersion'
// is properly propagated through your change. Not doing so will result in a loss of user
// settings.
- private static final int DATABASE_VERSION = 39;
+ private static final int DATABASE_VERSION = 40;
private Context mContext;
@@ -465,6 +465,22 @@ public class DatabaseHelper extends SQLiteOpenHelper {
upgradeVersion = 39;
}
+ if (upgradeVersion == 39) {
+ db.beginTransaction();
+ try {
+ String value =
+ mContext.getResources().getBoolean(
+ R.bool.def_screen_brightness_automatic_mode) ? "1" : "0";
+ db.execSQL("INSERT OR IGNORE INTO system(name,value) values('" +
+ Settings.System.SCREEN_BRIGHTNESS_MODE + "','" + value + "');");
+ db.setTransactionSuccessful();
+ } finally {
+ db.endTransaction();
+ }
+
+ upgradeVersion = 40;
+ }
+
if (upgradeVersion != currentVersion) {
Log.w(TAG, "Got stuck trying to upgrade from version " + upgradeVersion
+ ", must wipe the settings provider");
@@ -701,6 +717,9 @@ public class DatabaseHelper extends SQLiteOpenHelper {
loadIntegerSetting(stmt, Settings.System.SCREEN_BRIGHTNESS,
R.integer.def_screen_brightness);
+ loadBooleanSetting(stmt, Settings.System.SCREEN_BRIGHTNESS_MODE,
+ R.bool.def_screen_brightness_automatic_mode);
+
loadDefaultAnimationSettings(stmt);
loadBooleanSetting(stmt, Settings.System.ACCELEROMETER_ROTATION,
diff --git a/services/java/com/android/server/HardwareService.java b/services/java/com/android/server/HardwareService.java
index 6ac72e0d57c81..01daae344197f 100755
--- a/services/java/com/android/server/HardwareService.java
+++ b/services/java/com/android/server/HardwareService.java
@@ -59,6 +59,8 @@ public class HardwareService extends IHardwareService.Stub {
private boolean mAttentionLightOn;
private boolean mPulsing;
+ private boolean mAutoBrightnessAvailable;
+
private class Vibration implements IBinder.DeathRecipient {
private final IBinder mToken;
private final long mTimeout;
@@ -129,6 +131,9 @@ public class HardwareService extends IHardwareService.Stub {
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_SCREEN_OFF);
context.registerReceiver(mIntentReceiver, filter);
+
+ mAutoBrightnessAvailable = context.getResources().getBoolean(
+ com.android.internal.R.bool.config_automatic_brightness_available);
}
protected void finalize() throws Throwable {
@@ -302,6 +307,20 @@ public class HardwareService extends IHardwareService.Stub {
setLight_native(mNativePointer, light, color, mode, onMS, offMS);
}
+ public void setAutoBrightness(boolean on) {
+ if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.HARDWARE_TEST)
+ != PackageManager.PERMISSION_GRANTED) {
+ throw new SecurityException("Requires HARDWARE_TEST permission");
+ }
+ setAutoBrightness_UNCHECKED(on);
+ }
+
+ void setAutoBrightness_UNCHECKED(boolean on) {
+ if (mAutoBrightnessAvailable) {
+ setAutoBrightness_native(mNativePointer, on);
+ }
+ }
+
public void setAttentionLight(boolean on) {
// Not worthy of a permission. We shouldn't have a flashlight permission.
synchronized (this) {
@@ -502,6 +521,7 @@ public class HardwareService extends IHardwareService.Stub {
private static native int init_native();
private static native void finalize_native(int ptr);
+ private static native void setAutoBrightness_native(int ptr, boolean automatic);
private static native void setLight_native(int ptr, int light, int color, int mode,
int onMS, int offMS);
diff --git a/services/java/com/android/server/PowerManagerService.java b/services/java/com/android/server/PowerManagerService.java
index ba65f01ef6862..e64a1def0f36c 100644
--- a/services/java/com/android/server/PowerManagerService.java
+++ b/services/java/com/android/server/PowerManagerService.java
@@ -52,6 +52,7 @@ import android.util.Log;
import android.view.WindowManagerPolicy;
import static android.provider.Settings.System.DIM_SCREEN;
import static android.provider.Settings.System.SCREEN_BRIGHTNESS;
+import static android.provider.Settings.System.SCREEN_BRIGHTNESS_MODE;
import static android.provider.Settings.System.SCREEN_OFF_TIMEOUT;
import static android.provider.Settings.System.STAY_ON_WHILE_PLUGGED_IN;
@@ -442,7 +443,11 @@ class PowerManagerService extends IPowerManager.Stub
// turn everything on
setPowerState(ALL_BRIGHT);
-
+
+ // set auto brightness mode to user setting
+ boolean brightnessMode = Settings.System.getInt(resolver, SCREEN_BRIGHTNESS_MODE, 1) != 0;
+ mHardware.setAutoBrightness_UNCHECKED(brightnessMode);
+
synchronized (mHandlerThread) {
mInitComplete = true;
mHandlerThread.notifyAll();
diff --git a/services/jni/com_android_server_HardwareService.cpp b/services/jni/com_android_server_HardwareService.cpp
index 22d4bd8766e89..a17e29fbf60d5 100644
--- a/services/jni/com_android_server_HardwareService.cpp
+++ b/services/jni/com_android_server_HardwareService.cpp
@@ -100,6 +100,18 @@ static void finalize_native(JNIEnv *env, jobject clazz, int ptr)
free(devices);
}
+static void setAutoBrightness_native(JNIEnv *env, jobject clazz, int ptr,
+ jboolean automatic)
+{
+ Devices* devices = (Devices*)ptr;
+
+ if (devices->lights[LIGHT_INDEX_BACKLIGHT] == NULL) {
+ return;
+ }
+
+ devices->lights[LIGHT_INDEX_BACKLIGHT]->set_als_mode(automatic ? 0 : 1);
+}
+
static void setLight_native(JNIEnv *env, jobject clazz, int ptr,
int light, int colorARGB, int flashMode, int onMS, int offMS)
{
@@ -134,6 +146,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 },
+ { "setAutoBrightness_native", "(IZ)V", (void*)setAutoBrightness_native },
{ "setLight_native", "(IIIIII)V", (void*)setLight_native },
{ "vibratorOn", "(J)V", (void*)vibratorOn },
{ "vibratorOff", "()V", (void*)vibratorOff }