Merge "More defensive checks for ProximitySensor" into rvc-d1-dev am: 8ce8c004a4

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/11893834

Change-Id: I9418208460380e74aa403f4135d0df7dfc9cb224
This commit is contained in:
TreeHugger Robot
2020-06-18 22:35:37 +00:00
committed by Automerger Merge Worker
2 changed files with 36 additions and 4 deletions

View File

@@ -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;
@@ -100,7 +103,9 @@ public class ProximitySensor implements ThresholdSensor {
}
logDebug("Secondary sensor event: " + event.getBelow() + ".");
onSensorEvent(event);
if (!mPaused) {
onSensorEvent(event);
}
}
};
@@ -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);

View File

@@ -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();