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

Commit d74d239c authored by Beth Thibodeau's avatar Beth Thibodeau Committed by Android (Google) Code Review
Browse files

Merge "Turn session actions on by default and add layout flag"

parents 7c3f1a0c a8069694
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -128,7 +128,8 @@ public class Flags {
    /***************************************/
    // 900 - media
    public static final BooleanFlag MEDIA_TAP_TO_TRANSFER = new BooleanFlag(900, false);
    public static final BooleanFlag MEDIA_SESSION_ACTIONS = new BooleanFlag(901, false);
    public static final BooleanFlag MEDIA_SESSION_ACTIONS = new BooleanFlag(901, true);
    public static final BooleanFlag MEDIA_SESSION_LAYOUT = new BooleanFlag(902, false);

    // Pay no attention to the reflection behind the curtain.
    // ========================== Curtain ==========================
+1 −1
Original line number Diff line number Diff line
@@ -418,7 +418,7 @@ class MediaCarouselController @Inject constructor(
                .elementAtOrNull(mediaCarouselScrollHandler.visibleMediaIndex)
        if (existingPlayer == null) {
            var newPlayer = mediaControlPanelFactory.get()
            if (mediaFlags.areMediaSessionActionsEnabled()) {
            if (mediaFlags.useMediaSessionLayout()) {
                newPlayer.attachPlayer(
                        PlayerSessionViewHolder.create(LayoutInflater.from(context), mediaContent),
                        MediaViewController.TYPE.PLAYER_SESSION)
+19 −0
Original line number Diff line number Diff line
@@ -61,6 +61,7 @@ import com.android.systemui.util.animation.TransitionLayout;
import com.android.systemui.util.time.SystemClock;

import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Executor;

@@ -480,6 +481,24 @@ public class MediaControlPanel {
        List<MediaAction> actionIcons = data.getActions();
        List<Integer> actionsWhenCollapsed = data.getActionsToShowInCompact();

        // If the session actions flag is enabled, but we're still using the regular layout, use
        // the session actions anyways
        if (mMediaFlags.areMediaSessionActionsEnabled() && data.getSemanticActions() != null) {
            MediaButton semanticActions = data.getSemanticActions();

            actionIcons = new ArrayList<MediaAction>();
            actionIcons.add(semanticActions.getStartCustom());
            actionIcons.add(semanticActions.getPrevOrCustom());
            actionIcons.add(semanticActions.getPlayOrPause());
            actionIcons.add(semanticActions.getNextOrCustom());
            actionIcons.add(semanticActions.getEndCustom());

            actionsWhenCollapsed = new ArrayList<Integer>();
            actionsWhenCollapsed.add(1);
            actionsWhenCollapsed.add(2);
            actionsWhenCollapsed.add(3);
        }

        int i = 0;
        for (; i < actionIcons.size() && i < ACTION_IDS.length; i++) {
            int actionId = ACTION_IDS[i];
+8 −0
Original line number Diff line number Diff line
@@ -29,4 +29,12 @@ class MediaFlags @Inject constructor(private val featureFlags: FeatureFlags) {
    fun areMediaSessionActionsEnabled(): Boolean {
        return featureFlags.isEnabled(Flags.MEDIA_SESSION_ACTIONS)
    }

    /**
     * Check whether media controls should use the new session-based layout
     */
    fun useMediaSessionLayout(): Boolean {
        return featureFlags.isEnabled(Flags.MEDIA_SESSION_ACTIONS) &&
            featureFlags.isEnabled(Flags.MEDIA_SESSION_LAYOUT)
    }
}
 No newline at end of file
+41 −1
Original line number Diff line number Diff line
@@ -202,6 +202,7 @@ public class MediaControlPanelTest : SysuiTestCase() {
                resumeAction = null)

        whenever(mediaFlags.areMediaSessionActionsEnabled()).thenReturn(false)
        whenever(mediaFlags.useMediaSessionLayout()).thenReturn(false)
    }

    /** Mock view holder for the notification player */
@@ -301,8 +302,47 @@ public class MediaControlPanelTest : SysuiTestCase() {
    }

    @Test
    fun bindSemanticActions() {
    fun bindSemanticActionsOldLayout() {
        whenever(mediaFlags.areMediaSessionActionsEnabled()).thenReturn(true)
        whenever(mediaFlags.useMediaSessionLayout()).thenReturn(false)

        val icon = Icon.createWithResource(context, android.R.drawable.ic_media_play)
        val semanticActions = MediaButton(
            playOrPause = MediaAction(icon, Runnable {}, "play"),
            nextOrCustom = MediaAction(icon, Runnable {}, "next"),
            startCustom = MediaAction(icon, null, "custom 1"),
            endCustom = MediaAction(icon, null, "custom 2")
        )
        val state = mediaData.copy(semanticActions = semanticActions)

        player.attachPlayer(holder, MediaViewController.TYPE.PLAYER)
        player.bindPlayer(state, PACKAGE)

        verify(expandedSet).setVisibility(R.id.action0, ConstraintSet.VISIBLE)
        assertThat(action0.contentDescription).isEqualTo("custom 1")
        assertThat(action0.isEnabled()).isFalse()

        verify(expandedSet).setVisibility(R.id.action1, ConstraintSet.INVISIBLE)
        assertThat(action1.isEnabled()).isFalse()

        verify(expandedSet).setVisibility(R.id.action2, ConstraintSet.VISIBLE)
        assertThat(action2.isEnabled()).isTrue()
        assertThat(action2.contentDescription).isEqualTo("play")

        verify(expandedSet).setVisibility(R.id.action3, ConstraintSet.VISIBLE)
        assertThat(action3.isEnabled()).isTrue()
        assertThat(action3.contentDescription).isEqualTo("next")

        verify(expandedSet).setVisibility(R.id.action4, ConstraintSet.VISIBLE)
        assertThat(action4.contentDescription).isEqualTo("custom 2")
        assertThat(action4.isEnabled()).isFalse()
    }

    @Test
    fun bindSemanticActionsNewLayout() {
        whenever(mediaFlags.areMediaSessionActionsEnabled()).thenReturn(true)
        whenever(mediaFlags.useMediaSessionLayout()).thenReturn(true)

        val icon = Icon.createWithResource(context, android.R.drawable.ic_media_play)
        val semanticActions = MediaButton(
                playOrPause = MediaAction(icon, Runnable {}, "play"),