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