diff options
5 files changed, 71 insertions, 3 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/flags/Flags.java b/packages/SystemUI/src/com/android/systemui/flags/Flags.java index 6580b189da07..4be819a49772 100644 --- a/packages/SystemUI/src/com/android/systemui/flags/Flags.java +++ b/packages/SystemUI/src/com/android/systemui/flags/Flags.java @@ -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 ========================== diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt b/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt index 29321b46328a..c404f7aa0fb4 100644 --- a/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt +++ b/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt @@ -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) diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java b/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java index 3c237223e31a..69a7ec3447aa 100644 --- a/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java +++ b/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java @@ -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]; diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaFlags.kt b/packages/SystemUI/src/com/android/systemui/media/MediaFlags.kt index b4a4b42d1509..b9795f1265fa 100644 --- a/packages/SystemUI/src/com/android/systemui/media/MediaFlags.kt +++ b/packages/SystemUI/src/com/android/systemui/media/MediaFlags.kt @@ -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 diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt index 7763e75ae40b..140a395f1e27 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt @@ -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"), |