diff --git a/packages/SystemUI/src/com/android/systemui/util/condition/Condition.java b/packages/SystemUI/src/com/android/systemui/util/condition/Condition.java index db35437e77b98..ecb365f43e3f4 100644 --- a/packages/SystemUI/src/com/android/systemui/util/condition/Condition.java +++ b/packages/SystemUI/src/com/android/systemui/util/condition/Condition.java @@ -34,9 +34,26 @@ public abstract class Condition implements CallbackController> mCallbacks = new ArrayList<>(); - private boolean mIsConditionMet = false; + private final boolean mOverriding; + private Boolean mIsConditionMet; private boolean mStarted = false; - private boolean mOverriding = false; + + /** + * By default, conditions have an initial value of false and are not overriding. + */ + public Condition() { + this(false, false); + } + + /** + * Constructor for specifying initial state and overriding condition attribute. + * @param initialConditionMet Initial state of the condition. + * @param overriding Whether this condition overrides others. + */ + protected Condition(Boolean initialConditionMet, boolean overriding) { + mIsConditionMet = initialConditionMet; + mOverriding = overriding; + } /** * Starts monitoring the condition. @@ -48,14 +65,6 @@ public abstract class Condition implements CallbackController> iterator = mCallbacks.iterator(); while (iterator.hasNext()) { final Callback cb = iterator.next().get(); @@ -128,8 +155,21 @@ public abstract class Condition implements CallbackController setConditions = mSubscription.mConditions.stream() + .filter(Condition::isConditionSet).collect(Collectors.toSet()); + // Overriding conditions do not override each other - final Collection overridingConditions = mSubscription.mConditions.stream() + final Collection overridingConditions = setConditions.stream() .filter(Condition::isOverridingCondition).collect(Collectors.toSet()); final Collection targetCollection = overridingConditions.isEmpty() - ? mSubscription.mConditions : overridingConditions; + ? setConditions : overridingConditions; final boolean newAllConditionsMet = targetCollection.isEmpty() ? true : targetCollection .stream() 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 125b3627b3420..17d81c8338cba 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 @@ -73,10 +73,16 @@ public class ConditionMonitorTest extends SysuiTestCase { .addConditions(mConditions); } + private Condition createMockCondition() { + final Condition condition = Mockito.mock(Condition.class); + when(condition.isConditionSet()).thenReturn(true); + return condition; + } + @Test public void testOverridingCondition() { - final Condition overridingCondition = Mockito.mock(Condition.class); - final Condition regularCondition = Mockito.mock(Condition.class); + final Condition overridingCondition = createMockCondition(); + final Condition regularCondition = createMockCondition(); final Monitor.Callback callback = Mockito.mock(Monitor.Callback.class); final Monitor.Callback referenceCallback = Mockito.mock(Monitor.Callback.class); @@ -127,9 +133,9 @@ public class ConditionMonitorTest extends SysuiTestCase { */ @Test public void testMultipleOverridingConditions() { - final Condition overridingCondition = Mockito.mock(Condition.class); - final Condition overridingCondition2 = Mockito.mock(Condition.class); - final Condition regularCondition = Mockito.mock(Condition.class); + final Condition overridingCondition = createMockCondition(); + final Condition overridingCondition2 = createMockCondition(); + final Condition regularCondition = createMockCondition(); final Monitor.Callback callback = Mockito.mock(Monitor.Callback.class); final Monitor monitor = new Monitor(mExecutor); @@ -340,4 +346,114 @@ public class ConditionMonitorTest extends SysuiTestCase { mExecutor.runAllReady(); verify(callback).onConditionsChanged(true); } + + @Test + public void clearCondition_shouldUpdateValue() { + mCondition1.fakeUpdateCondition(false); + mCondition2.fakeUpdateCondition(true); + mCondition3.fakeUpdateCondition(true); + + final Monitor.Callback callback = + mock(Monitor.Callback.class); + mConditionMonitor.addSubscription(getDefaultBuilder(callback).build()); + mExecutor.runAllReady(); + verify(callback).onConditionsChanged(false); + + mCondition1.clearCondition(); + mExecutor.runAllReady(); + verify(callback).onConditionsChanged(true); + } + + @Test + public void unsetCondition_shouldNotAffectValue() { + final FakeCondition settableCondition = new FakeCondition(null, false); + mCondition1.fakeUpdateCondition(true); + mCondition2.fakeUpdateCondition(true); + mCondition3.fakeUpdateCondition(true); + + final Monitor.Callback callback = + mock(Monitor.Callback.class); + + mConditionMonitor.addSubscription(getDefaultBuilder(callback) + .addCondition(settableCondition) + .build()); + + mExecutor.runAllReady(); + verify(callback).onConditionsChanged(true); + } + + @Test + public void setUnsetCondition_shouldAffectValue() { + final FakeCondition settableCondition = new FakeCondition(null, false); + mCondition1.fakeUpdateCondition(true); + mCondition2.fakeUpdateCondition(true); + mCondition3.fakeUpdateCondition(true); + + final Monitor.Callback callback = + mock(Monitor.Callback.class); + + mConditionMonitor.addSubscription(getDefaultBuilder(callback) + .addCondition(settableCondition) + .build()); + + mExecutor.runAllReady(); + verify(callback).onConditionsChanged(true); + clearInvocations(callback); + + settableCondition.fakeUpdateCondition(false); + mExecutor.runAllReady(); + verify(callback).onConditionsChanged(false); + clearInvocations(callback); + + + settableCondition.clearCondition(); + mExecutor.runAllReady(); + verify(callback).onConditionsChanged(true); + } + + @Test + public void clearingOverridingCondition_shouldBeExcluded() { + final FakeCondition overridingCondition = new FakeCondition(true, true); + mCondition1.fakeUpdateCondition(false); + mCondition2.fakeUpdateCondition(false); + mCondition3.fakeUpdateCondition(false); + + final Monitor.Callback callback = + mock(Monitor.Callback.class); + + mConditionMonitor.addSubscription(getDefaultBuilder(callback) + .addCondition(overridingCondition) + .build()); + + mExecutor.runAllReady(); + verify(callback).onConditionsChanged(true); + clearInvocations(callback); + + overridingCondition.clearCondition(); + mExecutor.runAllReady(); + verify(callback).onConditionsChanged(false); + } + + @Test + public void settingUnsetOverridingCondition_shouldBeIncluded() { + final FakeCondition overridingCondition = new FakeCondition(null, true); + mCondition1.fakeUpdateCondition(false); + mCondition2.fakeUpdateCondition(false); + mCondition3.fakeUpdateCondition(false); + + final Monitor.Callback callback = + mock(Monitor.Callback.class); + + mConditionMonitor.addSubscription(getDefaultBuilder(callback) + .addCondition(overridingCondition) + .build()); + + mExecutor.runAllReady(); + verify(callback).onConditionsChanged(false); + clearInvocations(callback); + + overridingCondition.fakeUpdateCondition(true); + mExecutor.runAllReady(); + verify(callback).onConditionsChanged(true); + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/util/condition/ConditionTest.java b/packages/SystemUI/tests/src/com/android/systemui/util/condition/ConditionTest.java index 9e0f863acc1a9..0b53133e93533 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/util/condition/ConditionTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/util/condition/ConditionTest.java @@ -133,4 +133,12 @@ public class ConditionTest extends SysuiTestCase { mCondition.fakeUpdateCondition(false); verify(callback, never()).onConditionChanged(eq(mCondition)); } + + @Test + public void clearCondition_reportsNotSet() { + mCondition.fakeUpdateCondition(false); + assertThat(mCondition.isConditionSet()).isTrue(); + mCondition.clearCondition(); + assertThat(mCondition.isConditionSet()).isFalse(); + } } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/util/condition/FakeCondition.java b/packages/SystemUI/tests/utils/src/com/android/systemui/util/condition/FakeCondition.java index 9d5ccbec87ead..1353ad25d0579 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/util/condition/FakeCondition.java +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/util/condition/FakeCondition.java @@ -21,6 +21,14 @@ package com.android.systemui.util.condition; * condition fulfillment. */ public class FakeCondition extends Condition { + FakeCondition() { + super(); + } + + FakeCondition(Boolean initialValue, Boolean overriding) { + super(initialValue, overriding); + } + @Override public void start() {}