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:
@@ -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
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user