From 9d21051c22dad038e062e045ebc00993ceda4a1d Mon Sep 17 00:00:00 2001 From: tonihei Date: Tue, 16 Nov 2021 15:44:10 +0000 Subject: [PATCH] Remove disabled types in StyledPlayerControlView when selecting tracks. When selecting an explicit track or "Auto", we need to remove any existing track type disabling. Otherwise the track override won't work. Issue: google/ExoPlayer#9692 PiperOrigin-RevId: 410250313 --- .../media3/ui/StyledPlayerControlView.java | 50 +++++++------------ 1 file changed, 18 insertions(+), 32 deletions(-) diff --git a/libraries/ui/src/main/java/androidx/media3/ui/StyledPlayerControlView.java b/libraries/ui/src/main/java/androidx/media3/ui/StyledPlayerControlView.java index 11d1a3da24..c863b762ae 100644 --- a/libraries/ui/src/main/java/androidx/media3/ui/StyledPlayerControlView.java +++ b/libraries/ui/src/main/java/androidx/media3/ui/StyledPlayerControlView.java @@ -80,8 +80,10 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Formatter; +import java.util.HashSet; import java.util.List; import java.util.Locale; +import java.util.Set; import java.util.concurrent.CopyOnWriteArrayList; /** @@ -1936,19 +1938,13 @@ public class StyledPlayerControlView extends FrameLayout { private static final class TrackInformation { - private TracksInfo tracksInfo; - private int trackGroupIndex; public final TrackGroupInfo trackGroupInfo; - public final TrackGroup trackGroup; public final int trackIndex; public final String trackName; public TrackInformation( TracksInfo tracksInfo, int trackGroupIndex, int trackIndex, String trackName) { - this.tracksInfo = tracksInfo; - this.trackGroupIndex = trackGroupIndex; this.trackGroupInfo = tracksInfo.getTrackGroupInfos().get(trackGroupIndex); - this.trackGroup = trackGroupInfo.getTrackGroup(); this.trackIndex = trackIndex; this.trackName = trackName; } @@ -2047,11 +2043,15 @@ public class StyledPlayerControlView extends FrameLayout { .buildUpon() .clearOverridesOfType(C.TRACK_TYPE_AUDIO) .build(); + Set<@C.TrackType Integer> disabledTrackTypes = + new HashSet<>(trackSelectionParameters.disabledTrackTypes); + disabledTrackTypes.remove(C.TRACK_TYPE_AUDIO); castNonNull(player) .setTrackSelectionParameters( trackSelectionParameters .buildUpon() .setTrackSelectionOverrides(trackSelectionOverrides) + .setDisabledTrackTypes(disabledTrackTypes) .build()); settingsAdapter.setSubTextAtPosition( SETTINGS_AUDIO_TRACK_SELECTION_POSITION, @@ -2061,16 +2061,11 @@ public class StyledPlayerControlView extends FrameLayout { } private boolean hasSelectionOverride(TrackSelectionOverrides trackSelectionOverrides) { - int previousTrackGroupIndex = C.INDEX_UNSET; for (int i = 0; i < tracks.size(); i++) { - TrackInformation track = tracks.get(i); - if (track.trackGroupIndex == previousTrackGroupIndex) { - continue; - } - if (trackSelectionOverrides.getOverride(track.trackGroup) != null) { + TrackGroup trackGroup = tracks.get(i).trackGroupInfo.getTrackGroup(); + if (trackSelectionOverrides.getOverride(trackGroup) != null) { return true; } - previousTrackGroupIndex = track.trackGroupIndex; } return false; } @@ -2083,24 +2078,14 @@ public class StyledPlayerControlView extends FrameLayout { @Override public void init(List trackInformations) { // Update subtext in settings menu with current audio track selection. - boolean hasSelectionOverride = false; - for (int i = 0; i < trackInformations.size(); i++) { - if (checkNotNull(player) - .getTrackSelectionParameters() - .trackSelectionOverrides - .getOverride(trackInformations.get(i).trackGroup) - != null) { - hasSelectionOverride = true; - break; - } - } + TrackSelectionParameters params = checkNotNull(player).getTrackSelectionParameters(); if (trackInformations.isEmpty()) { settingsAdapter.setSubTextAtPosition( SETTINGS_AUDIO_TRACK_SELECTION_POSITION, getResources().getString(R.string.exo_track_selection_none)); // TODO(insun) : Make the audio item in main settings (settingsAdapater) // to be non-clickable. - } else if (!hasSelectionOverride) { + } else if (!hasSelectionOverride(params.trackSelectionOverrides)) { settingsAdapter.setSubTextAtPosition( SETTINGS_AUDIO_TRACK_SELECTION_POSITION, getResources().getString(R.string.exo_track_selection_auto)); @@ -2150,13 +2135,10 @@ public class StyledPlayerControlView extends FrameLayout { onBindViewHolderAtZeroPosition(holder); } else { TrackInformation track = tracks.get(position - 1); + TrackGroup trackGroup = track.trackGroupInfo.getTrackGroup(); + TrackSelectionParameters params = checkNotNull(player).getTrackSelectionParameters(); boolean explicitlySelected = - checkNotNull(player) - .getTrackSelectionParameters() - .trackSelectionOverrides - .getOverride(track.trackGroup) - != null - && track.isSelected(); + params.trackSelectionOverrides.getOverride(trackGroup) != null && track.isSelected(); holder.textView.setText(track.trackName); holder.checkView.setVisibility(explicitlySelected ? VISIBLE : INVISIBLE); holder.itemView.setOnClickListener( @@ -2172,13 +2154,17 @@ public class StyledPlayerControlView extends FrameLayout { .buildUpon() .setOverrideForType( new TrackSelectionOverride( - track.trackGroup, ImmutableList.of(track.trackIndex))) + trackGroup, ImmutableList.of(track.trackIndex))) .build(); + Set<@C.TrackType Integer> disabledTrackTypes = + new HashSet<>(trackSelectionParameters.disabledTrackTypes); + disabledTrackTypes.remove(track.trackGroupInfo.getTrackType()); checkNotNull(player) .setTrackSelectionParameters( trackSelectionParameters .buildUpon() .setTrackSelectionOverrides(overrides) + .setDisabledTrackTypes(disabledTrackTypes) .build()); onTrackSelection(track.trackName); settingsWindow.dismiss();