diff options
| author | 2022-06-30 03:24:52 +0000 | |
|---|---|---|
| committer | 2022-06-30 03:24:52 +0000 | |
| commit | dedd662b9f09f611bd65c12ac275a69eb9216a0c (patch) | |
| tree | 07efb470eb3bdc673494b33bcb690d3da6ed3eca | |
| parent | eaa809568c7e3103dcc35259633f0ee4fa185183 (diff) | |
| parent | dfc5118d0fefcb8138003e525c6e3c3072befa45 (diff) | |
Merge "Check condition presence before updating callbacks." into tm-qpr-dev am: dfc5118d0f
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/19118855
Change-Id: If9fa976626a3c041b5fd40bd387a91718f16e661
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
| -rw-r--r-- | packages/SystemUI/src/com/android/systemui/util/condition/Monitor.java | 10 | ||||
| -rw-r--r-- | packages/SystemUI/tests/src/com/android/systemui/util/condition/ConditionMonitorTest.java | 18 |
2 files changed, 27 insertions, 1 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/util/condition/Monitor.java b/packages/SystemUI/src/com/android/systemui/util/condition/Monitor.java index 4e9030f8045c..dac8a0bff28a 100644 --- a/packages/SystemUI/src/com/android/systemui/util/condition/Monitor.java +++ b/packages/SystemUI/src/com/android/systemui/util/condition/Monitor.java @@ -92,7 +92,15 @@ public class Monitor { } private void updateConditionMetState(Condition condition) { - mConditions.get(condition).stream().forEach(token -> mSubscriptions.get(token).update()); + final ArraySet<Subscription.Token> subscriptions = mConditions.get(condition); + + // It's possible the condition was removed between the time the callback occurred and + // update was executed on the main thread. + if (subscriptions == null) { + return; + } + + subscriptions.stream().forEach(token -> mSubscriptions.get(token).update()); } /** diff --git a/packages/SystemUI/tests/src/com/android/systemui/util/condition/ConditionMonitorTest.java b/packages/SystemUI/tests/src/com/android/systemui/util/condition/ConditionMonitorTest.java index 1e35b0f0e68a..125b3627b342 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/util/condition/ConditionMonitorTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/util/condition/ConditionMonitorTest.java @@ -159,6 +159,24 @@ public class ConditionMonitorTest extends SysuiTestCase { Mockito.clearInvocations(callback); } + // Ensure that updating a callback that is removed doesn't result in an exception due to the + // absence of the condition. + @Test + public void testUpdateRemovedCallback() { + final Monitor.Callback callback1 = + mock(Monitor.Callback.class); + final Monitor.Subscription.Token subscription1 = + mConditionMonitor.addSubscription(getDefaultBuilder(callback1).build()); + ArgumentCaptor<Condition.Callback> monitorCallback = + ArgumentCaptor.forClass(Condition.Callback.class); + mExecutor.runAllReady(); + verify(mCondition1).addCallback(monitorCallback.capture()); + // This will execute first before the handler for onConditionChanged. + mConditionMonitor.removeSubscription(subscription1); + monitorCallback.getValue().onConditionChanged(mCondition1); + mExecutor.runAllReady(); + } + @Test public void addCallback_addFirstCallback_addCallbackToAllConditions() { final Monitor.Callback callback1 = |