am 0b08abe1: Merge change I9521cf8b into eclair

Merge commit '0b08abe1b8e4f49cfaefb8226696664ad3d5ca6a' into eclair-mr2

* commit '0b08abe1b8e4f49cfaefb8226696664ad3d5ca6a':
  Register for light sensor events if non-hardware based auto-brightnees is enabled
This commit is contained in:
Mike Lockwood
2009-10-16 09:38:12 -07:00
committed by Android Git Automerger

View File

@@ -65,7 +65,7 @@ import java.util.Observable;
import java.util.Observer; import java.util.Observer;
class PowerManagerService extends IPowerManager.Stub class PowerManagerService extends IPowerManager.Stub
implements LocalPowerManager, Watchdog.Monitor, SensorEventListener { implements LocalPowerManager, Watchdog.Monitor {
private static final String TAG = "PowerManagerService"; private static final String TAG = "PowerManagerService";
static final String PARTIAL_NAME = "PowerManagerService"; static final String PARTIAL_NAME = "PowerManagerService";
@@ -190,6 +190,9 @@ class PowerManagerService extends IPowerManager.Stub
private BatteryService mBatteryService; private BatteryService mBatteryService;
private SensorManager mSensorManager; private SensorManager mSensorManager;
private Sensor mProximitySensor; private Sensor mProximitySensor;
private Sensor mLightSensor;
private boolean mLightSensorEnabled;
private float mLightSensorValue = -1;
private boolean mDimScreen = true; private boolean mDimScreen = true;
private long mNextTimeout; private long mNextTimeout;
private volatile int mPokey = 0; private volatile int mPokey = 0;
@@ -210,6 +213,7 @@ class PowerManagerService extends IPowerManager.Stub
// could be either static or controllable at runtime // could be either static or controllable at runtime
private static final boolean mSpew = false; private static final boolean mSpew = false;
private static final boolean mDebugLightSensor = false;
/* /*
static PrintStream mLog; static PrintStream mLog;
@@ -1171,7 +1175,7 @@ class PowerManagerService extends IPowerManager.Stub
// Finally, set the flag that prevents the screen from turning on. // Finally, set the flag that prevents the screen from turning on.
// (Below, in setPowerState(), we'll check mPreventScreenOn and // (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; mPreventScreenOn = true;
} else { } else {
// (Re)enable the screen. // (Re)enable the screen.
@@ -1189,9 +1193,9 @@ class PowerManagerService extends IPowerManager.Stub
Log.d(TAG, Log.d(TAG,
"preventScreenOn: turning on after a prior preventScreenOn(true)!"); "preventScreenOn: turning on after a prior preventScreenOn(true)!");
} }
int err = Power.setScreenState(true); int err = setScreenStateLocked(true);
if (err != 0) { if (err != 0) {
Log.w(TAG, "preventScreenOn: error from Power.setScreenState(): " + err); Log.w(TAG, "preventScreenOn: error from setScreenStateLocked(): " + err);
} }
} }
@@ -1246,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) private void setPowerState(int state)
{ {
setPowerState(state, false, false); setPowerState(state, false, false);
@@ -1334,7 +1346,7 @@ class PowerManagerService extends IPowerManager.Stub
reallyTurnScreenOn = false; reallyTurnScreenOn = false;
} }
if (reallyTurnScreenOn) { if (reallyTurnScreenOn) {
err = Power.setScreenState(true); err = setScreenStateLocked(true);
long identity = Binder.clearCallingIdentity(); long identity = Binder.clearCallingIdentity();
try { try {
mBatteryStats.noteScreenBrightness( mBatteryStats.noteScreenBrightness(
@@ -1346,7 +1358,7 @@ class PowerManagerService extends IPowerManager.Stub
Binder.restoreCallingIdentity(identity); Binder.restoreCallingIdentity(identity);
} }
} else { } else {
Power.setScreenState(false); setScreenStateLocked(false);
// But continue as if we really did turn the screen on... // But continue as if we really did turn the screen on...
err = 0; err = 0;
} }
@@ -1391,7 +1403,7 @@ class PowerManagerService extends IPowerManager.Stub
EventLog.writeEvent(LOG_POWER_SCREEN_STATE, 0, becauseOfUser ? 1 : 0, EventLog.writeEvent(LOG_POWER_SCREEN_STATE, 0, becauseOfUser ? 1 : 0,
mTotalTouchDownTime, mTouchCycles); mTotalTouchDownTime, mTouchCycles);
mLastTouchDown = 0; mLastTouchDown = 0;
int err = Power.setScreenState(false); int err = setScreenStateLocked(false);
if (mScreenOnStartTime != 0) { if (mScreenOnStartTime != 0) {
mScreenOnTime += SystemClock.elapsedRealtime() - mScreenOnStartTime; mScreenOnTime += SystemClock.elapsedRealtime() - mScreenOnStartTime;
mScreenOnStartTime = 0; mScreenOnStartTime = 0;
@@ -1809,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). * The user requested that we go to sleep (probably with the power button).
* This overrides all wake locks that are held. * This overrides all wake locks that are held.
@@ -1900,7 +1920,7 @@ class PowerManagerService extends IPowerManager.Stub
mHardware.setAutoBrightness_UNCHECKED(mAutoBrightessEnabled); mHardware.setAutoBrightness_UNCHECKED(mAutoBrightessEnabled);
setBacklightBrightness((int)mScreenBrightness.curValue); setBacklightBrightness((int)mScreenBrightness.curValue);
} else { } else {
// not yet implemented enableLightSensor(screenIsOn() && mAutoBrightessEnabled);
} }
} }
@@ -2050,6 +2070,14 @@ class PowerManagerService extends IPowerManager.Stub
} }
void systemReady() { 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) { synchronized (mLocks) {
Log.d(TAG, "system ready!"); Log.d(TAG, "system ready!");
mDoneBooting = true; mDoneBooting = true;
@@ -2077,8 +2105,6 @@ class PowerManagerService extends IPowerManager.Stub
| PowerManager.FULL_WAKE_LOCK | PowerManager.FULL_WAKE_LOCK
| PowerManager.SCREEN_DIM_WAKE_LOCK; | PowerManager.SCREEN_DIM_WAKE_LOCK;
// call getSensorManager() to make sure mProximitySensor is initialized
getSensorManager();
if (mProximitySensor != null) { if (mProximitySensor != null) {
result |= PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK; result |= PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK;
} }
@@ -2117,26 +2143,19 @@ class PowerManagerService extends IPowerManager.Stub
} }
} }
private SensorManager getSensorManager() {
if (mSensorManager == null) {
mSensorManager = new SensorManager(mHandlerThread.getLooper());
mProximitySensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
}
return mSensorManager;
}
private void enableProximityLockLocked() { private void enableProximityLockLocked() {
if (mSpew) { if (mSpew) {
Log.d(TAG, "enableProximityLockLocked"); Log.d(TAG, "enableProximityLockLocked");
} }
mSensorManager.registerListener(this, mProximitySensor, SensorManager.SENSOR_DELAY_NORMAL); mSensorManager.registerListener(mProximityListener, mProximitySensor,
SensorManager.SENSOR_DELAY_NORMAL);
} }
private void disableProximityLockLocked() { private void disableProximityLockLocked() {
if (mSpew) { if (mSpew) {
Log.d(TAG, "disableProximityLockLocked"); Log.d(TAG, "disableProximityLockLocked");
} }
mSensorManager.unregisterListener(this); mSensorManager.unregisterListener(mProximityListener);
synchronized (mLocks) { synchronized (mLocks) {
if (mProximitySensorActive) { if (mProximitySensorActive) {
mProximitySensorActive = false; mProximitySensorActive = false;
@@ -2145,32 +2164,65 @@ class PowerManagerService extends IPowerManager.Stub
} }
} }
public void onSensorChanged(SensorEvent event) { private void enableLightSensor(boolean enable) {
long milliseconds = event.timestamp / 1000000; if (mDebugLightSensor) {
synchronized (mLocks) { Log.d(TAG, "enableLightSensor " + enable);
float distance = event.values[0]; }
// compare against getMaximumRange to support sensors that only return 0 or 1 if (mSensorManager != null && mLightSensorEnabled != enable) {
if (distance >= 0.0 && distance < PROXIMITY_THRESHOLD && mLightSensorEnabled = enable;
distance < mProximitySensor.getMaximumRange()) { if (enable) {
if (mSpew) { mSensorManager.registerListener(mLightListener, mLightSensor,
Log.d(TAG, "onSensorChanged: proximity active, distance: " + distance); SensorManager.SENSOR_DELAY_NORMAL);
}
goToSleepLocked(milliseconds);
mProximitySensorActive = true;
} else { } else {
// proximity sensor negative events trigger as user activity. mSensorManager.unregisterListener(mLightListener);
// 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) { SensorEventListener mProximityListener = new SensorEventListener() {
// ignore 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
}
};
} }