diff options
| author | 2024-08-02 16:13:04 +0000 | |
|---|---|---|
| committer | 2024-08-03 00:18:45 +0000 | |
| commit | 2b551e71401c698cb389d322d665fc1d9464de43 (patch) | |
| tree | 607212dbbea42ad65b2d3796689ddd5d6b3aa855 | |
| parent | c9a43de047db2b19e97282165cee0e231188c72e (diff) | |
Fix ProximityCheck so that re-entrant check calls callback.
This is a followup for I9083d6e87ad199099c117f00dcdc9e7e811435f5.
The test for re-entrant `check` calls, demonstrated that the original CL fixed the ConcurrentModificationException, but also that the check() callback was never invoked. Unregistering before the foreach fixes that.
Test: atest ProximityCheckTest
Flag: EXEMPT bugfix
Bug: 354293532
Change-Id: If4f6d0bd072b0aecf49e8b0e19e358a5a34409a4
| -rw-r--r-- | packages/SystemUI/multivalentTests/src/com/android/systemui/util/sensors/ProximityCheckTest.java (renamed from packages/SystemUI/tests/src/com/android/systemui/util/sensors/ProximityCheckTest.java) | 20 | ||||
| -rw-r--r-- | packages/SystemUI/src/com/android/systemui/util/sensors/ProximityCheck.java | 6 |
2 files changed, 24 insertions, 2 deletions
diff --git a/packages/SystemUI/tests/src/com/android/systemui/util/sensors/ProximityCheckTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/util/sensors/ProximityCheckTest.java index 5dd008ac10f7..0eea120e4de0 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/util/sensors/ProximityCheckTest.java +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/util/sensors/ProximityCheckTest.java @@ -74,6 +74,26 @@ public class ProximityCheckTest extends SysuiTestCase { } @Test + public void testRecursiveCheck() { + mProximityCheck.check(100, event-> mProximityCheck.check(100, mTestableCallback)); + + assertThat(mTestableCallback.mNumCalls).isEqualTo(0); + assertThat(mTestableCallback.mLastResult).isNull(); + + mFakeExecutor.advanceClockToNext(); + mFakeExecutor.runAllReady(); + + assertThat(mTestableCallback.mNumCalls).isEqualTo(0); + assertThat(mTestableCallback.mLastResult).isNull(); + + mFakeProximitySensor.setLastEvent(new ThresholdSensorEvent(true, 0)); + mFakeProximitySensor.alertListeners(); + + assertThat(mTestableCallback.mNumCalls).isEqualTo(1); + assertThat(mTestableCallback.mLastResult).isTrue(); + } + + @Test public void testTimeout() { mProximityCheck.check(100, mTestableCallback); diff --git a/packages/SystemUI/src/com/android/systemui/util/sensors/ProximityCheck.java b/packages/SystemUI/src/com/android/systemui/util/sensors/ProximityCheck.java index 373417b7bd68..5b9a6c556ec6 100644 --- a/packages/SystemUI/src/com/android/systemui/util/sensors/ProximityCheck.java +++ b/packages/SystemUI/src/com/android/systemui/util/sensors/ProximityCheck.java @@ -86,13 +86,15 @@ public class ProximityCheck implements Runnable { } private void onProximityEvent(ThresholdSensorEvent proximityEvent) { + // Move the callbacks to a local to avoid ConcurrentModificationException List<Consumer<Boolean>> oldCallbacks = mCallbacks; mCallbacks = new ArrayList<>(); + // Unregister from the ProximitySensor to ensure a re-entrant check will re-register + unregister(); + // Notify the callbacks oldCallbacks.forEach( booleanConsumer -> booleanConsumer.accept( proximityEvent == null ? null : proximityEvent.getBelow())); - unregister(); - mRegistered.set(false); } } |