summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Jeff DeCew <jeffdq@google.com> 2024-08-02 16:13:04 +0000
committer Jeff DeCew <jeffdq@google.com> 2024-08-03 00:18:45 +0000
commit2b551e71401c698cb389d322d665fc1d9464de43 (patch)
tree607212dbbea42ad65b2d3796689ddd5d6b3aa855
parentc9a43de047db2b19e97282165cee0e231188c72e (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.java6
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);
}
}