PowerManagerService: Disallow all user activity when in proximity wake lock.

Fixes b/2076756

Signed-off-by: Mike Lockwood <lockwood@android.com>
diff --git a/services/java/com/android/server/PowerManagerService.java b/services/java/com/android/server/PowerManagerService.java
index 1249289..621f497 100644
--- a/services/java/com/android/server/PowerManagerService.java
+++ b/services/java/com/android/server/PowerManagerService.java
@@ -150,6 +150,7 @@
     private int mUserState;
     private boolean mKeyboardVisible = false;
     private boolean mUserActivityAllowed = true;
+    private boolean mProximitySensorActive = false;
     private int mTotalDelaySetting;
     private int mKeylightDelay;
     private int mDimDelay;
@@ -1252,6 +1253,10 @@
             if (noChangeLights) {
                 newState = (newState & ~LIGHTS_MASK) | (mPowerState & LIGHTS_MASK);
             }
+            if (mProximitySensorActive) {
+                // don't turn on the screen when the proximity sensor lock is held
+                newState = (newState & ~SCREEN_BRIGHT);
+            }
 
             if (batteryIsLow()) {
                 newState |= BATTERY_LOW_BIT;
@@ -1748,11 +1753,13 @@
                 Log.d(TAG, "userActivity mLastEventTime=" + mLastEventTime + " time=" + time
                         + " mUserActivityAllowed=" + mUserActivityAllowed
                         + " mUserState=0x" + Integer.toHexString(mUserState)
-                        + " mWakeLockState=0x" + Integer.toHexString(mWakeLockState));
+                        + " mWakeLockState=0x" + Integer.toHexString(mWakeLockState)
+                        + " mProximitySensorActive=" + mProximitySensorActive
+                        + " force=" + force);
             }
             if (mLastEventTime <= time || force) {
                 mLastEventTime = time;
-                if (mUserActivityAllowed || force) {
+                if ((mUserActivityAllowed && !mProximitySensorActive) || force) {
                     // Only turn on button backlights if a button was pressed.
                     if (eventType == BUTTON_EVENT) {
                         mUserState = (mKeyboardVisible ? ALL_BRIGHT : SCREEN_BUTTON_BRIGHT);
@@ -2042,22 +2049,37 @@
     }
 
     private void enableProximityLockLocked() {
+        if (mSpew) {
+            Log.d(TAG, "enableProximityLockLocked");
+        }
         mSensorManager.registerListener(this, mProximitySensor, SensorManager.SENSOR_DELAY_NORMAL);
     }
 
     private void disableProximityLockLocked() {
+        if (mSpew) {
+            Log.d(TAG, "disableProximityLockLocked");
+        }
         mSensorManager.unregisterListener(this);
+        mProximitySensorActive = false;
     }
 
     public void onSensorChanged(SensorEvent event) {
         long milliseconds = event.timestamp / 1000000;
-        if (event.values[0] == 0.0) {
-            goToSleep(milliseconds);
-        } else {
-            // proximity sensor negative events user activity.
-            // temporarily set mUserActivityAllowed to true so this will work
-            // even when the keyguard is on.
-            synchronized (mLocks) {
+        synchronized (mLocks) {
+            if (event.values[0] == 0.0) {
+                if (mSpew) {
+                    Log.d(TAG, "onSensorChanged: proximity active");
+                }
+                goToSleepLocked(milliseconds);
+                mProximitySensorActive = true;
+            } else {
+                // proximity sensor negative events 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");
+                }
+                mProximitySensorActive = false;
                 boolean savedActivityAllowed = mUserActivityAllowed;
                 mUserActivityAllowed = true;
                 userActivity(milliseconds, false);