summaryrefslogtreecommitdiffstats
path: root/services/java/com/android/server/PowerManagerService.java
diff options
context:
space:
mode:
Diffstat (limited to 'services/java/com/android/server/PowerManagerService.java')
-rw-r--r--services/java/com/android/server/PowerManagerService.java172
1 files changed, 119 insertions, 53 deletions
diff --git a/services/java/com/android/server/PowerManagerService.java b/services/java/com/android/server/PowerManagerService.java
index e1bea37..99e008c 100644
--- a/services/java/com/android/server/PowerManagerService.java
+++ b/services/java/com/android/server/PowerManagerService.java
@@ -53,6 +53,7 @@ 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_BRIGHTNESS_MODE_AUTOMATIC;
import static android.provider.Settings.System.SCREEN_OFF_TIMEOUT;
import static android.provider.Settings.System.STAY_ON_WHILE_PLUGGED_IN;
@@ -64,7 +65,7 @@ import java.util.Observable;
import java.util.Observer;
class PowerManagerService extends IPowerManager.Stub
- implements LocalPowerManager, Watchdog.Monitor, SensorEventListener {
+ implements LocalPowerManager, Watchdog.Monitor {
private static final String TAG = "PowerManagerService";
static final String PARTIAL_NAME = "PowerManagerService";
@@ -189,6 +190,9 @@ class PowerManagerService extends IPowerManager.Stub
private BatteryService mBatteryService;
private SensorManager mSensorManager;
private Sensor mProximitySensor;
+ private Sensor mLightSensor;
+ private boolean mLightSensorEnabled;
+ private float mLightSensorValue = -1;
private boolean mDimScreen = true;
private long mNextTimeout;
private volatile int mPokey = 0;
@@ -199,6 +203,8 @@ class PowerManagerService extends IPowerManager.Stub
private long mScreenOnStartTime;
private boolean mPreventScreenOn;
private int mScreenBrightnessOverride = -1;
+ private boolean mHasHardwareAutoBrightness;
+ private boolean mAutoBrightessEnabled;
// Used when logging number and duration of touch-down cycles
private long mTotalTouchDownTime;
@@ -207,6 +213,7 @@ class PowerManagerService extends IPowerManager.Stub
// could be either static or controllable at runtime
private static final boolean mSpew = false;
+ private static final boolean mDebugLightSensor = false;
/*
static PrintStream mLog;
@@ -344,6 +351,9 @@ class PowerManagerService extends IPowerManager.Stub
// DIM_SCREEN
//mDimScreen = getInt(DIM_SCREEN) != 0;
+ // SCREEN_BRIGHTNESS_MODE
+ setScreenBrightnessMode(getInt(SCREEN_BRIGHTNESS_MODE));
+
// recalculate everything
setScreenOffTimeoutsLocked();
}
@@ -415,12 +425,17 @@ class PowerManagerService extends IPowerManager.Stub
mScreenOffIntent = new Intent(Intent.ACTION_SCREEN_OFF);
mScreenOffIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
- ContentResolver resolver = mContext.getContentResolver();
+ mHasHardwareAutoBrightness = mContext.getResources().getBoolean(
+ com.android.internal.R.bool.config_hardware_automatic_brightness_available);
+
+ ContentResolver resolver = mContext.getContentResolver();
Cursor settingsCursor = resolver.query(Settings.System.CONTENT_URI, null,
"(" + Settings.System.NAME + "=?) or ("
+ Settings.System.NAME + "=?) or ("
+ + Settings.System.NAME + "=?) or ("
+ Settings.System.NAME + "=?)",
- new String[]{STAY_ON_WHILE_PLUGGED_IN, SCREEN_OFF_TIMEOUT, DIM_SCREEN},
+ new String[]{STAY_ON_WHILE_PLUGGED_IN, SCREEN_OFF_TIMEOUT, DIM_SCREEN,
+ SCREEN_BRIGHTNESS_MODE},
null);
mSettings = new ContentQueryMap(settingsCursor, Settings.System.NAME, true, mHandler);
SettingsObserver settingsObserver = new SettingsObserver();
@@ -444,10 +459,6 @@ 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();
@@ -1164,7 +1175,7 @@ class PowerManagerService extends IPowerManager.Stub
// Finally, set the flag that prevents the screen from turning on.
// (Below, in setPowerState(), we'll check mPreventScreenOn and
- // we *won't* call Power.setScreenState(true) if it's set.)
+ // we *won't* call setScreenStateLocked(true) if it's set.)
mPreventScreenOn = true;
} else {
// (Re)enable the screen.
@@ -1182,9 +1193,9 @@ class PowerManagerService extends IPowerManager.Stub
Log.d(TAG,
"preventScreenOn: turning on after a prior preventScreenOn(true)!");
}
- int err = Power.setScreenState(true);
+ int err = setScreenStateLocked(true);
if (err != 0) {
- Log.w(TAG, "preventScreenOn: error from Power.setScreenState(): " + err);
+ Log.w(TAG, "preventScreenOn: error from setScreenStateLocked(): " + err);
}
}
@@ -1239,6 +1250,14 @@ class PowerManagerService extends IPowerManager.Stub
}
};
+ private int setScreenStateLocked(boolean on) {
+ int err = Power.setScreenState(on);
+ if (err == 0) {
+ enableLightSensor(on && mAutoBrightessEnabled);
+ }
+ return err;
+ }
+
private void setPowerState(int state)
{
setPowerState(state, false, false);
@@ -1327,7 +1346,7 @@ class PowerManagerService extends IPowerManager.Stub
reallyTurnScreenOn = false;
}
if (reallyTurnScreenOn) {
- err = Power.setScreenState(true);
+ err = setScreenStateLocked(true);
long identity = Binder.clearCallingIdentity();
try {
mBatteryStats.noteScreenBrightness(
@@ -1339,7 +1358,7 @@ class PowerManagerService extends IPowerManager.Stub
Binder.restoreCallingIdentity(identity);
}
} else {
- Power.setScreenState(false);
+ setScreenStateLocked(false);
// But continue as if we really did turn the screen on...
err = 0;
}
@@ -1384,7 +1403,7 @@ class PowerManagerService extends IPowerManager.Stub
EventLog.writeEvent(LOG_POWER_SCREEN_STATE, 0, becauseOfUser ? 1 : 0,
mTotalTouchDownTime, mTouchCycles);
mLastTouchDown = 0;
- int err = Power.setScreenState(false);
+ int err = setScreenStateLocked(false);
if (mScreenOnStartTime != 0) {
mScreenOnTime += SystemClock.elapsedRealtime() - mScreenOnStartTime;
mScreenOnStartTime = 0;
@@ -1802,6 +1821,14 @@ class PowerManagerService extends IPowerManager.Stub
}
}
+ private void lightSensorChangedLocked(float value) {
+ if (mDebugLightSensor) {
+ Log.d(TAG, "lightSensorChangedLocked " + value);
+ }
+ mLightSensorValue = value;
+ // more to do here
+ }
+
/**
* The user requested that we go to sleep (probably with the power button).
* This overrides all wake locks that are held.
@@ -1885,6 +1912,18 @@ class PowerManagerService extends IPowerManager.Stub
}
}
+ private void setScreenBrightnessMode(int mode) {
+ mAutoBrightessEnabled = (mode == SCREEN_BRIGHTNESS_MODE_AUTOMATIC);
+
+ if (mHasHardwareAutoBrightness) {
+ // When setting auto-brightness, must reset the brightness afterwards
+ mHardware.setAutoBrightness_UNCHECKED(mAutoBrightessEnabled);
+ setBacklightBrightness((int)mScreenBrightness.curValue);
+ } else {
+ enableLightSensor(screenIsOn() && mAutoBrightessEnabled);
+ }
+ }
+
/** Sets the screen off timeouts:
* mKeylightDelay
* mDimDelay
@@ -2031,6 +2070,14 @@ class PowerManagerService extends IPowerManager.Stub
}
void systemReady() {
+ mSensorManager = new SensorManager(mHandlerThread.getLooper());
+ mProximitySensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
+ // don't bother with the light sensor if auto brightness is handled in hardware
+ if (!mHasHardwareAutoBrightness) {
+ mLightSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
+ enableLightSensor(mAutoBrightessEnabled);
+ }
+
synchronized (mLocks) {
Log.d(TAG, "system ready!");
mDoneBooting = true;
@@ -2058,8 +2105,6 @@ class PowerManagerService extends IPowerManager.Stub
| PowerManager.FULL_WAKE_LOCK
| PowerManager.SCREEN_DIM_WAKE_LOCK;
- // call getSensorManager() to make sure mProximitySensor is initialized
- getSensorManager();
if (mProximitySensor != null) {
result |= PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK;
}
@@ -2098,31 +2143,19 @@ class PowerManagerService extends IPowerManager.Stub
}
}
- public void setAutoBrightness(boolean on) {
- mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER, null);
- mHardware.setAutoBrightness_UNCHECKED(on);
- }
-
- private SensorManager getSensorManager() {
- if (mSensorManager == null) {
- mSensorManager = new SensorManager(mHandlerThread.getLooper());
- mProximitySensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
- }
- return mSensorManager;
- }
-
private void enableProximityLockLocked() {
if (mSpew) {
Log.d(TAG, "enableProximityLockLocked");
}
- mSensorManager.registerListener(this, mProximitySensor, SensorManager.SENSOR_DELAY_NORMAL);
+ mSensorManager.registerListener(mProximityListener, mProximitySensor,
+ SensorManager.SENSOR_DELAY_NORMAL);
}
private void disableProximityLockLocked() {
if (mSpew) {
Log.d(TAG, "disableProximityLockLocked");
}
- mSensorManager.unregisterListener(this);
+ mSensorManager.unregisterListener(mProximityListener);
synchronized (mLocks) {
if (mProximitySensorActive) {
mProximitySensorActive = false;
@@ -2131,32 +2164,65 @@ class PowerManagerService extends IPowerManager.Stub
}
}
- public void onSensorChanged(SensorEvent event) {
- long milliseconds = event.timestamp / 1000000;
- synchronized (mLocks) {
- float distance = event.values[0];
- // compare against getMaximumRange to support sensors that only return 0 or 1
- if (distance >= 0.0 && distance < PROXIMITY_THRESHOLD &&
- distance < mProximitySensor.getMaximumRange()) {
- if (mSpew) {
- Log.d(TAG, "onSensorChanged: proximity active, distance: " + distance);
- }
- goToSleepLocked(milliseconds);
- mProximitySensorActive = true;
+ private void enableLightSensor(boolean enable) {
+ if (mDebugLightSensor) {
+ Log.d(TAG, "enableLightSensor " + enable);
+ }
+ if (mSensorManager != null && mLightSensorEnabled != enable) {
+ mLightSensorEnabled = enable;
+ if (enable) {
+ mSensorManager.registerListener(mLightListener, mLightSensor,
+ SensorManager.SENSOR_DELAY_NORMAL);
} else {
- // proximity sensor negative events trigger as user activity.
- // temporarily set mUserActivityAllowed to true so this will work
- // even when the keyguard is on.
- if (mSpew) {
- Log.d(TAG, "onSensorChanged: proximity inactive, distance: " + distance);
- }
- mProximitySensorActive = false;
- forceUserActivityLocked();
+ mSensorManager.unregisterListener(mLightListener);
}
}
}
- public void onAccuracyChanged(Sensor sensor, int accuracy) {
- // ignore
- }
+ SensorEventListener mProximityListener = new SensorEventListener() {
+ public void onSensorChanged(SensorEvent event) {
+ long milliseconds = event.timestamp / 1000000;
+ synchronized (mLocks) {
+ float distance = event.values[0];
+ // compare against getMaximumRange to support sensors that only return 0 or 1
+ if (distance >= 0.0 && distance < PROXIMITY_THRESHOLD &&
+ distance < mProximitySensor.getMaximumRange()) {
+ if (mSpew) {
+ Log.d(TAG, "onSensorChanged: proximity active, distance: " + distance);
+ }
+ goToSleepLocked(milliseconds);
+ mProximitySensorActive = true;
+ } else {
+ // proximity sensor negative events trigger as user activity.
+ // temporarily set mUserActivityAllowed to true so this will work
+ // even when the keyguard is on.
+ if (mSpew) {
+ Log.d(TAG, "onSensorChanged: proximity inactive, distance: " + distance);
+ }
+ mProximitySensorActive = false;
+ forceUserActivityLocked();
+ }
+ }
+ }
+
+ public void onAccuracyChanged(Sensor sensor, int accuracy) {
+ // ignore
+ }
+ };
+
+ SensorEventListener mLightListener = new SensorEventListener() {
+ public void onSensorChanged(SensorEvent event) {
+ synchronized (mLocks) {
+ int value = (int)event.values[0];
+ if (mDebugLightSensor) {
+ Log.d(TAG, "onSensorChanged: light value: " + value);
+ }
+ lightSensorChangedLocked(value);
+ }
+ }
+
+ public void onAccuracyChanged(Sensor sensor, int accuracy) {
+ // ignore
+ }
+ };
}