From 23537575fd5eae2161cd0f82d37543daba7225ba Mon Sep 17 00:00:00 2001 From: Dave Mankoff Date: Wed, 3 Jun 2020 15:09:13 -0400 Subject: [PATCH] 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 --- .../util/sensors/ProximitySensor.java | 15 ++++++------- .../util/sensors/ThresholdSensorImpl.java | 2 +- .../util/sensors/ProximitySensorDualTest.java | 21 +++++++++---------- .../util/sensors/ThresholdSensorImplTest.java | 2 +- 4 files changed, 20 insertions(+), 20 deletions(-) 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 57f58c6a517ef..ff7716a85ae1c 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 @@ public class ProximitySensor implements ThresholdSensor { 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 5bedea173f197..aa50292edbf72 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 @@ class ThresholdSensorImpl implements ThresholdSensor { @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 81a57478f6efb..433ec1887fd10 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 @@ public class ProximitySensorDualTest extends SysuiTestCase { // 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 @@ public class ProximitySensorDualTest extends SysuiTestCase { 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 @@ public class ProximitySensorDualTest extends SysuiTestCase { 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 @@ public class ProximitySensorDualTest extends SysuiTestCase { 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 @@ public class ProximitySensorDualTest extends SysuiTestCase { 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 0d36bd30c8a54..8ba7d62ba843c 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 @@ public class ThresholdSensorImplTest extends SysuiTestCase { assertTrue(listener.mBelow); assertEquals(1, listener.mCallCount); - sensor.sendSensorEvent(highValue + 1); + sensor.sendSensorEvent(highValue); assertFalse(listener.mBelow); assertEquals(2, listener.mCallCount);