Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit daed6675 authored by Bryce Lee's avatar Bryce Lee
Browse files

Always have ConditionalCoreStartable subscribe to monitor.

Currently, ConditionalCoreStartables bypass subscribing to the
condition monitor if no conditions are specified. However, a
monitor might have preconditions set on it that would be ignored
in this case. This changelist ensures the CoreStartable always
subscribes to that any preconditions from the monitor are
considered.

Test: atest ConditionalCoreStartableTest
Test: atest ConditionMonitorTest
Bug: 261420432
Change-Id: If4e14bca8c51a7568966950c429dae7c16fdf759
parent c0511060
Loading
Loading
Loading
Loading
+0 −10
Original line number Diff line number Diff line
@@ -43,11 +43,6 @@ public abstract class ConditionalCoreStartable implements CoreStartable {

    @Override
    public final void start() {
        if (mConditionSet == null || mConditionSet.isEmpty()) {
            onStart();
            return;
        }

        mStartToken = mMonitor.addSubscription(
                new Monitor.Subscription.Builder(allConditionsMet -> {
                    if (allConditionsMet) {
@@ -63,11 +58,6 @@ public abstract class ConditionalCoreStartable implements CoreStartable {

    @Override
    public final void onBootCompleted() {
        if (mConditionSet == null || mConditionSet.isEmpty()) {
            bootCompleted();
            return;
        }

        mBootCompletedToken = mMonitor.addSubscription(
                new Monitor.Subscription.Builder(allConditionsMet -> {
                    if (allConditionsMet) {
+15 −0
Original line number Diff line number Diff line
@@ -248,6 +248,21 @@ public class ConditionMonitorTest extends SysuiTestCase {
        verify(callback).onConditionsChanged(true);
    }

    @Test
    public void addCallback_preCondition_noConditions_reportAllConditionsMet() {
        final Monitor
                monitor = new Monitor(mExecutor, new HashSet<>(Arrays.asList(mCondition1)));
        final Monitor.Callback callback = mock(
                Monitor.Callback.class);

        monitor.addSubscription(new Monitor.Subscription.Builder(callback).build());
        mExecutor.runAllReady();
        verify(callback, never()).onConditionsChanged(true);
        mCondition1.fakeUpdateCondition(true);
        mExecutor.runAllReady();
        verify(callback).onConditionsChanged(true);
    }

    @Test
    public void removeCallback_noFailureOnDoubleRemove() {
        final Condition condition = mock(
+30 −0
Original line number Diff line number Diff line
@@ -60,6 +60,11 @@ public class ConditionalCoreStartableTest extends SysuiTestCase {
            mCallback = callback;
        }

        public FakeConditionalCoreStartable(Monitor monitor, Callback callback) {
            super(monitor);
            mCallback = callback;
        }

        @Override
        protected void onStart() {
            mCallback.onStart();
@@ -122,6 +127,31 @@ public class ConditionalCoreStartableTest extends SysuiTestCase {
        verify(mMonitor).removeSubscription(mSubscriptionToken);
    }

    @Test
    public void testOnStartCallbackWithNoConditions() {
        final CoreStartable coreStartable =
                new FakeConditionalCoreStartable(mMonitor,
                        mCallback);

        when(mMonitor.addSubscription(any())).thenReturn(mSubscriptionToken);
        coreStartable.start();

        final ArgumentCaptor<Monitor.Subscription> subscriptionCaptor = ArgumentCaptor.forClass(
                Monitor.Subscription.class);
        verify(mMonitor).addSubscription(subscriptionCaptor.capture());

        final Monitor.Subscription subscription = subscriptionCaptor.getValue();

        assertThat(subscription.getConditions()).isEmpty();

        verify(mCallback, never()).onStart();

        subscription.getCallback().onConditionsChanged(true);

        verify(mCallback).onStart();
        verify(mMonitor).removeSubscription(mSubscriptionToken);
    }


    /**
     * Verifies that {@link ConditionalCoreStartable#bootCompleted()} ()} is predicated on