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 19ed2848ca6ff..b38fc77fd1318 100644 --- a/packages/SystemUI/src/com/android/systemui/util/sensors/ProximitySensor.java +++ b/packages/SystemUI/src/com/android/systemui/util/sensors/ProximitySensor.java @@ -281,18 +281,24 @@ public class ProximitySensor implements ThresholdSensor { mLastPrimaryEvent = event; - if (event.getBelow() && mSecondaryThresholdSensor.isLoaded()) { - logDebug("Primary sensor is near. Checking secondary."); + if (mSecondarySafe && mSecondaryThresholdSensor.isLoaded()) { + logDebug("Primary sensor reported " + (event.getBelow() ? "near" : "far") + + ". Checking secondary."); if (mCancelSecondaryRunnable == null) { mSecondaryThresholdSensor.resume(); } - } else { - if (!mSecondaryThresholdSensor.isLoaded()) { - logDebug("Primary sensor event: " + event.getBelow() + ". No secondary."); - } else { - logDebug("Primary sensor event: " + event.getBelow() + "."); - } + return; + } + + if (!mSecondaryThresholdSensor.isLoaded()) { + logDebug("Primary sensor event: " + event.getBelow() + ". No secondary."); onSensorEvent(event); + } else if (event.getBelow()) { + logDebug("Primary sensor event: " + event.getBelow() + ". Checking secondary."); + if (mCancelSecondaryRunnable != null) { + mCancelSecondaryRunnable.run(); + } + mSecondaryThresholdSensor.resume(); } } 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 8f0754592b832..cc2afe2f7b8a5 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 @@ -59,6 +59,25 @@ public class ProximitySensorDualTest extends SysuiTestCase { new FakeExecution()); } + @Test + public void testPrimaryBelowDoesNotInvokeSecondary() { + TestableListener listener = new TestableListener(); + + mProximitySensor.register(listener); + assertTrue(mProximitySensor.isRegistered()); + assertFalse(mThresholdSensorPrimary.isPaused()); + assertTrue(mThresholdSensorSecondary.isPaused()); + assertNull(listener.mLastEvent); + assertEquals(0, listener.mCallCount); + + // Trigger primary sensor. Our secondary sensor is not registered. + mThresholdSensorPrimary.triggerEvent(false, 0); + assertFalse(mThresholdSensorPrimary.isPaused()); + assertTrue(mThresholdSensorSecondary.isPaused()); + assertNull(listener.mLastEvent); + assertEquals(0, listener.mCallCount); + } + @Test public void testSingleListener() { TestableListener listener = new TestableListener(); @@ -255,40 +274,6 @@ public class ProximitySensorDualTest extends SysuiTestCase { mProximitySensor.unregister(listener); } - @Test - public void testPrimaryCancelsSecondary() { - TestableListener listener = new TestableListener(); - - mProximitySensor.register(listener); - assertFalse(mThresholdSensorPrimary.isPaused()); - assertTrue(mThresholdSensorSecondary.isPaused()); - assertNull(listener.mLastEvent); - assertEquals(0, listener.mCallCount); - - mThresholdSensorPrimary.triggerEvent(true, 0); - assertNull(listener.mLastEvent); - assertEquals(0, listener.mCallCount); - mThresholdSensorSecondary.triggerEvent(true, 0); - assertTrue(listener.mLastEvent.getBelow()); - assertEquals(1, listener.mCallCount); - - // When the primary reports false, the secondary is no longer needed. We get an immediate - // report. - mThresholdSensorPrimary.triggerEvent(false, 1); - assertFalse(listener.mLastEvent.getBelow()); - assertEquals(2, listener.mCallCount); - - // The secondary is now ignored. No more work is scheduled. - mFakeExecutor.advanceClockToNext(); - mFakeExecutor.runNextReady(); - mThresholdSensorSecondary.triggerEvent(true, 0); - assertFalse(listener.mLastEvent.getBelow()); - assertEquals(2, listener.mCallCount); - assertEquals(0, mFakeExecutor.numPending()); - - mProximitySensor.unregister(listener); - } - @Test public void testSecondaryCancelsSecondary() { TestableListener listener = new TestableListener(); @@ -342,7 +327,7 @@ public class ProximitySensorDualTest extends SysuiTestCase { // The secondary sensor should now remain resumed indefinitely. assertFalse(mThresholdSensorSecondary.isPaused()); - mThresholdSensorPrimary.triggerEvent(false, 1); + mThresholdSensorSecondary.triggerEvent(false, 1); assertFalse(listener.mLastEvent.getBelow()); assertEquals(2, listener.mCallCount);