From ee2b094de0c5d7ffa64d51e7bd4ec3238be97113 Mon Sep 17 00:00:00 2001 From: Mike Lockwood Date: Mon, 9 Nov 2009 14:09:02 -0500 Subject: [PATCH] Do not deactivate the proximity sensor until after the sensor returns negative. This ensures that we do not get cheek presses immediately after a call is ended. Fixes bug b/2246824 (prox sensor subtleties when call ends) Change-Id: I97d39b7689d9ea2e94ea9aceeb93bf15228ec095 Signed-off-by: Mike Lockwood --- .../android/server/PowerManagerService.java | 83 ++++++++++++------- 1 file changed, 54 insertions(+), 29 deletions(-) diff --git a/services/java/com/android/server/PowerManagerService.java b/services/java/com/android/server/PowerManagerService.java index 3a7a9d2067e04..dd4a630a828f2 100644 --- a/services/java/com/android/server/PowerManagerService.java +++ b/services/java/com/android/server/PowerManagerService.java @@ -158,12 +158,13 @@ class PowerManagerService extends IPowerManager.Stub private int[] mBroadcastQueue = new int[] { -1, -1, -1 }; private int[] mBroadcastWhy = new int[3]; private int mPartialCount = 0; - private int mProximityCount = 0; private int mPowerState; private boolean mOffBecauseOfUser; private int mUserState; private boolean mKeyboardVisible = false; private boolean mUserActivityAllowed = true; + private int mProximityWakeLockCount = 0; + private boolean mProximitySensorEnabled = false; private boolean mProximitySensorActive = false; private int mProximityPendingValue = -1; // -1 == nothing, 0 == inactive, 1 == active private long mLastProximityEventTime; @@ -235,6 +236,7 @@ class PowerManagerService extends IPowerManager.Stub // could be either static or controllable at runtime private static final boolean mSpew = false; + private static final boolean mDebugProximitySensor = (true || 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); } else if ((flags & LOCK_MASK) == PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK) { - mProximityCount++; - if (mProximityCount == 1) { + mProximityWakeLockCount++; + if (mProximityWakeLockCount == 1) { enableProximityLockLocked(); } } @@ -718,9 +720,16 @@ class PowerManagerService extends IPowerManager.Stub Power.releaseWakeLock(PARTIAL_NAME); } } else if ((wl.flags & LOCK_MASK) == PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK) { - mProximityCount--; - if (mProximityCount == 0) { - disableProximityLockLocked(); + mProximityWakeLockCount--; + if (mProximityWakeLockCount == 0) { + 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. @@ -898,6 +907,8 @@ class PowerManagerService extends IPowerManager.Stub pw.println(" mStayOnWhilePluggedInScreenDimLock=" + mStayOnWhilePluggedInScreenDimLock); pw.println(" mStayOnWhilePluggedInPartialLock=" + mStayOnWhilePluggedInPartialLock); pw.println(" mPreventScreenOnPartialLock=" + mPreventScreenOnPartialLock); + pw.println(" mProximityWakeLockCount=" + mProximityWakeLockCount); + pw.println(" mProximitySensorEnabled=" + mProximitySensorEnabled); pw.println(" mProximitySensorActive=" + mProximitySensorActive); pw.println(" mProximityPendingValue=" + mProximityPendingValue); pw.println(" mLastProximityEventTime=" + mLastProximityEventTime); @@ -2341,43 +2352,49 @@ class PowerManagerService extends IPowerManager.Stub } private void enableProximityLockLocked() { - if (mSpew) { + if (mDebugProximitySensor) { Log.d(TAG, "enableProximityLockLocked"); } - // clear calling identity so sensor manager battery stats are accurate - long identity = Binder.clearCallingIdentity(); - try { - mSensorManager.registerListener(mProximityListener, mProximitySensor, - SensorManager.SENSOR_DELAY_NORMAL); - } finally { - Binder.restoreCallingIdentity(identity); + if (!mProximitySensorEnabled) { + // clear calling identity so sensor manager battery stats are accurate + long identity = Binder.clearCallingIdentity(); + try { + mSensorManager.registerListener(mProximityListener, mProximitySensor, + SensorManager.SENSOR_DELAY_NORMAL); + mProximitySensorEnabled = true; + } finally { + Binder.restoreCallingIdentity(identity); + } } } private void disableProximityLockLocked() { - if (mSpew) { + if (mDebugProximitySensor) { Log.d(TAG, "disableProximityLockLocked"); } - // clear calling identity so sensor manager battery stats are accurate - long identity = Binder.clearCallingIdentity(); - try { - mSensorManager.unregisterListener(mProximityListener); - mHandler.removeCallbacks(mProximityTask); - } finally { - Binder.restoreCallingIdentity(identity); - } - if (mProximitySensorActive) { - mProximitySensorActive = false; - forceUserActivityLocked(); + if (mProximitySensorEnabled) { + // clear calling identity so sensor manager battery stats are accurate + long identity = Binder.clearCallingIdentity(); + try { + mSensorManager.unregisterListener(mProximityListener); + mHandler.removeCallbacks(mProximityTask); + mProximitySensorEnabled = false; + } finally { + Binder.restoreCallingIdentity(identity); + } + if (mProximitySensorActive) { + mProximitySensorActive = false; + forceUserActivityLocked(); + } } } private void proximityChangedLocked(boolean active) { - if (mSpew) { + if (mDebugProximitySensor) { Log.d(TAG, "proximityChangedLocked, active: " + active); } - if (mProximityCount <= 0) { - Log.d(TAG, "Ignoring proximity change after last proximity lock is released"); + if (!mProximitySensorEnabled) { + Log.d(TAG, "Ignoring proximity change after sensor is disabled"); return; } if (active) { @@ -2389,6 +2406,11 @@ class PowerManagerService extends IPowerManager.Stub // even when the keyguard is on. mProximitySensorActive = false; 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 && distance < mProximitySensor.getMaximumRange()); + if (mDebugProximitySensor) { + Log.d(TAG, "mProximityListener.onSensorChanged active: " + active); + } if (timeSinceLastEvent < PROXIMITY_SENSOR_DELAY) { // enforce delaying atleast PROXIMITY_SENSOR_DELAY before processing mProximityPendingValue = (active ? 1 : 0);