Loading packages/SystemUI/src/com/android/systemui/util/sensors/ProximitySensor.java +10 −4 Original line number Diff line number Diff line Loading @@ -86,9 +86,12 @@ public class ProximitySensor implements ThresholdSensor { public void onThresholdCrossed(ThresholdSensorEvent event) { // If we no longer have a "below" signal and the secondary sensor is not // considered "safe", then we need to turn it off. if (!mSecondarySafe && (!mLastPrimaryEvent.getBelow() || !event.getBelow())) { if (!mSecondarySafe && (mLastPrimaryEvent == null || !mLastPrimaryEvent.getBelow() || !event.getBelow())) { mSecondaryThresholdSensor.pause(); if (!mLastPrimaryEvent.getBelow()) { if (mLastPrimaryEvent == null || !mLastPrimaryEvent.getBelow()) { // Only check the secondary as long as the primary thinks we're near. mCancelSecondaryRunnable = null; return; Loading @@ -100,8 +103,10 @@ public class ProximitySensor implements ThresholdSensor { } logDebug("Secondary sensor event: " + event.getBelow() + "."); if (!mPaused) { onSensorEvent(event); } } }; @Inject Loading Loading @@ -252,9 +257,10 @@ public class ProximitySensor implements ThresholdSensor { return; } if (mLastEvent != null) { ThresholdSensorEvent lastEvent = mLastEvent; // Listeners can null out mLastEvent. List<ThresholdSensor.Listener> listeners = new ArrayList<>(mListeners); listeners.forEach(proximitySensorListener -> proximitySensorListener.onThresholdCrossed(mLastEvent)); proximitySensorListener.onThresholdCrossed(lastEvent)); } mAlerting.set(false); Loading packages/SystemUI/tests/src/com/android/systemui/util/sensors/ProximitySensorDualTest.java +26 −0 Original line number Diff line number Diff line Loading @@ -152,6 +152,32 @@ public class ProximitySensorDualTest extends SysuiTestCase { assertFalse(mProximitySensor.isRegistered()); } @Test public void testUnregisterDuringCallback() { ThresholdSensor.Listener listenerA = event -> mProximitySensor.pause(); TestableListener listenerB = new TestableListener(); assertFalse(mProximitySensor.isRegistered()); mProximitySensor.register(listenerA); mProximitySensor.register(listenerB); assertTrue(mProximitySensor.isRegistered()); assertFalse(mThresholdSensorPrimary.isPaused()); assertTrue(mThresholdSensorSecondary.isPaused()); assertNull(listenerB.mLastEvent); // listenerA will pause the proximity sensor, unregistering it. mThresholdSensorPrimary.triggerEvent(true, 0); mThresholdSensorSecondary.triggerEvent(true, 0); assertTrue(listenerB.mLastEvent.getBelow()); assertEquals(1, listenerB.mCallCount); // A second call to trigger it should be ignored. mThresholdSensorSecondary.triggerEvent(false, 0); assertTrue(listenerB.mLastEvent.getBelow()); assertEquals(1, listenerB.mCallCount); } @Test public void testPauseAndResume() { TestableListener listener = new TestableListener(); Loading Loading
packages/SystemUI/src/com/android/systemui/util/sensors/ProximitySensor.java +10 −4 Original line number Diff line number Diff line Loading @@ -86,9 +86,12 @@ public class ProximitySensor implements ThresholdSensor { public void onThresholdCrossed(ThresholdSensorEvent event) { // If we no longer have a "below" signal and the secondary sensor is not // considered "safe", then we need to turn it off. if (!mSecondarySafe && (!mLastPrimaryEvent.getBelow() || !event.getBelow())) { if (!mSecondarySafe && (mLastPrimaryEvent == null || !mLastPrimaryEvent.getBelow() || !event.getBelow())) { mSecondaryThresholdSensor.pause(); if (!mLastPrimaryEvent.getBelow()) { if (mLastPrimaryEvent == null || !mLastPrimaryEvent.getBelow()) { // Only check the secondary as long as the primary thinks we're near. mCancelSecondaryRunnable = null; return; Loading @@ -100,8 +103,10 @@ public class ProximitySensor implements ThresholdSensor { } logDebug("Secondary sensor event: " + event.getBelow() + "."); if (!mPaused) { onSensorEvent(event); } } }; @Inject Loading Loading @@ -252,9 +257,10 @@ public class ProximitySensor implements ThresholdSensor { return; } if (mLastEvent != null) { ThresholdSensorEvent lastEvent = mLastEvent; // Listeners can null out mLastEvent. List<ThresholdSensor.Listener> listeners = new ArrayList<>(mListeners); listeners.forEach(proximitySensorListener -> proximitySensorListener.onThresholdCrossed(mLastEvent)); proximitySensorListener.onThresholdCrossed(lastEvent)); } mAlerting.set(false); Loading
packages/SystemUI/tests/src/com/android/systemui/util/sensors/ProximitySensorDualTest.java +26 −0 Original line number Diff line number Diff line Loading @@ -152,6 +152,32 @@ public class ProximitySensorDualTest extends SysuiTestCase { assertFalse(mProximitySensor.isRegistered()); } @Test public void testUnregisterDuringCallback() { ThresholdSensor.Listener listenerA = event -> mProximitySensor.pause(); TestableListener listenerB = new TestableListener(); assertFalse(mProximitySensor.isRegistered()); mProximitySensor.register(listenerA); mProximitySensor.register(listenerB); assertTrue(mProximitySensor.isRegistered()); assertFalse(mThresholdSensorPrimary.isPaused()); assertTrue(mThresholdSensorSecondary.isPaused()); assertNull(listenerB.mLastEvent); // listenerA will pause the proximity sensor, unregistering it. mThresholdSensorPrimary.triggerEvent(true, 0); mThresholdSensorSecondary.triggerEvent(true, 0); assertTrue(listenerB.mLastEvent.getBelow()); assertEquals(1, listenerB.mCallCount); // A second call to trigger it should be ignored. mThresholdSensorSecondary.triggerEvent(false, 0); assertTrue(listenerB.mLastEvent.getBelow()); assertEquals(1, listenerB.mCallCount); } @Test public void testPauseAndResume() { TestableListener listener = new TestableListener(); Loading