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>
This commit is contained in:
Bryce Lee
2022-06-30 03:24:52 +00:00
committed by Automerger Merge Worker
2 changed files with 27 additions and 1 deletions

View File

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

View File

@@ -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 =