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

Commit 65cdbc49 authored by Victor Truong's avatar Victor Truong
Browse files

Show Dream Home Controls regardless of overlay on dream.

Bug: 271326553
Bug: 273509374
Test: Manually tested to see home controls on all dreams regardless if
the dream uses the dream overlay or not.

Change-Id: I0f4da282f86a6087c48d5794a7b978e946104015
parent e80546ca
Loading
Loading
Loading
Loading
+16 −2
Original line number Original line Diff line number Diff line
@@ -27,6 +27,8 @@ import com.android.internal.annotations.VisibleForTesting;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.dreams.complication.Complication;
import com.android.systemui.dreams.complication.Complication;
import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.flags.Flags;
import com.android.systemui.statusbar.policy.CallbackController;
import com.android.systemui.statusbar.policy.CallbackController;


import java.util.ArrayList;
import java.util.ArrayList;
@@ -104,12 +106,24 @@ public class DreamOverlayStateController implements


    private final Collection<Complication> mComplications = new HashSet();
    private final Collection<Complication> mComplications = new HashSet();


    private final FeatureFlags mFeatureFlags;

    private final int mSupportedTypes;

    @VisibleForTesting
    @VisibleForTesting
    @Inject
    @Inject
    public DreamOverlayStateController(@Main Executor executor,
    public DreamOverlayStateController(@Main Executor executor,
            @Named(DREAM_OVERLAY_ENABLED) boolean overlayEnabled) {
            @Named(DREAM_OVERLAY_ENABLED) boolean overlayEnabled,
            FeatureFlags featureFlags) {
        mExecutor = executor;
        mExecutor = executor;
        mOverlayEnabled = overlayEnabled;
        mOverlayEnabled = overlayEnabled;
        mFeatureFlags = featureFlags;
        if (mFeatureFlags.isEnabled(Flags.ALWAYS_SHOW_HOME_CONTROLS_ON_DREAMS)) {
            mSupportedTypes = Complication.COMPLICATION_TYPE_NONE
                    | Complication.COMPLICATION_TYPE_HOME_CONTROLS;
        } else {
            mSupportedTypes = Complication.COMPLICATION_TYPE_NONE;
        }
        if (DEBUG) {
        if (DEBUG) {
            Log.d(TAG, "Dream overlay enabled:" + mOverlayEnabled);
            Log.d(TAG, "Dream overlay enabled:" + mOverlayEnabled);
        }
        }
@@ -181,7 +195,7 @@ public class DreamOverlayStateController implements
                    if (mShouldShowComplications) {
                    if (mShouldShowComplications) {
                        return (requiredTypes & getAvailableComplicationTypes()) == requiredTypes;
                        return (requiredTypes & getAvailableComplicationTypes()) == requiredTypes;
                    }
                    }
                    return requiredTypes == Complication.COMPLICATION_TYPE_NONE;
                    return (requiredTypes & mSupportedTypes) == requiredTypes;
                })
                })
                .collect(Collectors.toCollection(HashSet::new))
                .collect(Collectors.toCollection(HashSet::new))
                : mComplications);
                : mComplications);
+5 −0
Original line number Original line Diff line number Diff line
@@ -426,6 +426,11 @@ object Flags {
        1004,
        1004,
        "enable_low_light_clock_undocked", teamfood = true)
        "enable_low_light_clock_undocked", teamfood = true)


    // TODO(b/273509374): Tracking Bug
    @JvmField
    val ALWAYS_SHOW_HOME_CONTROLS_ON_DREAMS = unreleasedFlag(1006,
        "always_show_home_controls_on_dreams")

    // 1100 - windowing
    // 1100 - windowing
    @Keep
    @Keep
    @JvmField
    @JvmField
+65 −24
Original line number Original line Diff line number Diff line
@@ -32,6 +32,8 @@ import androidx.test.filters.SmallTest;


import com.android.systemui.SysuiTestCase;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.dreams.complication.Complication;
import com.android.systemui.dreams.complication.Complication;
import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.flags.Flags;
import com.android.systemui.util.concurrency.FakeExecutor;
import com.android.systemui.util.concurrency.FakeExecutor;
import com.android.systemui.util.time.FakeSystemClock;
import com.android.systemui.util.time.FakeSystemClock;


@@ -53,17 +55,21 @@ public class DreamOverlayStateControllerTest extends SysuiTestCase {
    @Mock
    @Mock
    Complication mComplication;
    Complication mComplication;


    @Mock
    private FeatureFlags mFeatureFlags;

    final FakeExecutor mExecutor = new FakeExecutor(new FakeSystemClock());
    final FakeExecutor mExecutor = new FakeExecutor(new FakeSystemClock());


    @Before
    @Before
    public void setup() {
    public void setup() {
        MockitoAnnotations.initMocks(this);
        MockitoAnnotations.initMocks(this);

        when(mFeatureFlags.isEnabled(Flags.ALWAYS_SHOW_HOME_CONTROLS_ON_DREAMS)).thenReturn(false);
    }
    }


    @Test
    @Test
    public void testStateChange_overlayActive() {
    public void testStateChange_overlayActive() {
        final DreamOverlayStateController stateController = new DreamOverlayStateController(
        final DreamOverlayStateController stateController = getDreamOverlayStateController(true);
                mExecutor, true);
        stateController.addCallback(mCallback);
        stateController.addCallback(mCallback);
        stateController.setOverlayActive(true);
        stateController.setOverlayActive(true);
        mExecutor.runAllReady();
        mExecutor.runAllReady();
@@ -84,8 +90,7 @@ public class DreamOverlayStateControllerTest extends SysuiTestCase {


    @Test
    @Test
    public void testCallback() {
    public void testCallback() {
        final DreamOverlayStateController stateController = new DreamOverlayStateController(
        final DreamOverlayStateController stateController = getDreamOverlayStateController(true);
                mExecutor, true);
        stateController.addCallback(mCallback);
        stateController.addCallback(mCallback);


        // Add complication and verify callback is notified.
        // Add complication and verify callback is notified.
@@ -110,8 +115,7 @@ public class DreamOverlayStateControllerTest extends SysuiTestCase {


    @Test
    @Test
    public void testNotifyOnCallbackAdd() {
    public void testNotifyOnCallbackAdd() {
        final DreamOverlayStateController stateController =
        final DreamOverlayStateController stateController = getDreamOverlayStateController(true);
                new DreamOverlayStateController(mExecutor, true);


        stateController.addComplication(mComplication);
        stateController.addComplication(mComplication);
        mExecutor.runAllReady();
        mExecutor.runAllReady();
@@ -124,8 +128,7 @@ public class DreamOverlayStateControllerTest extends SysuiTestCase {


    @Test
    @Test
    public void testNotifyOnCallbackAddOverlayDisabled() {
    public void testNotifyOnCallbackAddOverlayDisabled() {
        final DreamOverlayStateController stateController =
        final DreamOverlayStateController stateController = getDreamOverlayStateController(false);
                new DreamOverlayStateController(mExecutor, false);


        stateController.addComplication(mComplication);
        stateController.addComplication(mComplication);
        mExecutor.runAllReady();
        mExecutor.runAllReady();
@@ -139,8 +142,7 @@ public class DreamOverlayStateControllerTest extends SysuiTestCase {


    @Test
    @Test
    public void testComplicationFilteringWhenShouldShowComplications() {
    public void testComplicationFilteringWhenShouldShowComplications() {
        final DreamOverlayStateController stateController =
        final DreamOverlayStateController stateController = getDreamOverlayStateController(true);
                new DreamOverlayStateController(mExecutor, true);
        stateController.setShouldShowComplications(true);
        stateController.setShouldShowComplications(true);


        final Complication alwaysAvailableComplication = Mockito.mock(Complication.class);
        final Complication alwaysAvailableComplication = Mockito.mock(Complication.class);
@@ -179,8 +181,7 @@ public class DreamOverlayStateControllerTest extends SysuiTestCase {


    @Test
    @Test
    public void testComplicationFilteringWhenShouldHideComplications() {
    public void testComplicationFilteringWhenShouldHideComplications() {
        final DreamOverlayStateController stateController =
        final DreamOverlayStateController stateController = getDreamOverlayStateController(true);
                new DreamOverlayStateController(mExecutor, true);
        stateController.setShouldShowComplications(true);
        stateController.setShouldShowComplications(true);


        final Complication alwaysAvailableComplication = Mockito.mock(Complication.class);
        final Complication alwaysAvailableComplication = Mockito.mock(Complication.class);
@@ -226,8 +227,7 @@ public class DreamOverlayStateControllerTest extends SysuiTestCase {
    @Test
    @Test
    public void testComplicationWithNoTypeNotFiltered() {
    public void testComplicationWithNoTypeNotFiltered() {
        final Complication complication = Mockito.mock(Complication.class);
        final Complication complication = Mockito.mock(Complication.class);
        final DreamOverlayStateController stateController =
        final DreamOverlayStateController stateController = getDreamOverlayStateController(true);
                new DreamOverlayStateController(mExecutor, true);
        stateController.addComplication(complication);
        stateController.addComplication(complication);
        mExecutor.runAllReady();
        mExecutor.runAllReady();
        assertThat(stateController.getComplications(true).contains(complication))
        assertThat(stateController.getComplications(true).contains(complication))
@@ -236,8 +236,7 @@ public class DreamOverlayStateControllerTest extends SysuiTestCase {


    @Test
    @Test
    public void testNotifyLowLightChanged() {
    public void testNotifyLowLightChanged() {
        final DreamOverlayStateController stateController =
        final DreamOverlayStateController stateController = getDreamOverlayStateController(true);
                new DreamOverlayStateController(mExecutor, true);


        stateController.addCallback(mCallback);
        stateController.addCallback(mCallback);
        mExecutor.runAllReady();
        mExecutor.runAllReady();
@@ -252,8 +251,7 @@ public class DreamOverlayStateControllerTest extends SysuiTestCase {


    @Test
    @Test
    public void testNotifyLowLightExit() {
    public void testNotifyLowLightExit() {
        final DreamOverlayStateController stateController =
        final DreamOverlayStateController stateController = getDreamOverlayStateController(true);
                new DreamOverlayStateController(mExecutor, true);


        stateController.addCallback(mCallback);
        stateController.addCallback(mCallback);
        mExecutor.runAllReady();
        mExecutor.runAllReady();
@@ -276,8 +274,7 @@ public class DreamOverlayStateControllerTest extends SysuiTestCase {


    @Test
    @Test
    public void testNotifyEntryAnimationsFinishedChanged() {
    public void testNotifyEntryAnimationsFinishedChanged() {
        final DreamOverlayStateController stateController =
        final DreamOverlayStateController stateController = getDreamOverlayStateController(true);
                new DreamOverlayStateController(mExecutor, true);


        stateController.addCallback(mCallback);
        stateController.addCallback(mCallback);
        mExecutor.runAllReady();
        mExecutor.runAllReady();
@@ -292,8 +289,7 @@ public class DreamOverlayStateControllerTest extends SysuiTestCase {


    @Test
    @Test
    public void testNotifyDreamOverlayStatusBarVisibleChanged() {
    public void testNotifyDreamOverlayStatusBarVisibleChanged() {
        final DreamOverlayStateController stateController =
        final DreamOverlayStateController stateController = getDreamOverlayStateController(true);
                new DreamOverlayStateController(mExecutor, true);


        stateController.addCallback(mCallback);
        stateController.addCallback(mCallback);
        mExecutor.runAllReady();
        mExecutor.runAllReady();
@@ -308,8 +304,7 @@ public class DreamOverlayStateControllerTest extends SysuiTestCase {


    @Test
    @Test
    public void testNotifyHasAssistantAttentionChanged() {
    public void testNotifyHasAssistantAttentionChanged() {
        final DreamOverlayStateController stateController =
        final DreamOverlayStateController stateController = getDreamOverlayStateController(true);
                new DreamOverlayStateController(mExecutor, true);


        stateController.addCallback(mCallback);
        stateController.addCallback(mCallback);
        mExecutor.runAllReady();
        mExecutor.runAllReady();
@@ -321,4 +316,50 @@ public class DreamOverlayStateControllerTest extends SysuiTestCase {
        verify(mCallback, times(1)).onStateChanged();
        verify(mCallback, times(1)).onStateChanged();
        assertThat(stateController.hasAssistantAttention()).isTrue();
        assertThat(stateController.hasAssistantAttention()).isTrue();
    }
    }

    @Test
    public void testShouldShowComplicationsSetToFalse_stillShowsHomeControls_featureEnabled() {
        when(mFeatureFlags.isEnabled(Flags.ALWAYS_SHOW_HOME_CONTROLS_ON_DREAMS)).thenReturn(true);

        final DreamOverlayStateController stateController = getDreamOverlayStateController(true);
        stateController.setShouldShowComplications(true);

        final Complication homeControlsComplication = Mockito.mock(Complication.class);
        when(homeControlsComplication.getRequiredTypeAvailability())
                .thenReturn(Complication.COMPLICATION_TYPE_HOME_CONTROLS);

        stateController.addComplication(homeControlsComplication);

        final DreamOverlayStateController.Callback callback =
                Mockito.mock(DreamOverlayStateController.Callback.class);

        stateController.setAvailableComplicationTypes(
                Complication.COMPLICATION_TYPE_HOME_CONTROLS);
        stateController.addCallback(callback);
        mExecutor.runAllReady();

        {
            clearInvocations(callback);
            stateController.setShouldShowComplications(true);
            mExecutor.runAllReady();

            verify(callback).onAvailableComplicationTypesChanged();
            final Collection<Complication> complications = stateController.getComplications();
            assertThat(complications.contains(homeControlsComplication)).isTrue();
        }

        {
            clearInvocations(callback);
            stateController.setShouldShowComplications(false);
            mExecutor.runAllReady();

            verify(callback).onAvailableComplicationTypesChanged();
            final Collection<Complication> complications = stateController.getComplications();
            assertThat(complications.contains(homeControlsComplication)).isTrue();
        }
    }

    private DreamOverlayStateController getDreamOverlayStateController(boolean overlayEnabled) {
        return new DreamOverlayStateController(mExecutor, overlayEnabled, mFeatureFlags);
    }
}
}