Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ee2b094d authored by Mike Lockwood's avatar Mike Lockwood
Browse files

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: default avatarMike Lockwood <lockwood@android.com>
parent de342a01
Loading
Loading
Loading
Loading
+54 −29
Original line number Diff line number Diff line
@@ -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,11 +720,18 @@ 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) {
            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.
        wl.binder.unlinkToDeath(wl, 0);
        releaseUid = wl.uid;
@@ -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,28 +2352,33 @@ class PowerManagerService extends IPowerManager.Stub
    }

    private void enableProximityLockLocked() {
        if (mSpew) {
        if (mDebugProximitySensor) {
            Log.d(TAG, "enableProximityLockLocked");
        }
        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");
        }
        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);
            }
@@ -2371,13 +2387,14 @@ class PowerManagerService extends IPowerManager.Stub
                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);