From d93ee00d195e3f28cdc2edc92e877bc0beeecfc1 Mon Sep 17 00:00:00 2001 From: tonihei Date: Wed, 13 Mar 2019 15:16:03 +0000 Subject: [PATCH] Add convenience method to DownloadHelper to add selection for single renderer. This simplifies the DownloadHelper code in the demo app and is generally useful for more specific updates with SelectionOverrides. PiperOrigin-RevId: 238228276 --- .../exoplayer2/demo/DownloadTracker.java | 41 ++++--------------- .../exoplayer2/offline/DownloadHelper.java | 33 +++++++++++++++ 2 files changed, 42 insertions(+), 32 deletions(-) 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.