am ee2b094d: Do not deactivate the proximity sensor until after the sensor returns negative.

Merge commit 'ee2b094de0c5d7ffa64d51e7bd4ec3238be97113' into eclair-mr2

* commit 'ee2b094de0c5d7ffa64d51e7bd4ec3238be97113':
  Do not deactivate the proximity sensor until after the sensor returns negative.
This commit is contained in:
Mike Lockwood
2009-11-10 05:01:02 -08:00
committed by Android Git Automerger

View File

@@ -158,12 +158,13 @@ class PowerManagerService extends IPowerManager.Stub
private int[] mBroadcastQueue = new int[] { -1, -1, -1 }; private int[] mBroadcastQueue = new int[] { -1, -1, -1 };
private int[] mBroadcastWhy = new int[3]; private int[] mBroadcastWhy = new int[3];
private int mPartialCount = 0; private int mPartialCount = 0;
private int mProximityCount = 0;
private int mPowerState; private int mPowerState;
private boolean mOffBecauseOfUser; private boolean mOffBecauseOfUser;
private int mUserState; private int mUserState;
private boolean mKeyboardVisible = false; private boolean mKeyboardVisible = false;
private boolean mUserActivityAllowed = true; private boolean mUserActivityAllowed = true;
private int mProximityWakeLockCount = 0;
private boolean mProximitySensorEnabled = false;
private boolean mProximitySensorActive = false; private boolean mProximitySensorActive = false;
private int mProximityPendingValue = -1; // -1 == nothing, 0 == inactive, 1 == active private int mProximityPendingValue = -1; // -1 == nothing, 0 == inactive, 1 == active
private long mLastProximityEventTime; private long mLastProximityEventTime;
@@ -235,6 +236,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 mDebugProximitySensor = (true || mSpew);
private static final boolean mDebugLightSensor = (false || mSpew); private static final boolean mDebugLightSensor = (false || mSpew);
/* /*
@@ -657,8 +659,8 @@ class PowerManagerService extends IPowerManager.Stub
} }
Power.acquireWakeLock(Power.PARTIAL_WAKE_LOCK,PARTIAL_NAME); Power.acquireWakeLock(Power.PARTIAL_WAKE_LOCK,PARTIAL_NAME);
} else if ((flags & LOCK_MASK) == PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK) { } else if ((flags & LOCK_MASK) == PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK) {
mProximityCount++; mProximityWakeLockCount++;
if (mProximityCount == 1) { if (mProximityWakeLockCount == 1) {
enableProximityLockLocked(); enableProximityLockLocked();
} }
} }
@@ -718,9 +720,16 @@ class PowerManagerService extends IPowerManager.Stub
Power.releaseWakeLock(PARTIAL_NAME); Power.releaseWakeLock(PARTIAL_NAME);
} }
} else if ((wl.flags & LOCK_MASK) == PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK) { } else if ((wl.flags & LOCK_MASK) == PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK) {
mProximityCount--; mProximityWakeLockCount--;
if (mProximityCount == 0) { if (mProximityWakeLockCount == 0) {
disableProximityLockLocked(); if (mProximitySensorActive) {
// wait for proximity sensor to go negative before disabling sensor
if (mDebugProximitySensor) {
Log.d(TAG, "waiting for proximity sensor to go negative");
}
} else {
disableProximityLockLocked();
}
} }
} }
// Unlink the lock from the binder. // Unlink the lock from the binder.
@@ -898,6 +907,8 @@ class PowerManagerService extends IPowerManager.Stub
pw.println(" mStayOnWhilePluggedInScreenDimLock=" + mStayOnWhilePluggedInScreenDimLock); pw.println(" mStayOnWhilePluggedInScreenDimLock=" + mStayOnWhilePluggedInScreenDimLock);
pw.println(" mStayOnWhilePluggedInPartialLock=" + mStayOnWhilePluggedInPartialLock); pw.println(" mStayOnWhilePluggedInPartialLock=" + mStayOnWhilePluggedInPartialLock);
pw.println(" mPreventScreenOnPartialLock=" + mPreventScreenOnPartialLock); pw.println(" mPreventScreenOnPartialLock=" + mPreventScreenOnPartialLock);
pw.println(" mProximityWakeLockCount=" + mProximityWakeLockCount);
pw.println(" mProximitySensorEnabled=" + mProximitySensorEnabled);
pw.println(" mProximitySensorActive=" + mProximitySensorActive); pw.println(" mProximitySensorActive=" + mProximitySensorActive);
pw.println(" mProximityPendingValue=" + mProximityPendingValue); pw.println(" mProximityPendingValue=" + mProximityPendingValue);
pw.println(" mLastProximityEventTime=" + mLastProximityEventTime); pw.println(" mLastProximityEventTime=" + mLastProximityEventTime);
@@ -2341,43 +2352,49 @@ class PowerManagerService extends IPowerManager.Stub
} }
private void enableProximityLockLocked() { private void enableProximityLockLocked() {
if (mSpew) { if (mDebugProximitySensor) {
Log.d(TAG, "enableProximityLockLocked"); Log.d(TAG, "enableProximityLockLocked");
} }
// clear calling identity so sensor manager battery stats are accurate if (!mProximitySensorEnabled) {
long identity = Binder.clearCallingIdentity(); // clear calling identity so sensor manager battery stats are accurate
try { long identity = Binder.clearCallingIdentity();
mSensorManager.registerListener(mProximityListener, mProximitySensor, try {
SensorManager.SENSOR_DELAY_NORMAL); mSensorManager.registerListener(mProximityListener, mProximitySensor,
} finally { SensorManager.SENSOR_DELAY_NORMAL);
Binder.restoreCallingIdentity(identity); mProximitySensorEnabled = true;
} finally {
Binder.restoreCallingIdentity(identity);
}
} }
} }
private void disableProximityLockLocked() { private void disableProximityLockLocked() {
if (mSpew) { if (mDebugProximitySensor) {
Log.d(TAG, "disableProximityLockLocked"); Log.d(TAG, "disableProximityLockLocked");
} }
// clear calling identity so sensor manager battery stats are accurate if (mProximitySensorEnabled) {
long identity = Binder.clearCallingIdentity(); // clear calling identity so sensor manager battery stats are accurate
try { long identity = Binder.clearCallingIdentity();
mSensorManager.unregisterListener(mProximityListener); try {
mHandler.removeCallbacks(mProximityTask); mSensorManager.unregisterListener(mProximityListener);
} finally { mHandler.removeCallbacks(mProximityTask);
Binder.restoreCallingIdentity(identity); mProximitySensorEnabled = false;
} } finally {
if (mProximitySensorActive) { Binder.restoreCallingIdentity(identity);
mProximitySensorActive = false; }
forceUserActivityLocked(); if (mProximitySensorActive) {
mProximitySensorActive = false;
forceUserActivityLocked();
}
} }
} }
private void proximityChangedLocked(boolean active) { private void proximityChangedLocked(boolean active) {
if (mSpew) { if (mDebugProximitySensor) {
Log.d(TAG, "proximityChangedLocked, active: " + active); Log.d(TAG, "proximityChangedLocked, active: " + active);
} }
if (mProximityCount <= 0) { if (!mProximitySensorEnabled) {
Log.d(TAG, "Ignoring proximity change after last proximity lock is released"); Log.d(TAG, "Ignoring proximity change after sensor is disabled");
return; return;
} }
if (active) { if (active) {
@@ -2389,6 +2406,11 @@ class PowerManagerService extends IPowerManager.Stub
// even when the keyguard is on. // even when the keyguard is on.
mProximitySensorActive = false; mProximitySensorActive = false;
forceUserActivityLocked(); forceUserActivityLocked();
if (mProximityWakeLockCount == 0) {
// disable sensor if we have no listeners left after proximity negative
disableProximityLockLocked();
}
} }
} }
@@ -2427,6 +2449,9 @@ class PowerManagerService extends IPowerManager.Stub
boolean active = (distance >= 0.0 && distance < PROXIMITY_THRESHOLD && boolean active = (distance >= 0.0 && distance < PROXIMITY_THRESHOLD &&
distance < mProximitySensor.getMaximumRange()); distance < mProximitySensor.getMaximumRange());
if (mDebugProximitySensor) {
Log.d(TAG, "mProximityListener.onSensorChanged active: " + active);
}
if (timeSinceLastEvent < PROXIMITY_SENSOR_DELAY) { if (timeSinceLastEvent < PROXIMITY_SENSOR_DELAY) {
// enforce delaying atleast PROXIMITY_SENSOR_DELAY before processing // enforce delaying atleast PROXIMITY_SENSOR_DELAY before processing
mProximityPendingValue = (active ? 1 : 0); mProximityPendingValue = (active ? 1 : 0);