From 59594bee0eaf34b0737c5110bda4ccfc2db63959 Mon Sep 17 00:00:00 2001 From: Darrell Shi Date: Fri, 11 Feb 2022 01:50:23 +0000 Subject: [PATCH] Monitor add callback uniqueness. Only allow the same instance of callback registered once in the conditions monitor. Test: atest ConditionMonitorTest#addCallback_withMultipleInstancesOfTheSameCallback_registerOnlyOne Fix: 218921598 Change-Id: Ibbce271446e4039759e27bf889c4c672ac026c16 --- .../android/systemui/util/condition/Monitor.java | 4 ++++ .../util/condition/ConditionMonitorTest.java | 15 +++++++++++++++ 2 files changed, 19 insertions(+) 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 7f3d54dcfee50..d3c6e9aa0da93 100644 --- a/packages/SystemUI/src/com/android/systemui/util/condition/Monitor.java +++ b/packages/SystemUI/src/com/android/systemui/util/condition/Monitor.java @@ -145,6 +145,10 @@ public class Monitor implements CallbackController { } private void addCallbackLocked(@NotNull Callback callback) { + if (mCallbacks.contains(callback)) { + return; + } + if (shouldLog()) Log.d(mTag, "adding callback"); mCallbacks.add(callback); 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 dff77f389faf7..5118637ea710e 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 @@ -194,6 +194,21 @@ public class ConditionMonitorTest extends SysuiTestCase { verify(callback).onConditionsChanged(true); } + @Test + public void addCallback_withMultipleInstancesOfTheSameCallback_registerOnlyOne() { + final Monitor monitor = new Monitor(mExecutor, new HashSet<>(), null /*callbacks*/); + final Monitor.Callback callback = mock(Monitor.Callback.class); + + // Adds the same instance multiple times. + monitor.addCallback(callback); + monitor.addCallback(callback); + monitor.addCallback(callback); + mExecutor.runAllReady(); + + // Callback should only be triggered once. + verify(callback, times(1)).onConditionsChanged(true); + } + @Test public void removeCallback_shouldNoLongerReceiveUpdate() { final Condition condition = mock(Condition.class);