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);