Keep secondary prox registered when covered.

We were pinging the secondary proximity sensor every 5 seconds to see
if the "near" state had changed. However, after some amount of time,
this 5 second delay would be extended as the cpu would stop waking up,
presumably for power saving reasons.

Instead, we now keep the secondary proxmity sensor registered when
the phone is covered. This means that the phone will immediately wake
up when uncovered, as expected.

The ThresholdSensorImpl now reports a change from below to above when
the latch value is equaled, rather surpassed. This ensures that some,
coarse grained sensors will still trigger when a small change in their
value is detected. Prior to this, a larger change was needed, meaning
that uncovering a phone in a dark room could leave the screen off.

Fixes: 157630609
Test: atest SystemUITests && manual
Change-Id: I4b4e936b19045d38445bf6ab92df2bb6e3d90a28
diff --git a/packages/SystemUI/src/com/android/systemui/util/sensors/ProximitySensor.java b/packages/SystemUI/src/com/android/systemui/util/sensors/ProximitySensor.java
index 57f58c6..ff7716a 100644
--- a/packages/SystemUI/src/com/android/systemui/util/sensors/ProximitySensor.java
+++ b/packages/SystemUI/src/com/android/systemui/util/sensors/ProximitySensor.java
@@ -83,20 +83,21 @@
     private ThresholdSensor.Listener mSecondaryEventListener = new ThresholdSensor.Listener() {
         @Override
         public void onThresholdCrossed(ThresholdSensorEvent event) {
-            // This sensor should only be used briefly. Turn it off as soon as we get a reading.
-            mSecondaryThresholdSensor.pause();
-
             // Only check the secondary as long as the primary thinks we're near.
             if (!mLastPrimaryEvent.getBelow()) {
+                mSecondaryThresholdSensor.pause();
                 mCancelSecondaryRunnable = null;
                 return;
             }
             logDebug("Secondary sensor event: " + event.getBelow() + ".");
 
-            // Check this sensor again in a moment.
-            mCancelSecondaryRunnable = mDelayableExecutor.executeDelayed(
-                    mSecondaryThresholdSensor::resume, SECONDARY_PING_INTERVAL_MS);
-
+            // This sensor should only be used briefly when uncovered.
+            if (!event.getBelow()) {
+                mSecondaryThresholdSensor.pause();
+                // Check this sensor again in a moment.
+                mCancelSecondaryRunnable = mDelayableExecutor.executeDelayed(
+                        mSecondaryThresholdSensor::resume, SECONDARY_PING_INTERVAL_MS);
+            }
             onSensorEvent(event);
         }
     };
diff --git a/packages/SystemUI/src/com/android/systemui/util/sensors/ThresholdSensorImpl.java b/packages/SystemUI/src/com/android/systemui/util/sensors/ThresholdSensorImpl.java
index 5bedea1..aa50292 100644
--- a/packages/SystemUI/src/com/android/systemui/util/sensors/ThresholdSensorImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/util/sensors/ThresholdSensorImpl.java
@@ -51,7 +51,7 @@
         @Override
         public void onSensorChanged(SensorEvent event) {
             boolean below = event.values[0] < mThreshold;
-            boolean above = event.values[0] > mThresholdLatch;
+            boolean above = event.values[0] >= mThresholdLatch;
             logDebug("Sensor value: " + event.values[0]);
             onSensorEvent(below, above, event.timestamp);
         }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/util/sensors/ProximitySensorDualTest.java b/packages/SystemUI/tests/src/com/android/systemui/util/sensors/ProximitySensorDualTest.java
index 81a5747..433ec18 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/util/sensors/ProximitySensorDualTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/util/sensors/ProximitySensorDualTest.java
@@ -86,10 +86,9 @@
         // Trigger second sensor.
         mThresholdSensorSecondary.triggerEvent(true, 0);
         assertFalse(mThresholdSensorPrimary.isPaused());
-        assertTrue(mThresholdSensorSecondary.isPaused());
+        assertFalse(mThresholdSensorSecondary.isPaused());
         assertTrue(listener.mLastEvent.getBelow());
         assertEquals(1, listener.mCallCount);
-        assertTrue(mThresholdSensorSecondary.isPaused());
 
         mProximitySensor.unregister(listener);
     }
@@ -109,10 +108,16 @@
         assertNull(listener.mLastEvent);
         assertEquals(0, listener.mCallCount);
 
-        // Trigger second sensor.
+        // Trigger second sensor. Second sensor remains registered.
         mThresholdSensorSecondary.triggerEvent(true, 0);
         assertTrue(listener.mLastEvent.getBelow());
         assertEquals(1, listener.mCallCount);
+        assertFalse(mThresholdSensorSecondary.isPaused());
+
+        // Triggering above should pause.
+        mThresholdSensorSecondary.triggerEvent(false, 0);
+        assertFalse(listener.mLastEvent.getBelow());
+        assertEquals(2, listener.mCallCount);
         assertTrue(mThresholdSensorSecondary.isPaused());
 
         // Advance time. Second sensor should resume.
@@ -120,12 +125,6 @@
         mFakeExecutor.runNextReady();
         assertFalse(mThresholdSensorSecondary.isPaused());
 
-        // Triggering should pause again.
-        mThresholdSensorSecondary.triggerEvent(false, 0);
-        assertFalse(listener.mLastEvent.getBelow());
-        assertEquals(2, listener.mCallCount);
-        assertTrue(mThresholdSensorSecondary.isPaused());
-
         mProximitySensor.unregister(listener);
     }
 
@@ -143,7 +142,7 @@
         mThresholdSensorPrimary.triggerEvent(true, 0);
         mThresholdSensorSecondary.triggerEvent(true, 0);
         assertFalse(mThresholdSensorPrimary.isPaused());
-        assertTrue(mThresholdSensorSecondary.isPaused());
+        assertFalse(mThresholdSensorSecondary.isPaused());
         assertTrue(listener.mLastEvent.getBelow());
         assertEquals(1, listener.mCallCount);
 
@@ -165,7 +164,7 @@
         mThresholdSensorPrimary.triggerEvent(true, 0);
         mThresholdSensorSecondary.triggerEvent(true, 0);
         assertFalse(mThresholdSensorPrimary.isPaused());
-        assertTrue(mThresholdSensorSecondary.isPaused());
+        assertFalse(mThresholdSensorSecondary.isPaused());
         assertTrue(listener.mLastEvent.getBelow());
         assertEquals(1, listener.mCallCount);
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/util/sensors/ThresholdSensorImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/util/sensors/ThresholdSensorImplTest.java
index 0d36bd3..8ba7d62 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/util/sensors/ThresholdSensorImplTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/util/sensors/ThresholdSensorImplTest.java
@@ -259,7 +259,7 @@
         assertTrue(listener.mBelow);
         assertEquals(1, listener.mCallCount);
 
-        sensor.sendSensorEvent(highValue + 1);
+        sensor.sendSensorEvent(highValue);
 
         assertFalse(listener.mBelow);
         assertEquals(2, listener.mCallCount);