diff --git a/demos/main/src/main/java/com/google/android/exoplayer2/demo/DownloadTracker.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/DownloadTracker.java index ed12353687..13e75ca9c2 100644 --- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/DownloadTracker.java +++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/DownloadTracker.java @@ -36,9 +36,6 @@ import com.google.android.exoplayer2.offline.DownloadState; import com.google.android.exoplayer2.offline.DownloadStateCursor; import com.google.android.exoplayer2.offline.StreamKey; import com.google.android.exoplayer2.scheduler.Requirements; -import com.google.android.exoplayer2.source.TrackGroupArray; -import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; -import com.google.android.exoplayer2.trackselection.DefaultTrackSelector.SelectionOverride; import com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo; import com.google.android.exoplayer2.upstream.DataSource; import com.google.android.exoplayer2.util.Log; @@ -290,37 +287,17 @@ public class DownloadTracker implements DownloadManager.Listener { @Override public void onClick(DialogInterface dialog, int which) { - DefaultTrackSelector.ParametersBuilder builder = - DownloadHelper.DEFAULT_TRACK_SELECTOR_PARAMETERS.buildUpon(); - for (int i = 0; i < mappedTrackInfo.getRendererCount(); i++) { - builder.setRendererDisabled(/* rendererIndex= */ i, /* disabled= */ true); - } - for (int i = 0; i < downloadHelper.getPeriodCount(); i++) { - downloadHelper.clearTrackSelections(/* periodIndex = */ i); - } - for (int i = 0; i < mappedTrackInfo.getRendererCount(); i++) { - if (trackSelectionDialog.getIsDisabled(/* rendererIndex= */ i)) { - continue; - } - builder.setRendererDisabled(/* rendererIndex= */ i, /* disabled= */ false); - List overrides = - trackSelectionDialog.getOverrides(/* rendererIndex= */ i); - if (overrides.isEmpty()) { - for (int j = 0; j < downloadHelper.getPeriodCount(); j++) { - downloadHelper.addTrackSelection(/* periodIndex = */ j, builder.build()); + for (int periodIndex = 0; periodIndex < downloadHelper.getPeriodCount(); periodIndex++) { + downloadHelper.clearTrackSelections(periodIndex); + for (int i = 0; i < mappedTrackInfo.getRendererCount(); i++) { + if (!trackSelectionDialog.getIsDisabled(/* rendererIndex= */ i)) { + downloadHelper.addTrackSelectionForSingleRenderer( + periodIndex, + /* rendererIndex= */ i, + DownloadHelper.DEFAULT_TRACK_SELECTOR_PARAMETERS, + trackSelectionDialog.getOverrides(/* rendererIndex= */ i)); } - } else { - TrackGroupArray trackGroupArray = mappedTrackInfo.getTrackGroups(/* rendererIndex= */ i); - for (int overrideIndex = 0; overrideIndex < overrides.size(); overrideIndex++) { - builder.setSelectionOverride( - /* rendererIndex= */ i, trackGroupArray, overrides.get(overrideIndex)); - for (int j = 0; j < downloadHelper.getPeriodCount(); j++) { - downloadHelper.addTrackSelection(/* periodIndex = */ j, builder.build()); - } - } - builder.clearSelectionOverrides(); } - builder.setRendererDisabled(/* rendererIndex= */ i, /* disabled= */ true); } DownloadAction downloadAction = downloadHelper.getDownloadAction(Util.getUtf8Bytes(name)); startDownload(downloadAction); diff --git a/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadHelper.java b/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadHelper.java index 4cd6a891b1..2c81ae1840 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadHelper.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadHelper.java @@ -38,6 +38,7 @@ import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.trackselection.BaseTrackSelection; import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; import com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters; +import com.google.android.exoplayer2.trackselection.DefaultTrackSelector.SelectionOverride; import com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo; import com.google.android.exoplayer2.trackselection.TrackSelection; import com.google.android.exoplayer2.trackselection.TrackSelectorResult; @@ -546,6 +547,38 @@ public final class DownloadHelper { } } + /** + * Convenience method to add a selection of tracks to be downloaded for a single renderer. Must + * not be called until after preparation completes. + * + * @param periodIndex The period index the track selection is added for. + * @param rendererIndex The renderer index the track selection is added for. + * @param trackSelectorParameters The {@link DefaultTrackSelector.Parameters} to obtain the new + * selection of tracks. + * @param overrides A list of {@link SelectionOverride SelectionOverrides} to apply to the {@code + * trackSelectorParameters}. If empty, {@code trackSelectorParameters} are used as they are. + */ + public void addTrackSelectionForSingleRenderer( + int periodIndex, + int rendererIndex, + DefaultTrackSelector.Parameters trackSelectorParameters, + List overrides) { + assertPreparedWithMedia(); + DefaultTrackSelector.ParametersBuilder builder = trackSelectorParameters.buildUpon(); + for (int i = 0; i < mappedTrackInfos[periodIndex].getRendererCount(); i++) { + builder.setRendererDisabled(/* rendererIndex= */ i, /* disabled= */ i != rendererIndex); + } + if (overrides.isEmpty()) { + addTrackSelection(periodIndex, builder.build()); + } else { + TrackGroupArray trackGroupArray = mappedTrackInfos[periodIndex].getTrackGroups(rendererIndex); + for (int i = 0; i < overrides.size(); i++) { + builder.setSelectionOverride(rendererIndex, trackGroupArray, overrides.get(i)); + addTrackSelection(periodIndex, builder.build()); + } + } + } + /** * Builds a {@link DownloadAction} for downloading the selected tracks. Must not be called until * after preparation completes.