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 a3c2278b32..21e1858bdd 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 @@ -489,6 +489,64 @@ public final class DownloadHelper { runTrackSelection(periodIndex); } + /** + * Convenience method to add selections of tracks for all specified audio languages. If an audio + * track in one of the specified languages is not available, the default fallback audio track is + * used instead. Must not be called until after preparation completes. + * + * @param languages A list of audio languages for which tracks should be added to the download + * selection, as ISO 639-2/T tags. + */ + public void addAudioLanguagesToSelection(String... languages) { + assertPreparedWithMedia(); + for (int periodIndex = 0; periodIndex < mappedTrackInfos.length; periodIndex++) { + DefaultTrackSelector.ParametersBuilder parametersBuilder = + DEFAULT_TRACK_SELECTOR_PARAMETERS.buildUpon(); + MappedTrackInfo mappedTrackInfo = mappedTrackInfos[periodIndex]; + int rendererCount = mappedTrackInfo.getRendererCount(); + for (int rendererIndex = 0; rendererIndex < rendererCount; rendererIndex++) { + if (mappedTrackInfo.getRendererType(rendererIndex) != C.TRACK_TYPE_AUDIO) { + parametersBuilder.setRendererDisabled(rendererIndex, /* disabled= */ true); + } + } + for (String language : languages) { + parametersBuilder.setPreferredAudioLanguage(language); + addTrackSelection(periodIndex, parametersBuilder.build()); + } + } + } + + /** + * Convenience method to add selections of tracks for all specified text languages. Must not be + * called until after preparation completes. + * + * @param selectUndeterminedTextLanguage Whether a text track with undetermined language should be + * selected for downloading if no track with one of the specified {@code languages} is + * available. + * @param languages A list of text languages for which tracks should be added to the download + * selection, as ISO 639-2/T tags. + */ + public void addTextLanguagesToSelection( + boolean selectUndeterminedTextLanguage, String... languages) { + assertPreparedWithMedia(); + for (int periodIndex = 0; periodIndex < mappedTrackInfos.length; periodIndex++) { + DefaultTrackSelector.ParametersBuilder parametersBuilder = + DEFAULT_TRACK_SELECTOR_PARAMETERS.buildUpon(); + MappedTrackInfo mappedTrackInfo = mappedTrackInfos[periodIndex]; + int rendererCount = mappedTrackInfo.getRendererCount(); + for (int rendererIndex = 0; rendererIndex < rendererCount; rendererIndex++) { + if (mappedTrackInfo.getRendererType(rendererIndex) != C.TRACK_TYPE_TEXT) { + parametersBuilder.setRendererDisabled(rendererIndex, /* disabled= */ true); + } + } + parametersBuilder.setSelectUndeterminedTextLanguage(selectUndeterminedTextLanguage); + for (String language : languages) { + parametersBuilder.setPreferredTextLanguage(language); + addTrackSelection(periodIndex, parametersBuilder.build()); + } + } + } + /** * Builds a {@link DownloadAction} for downloading the selected tracks. Must not be called until * after preparation completes. diff --git a/library/core/src/test/java/com/google/android/exoplayer2/offline/DownloadHelperTest.java b/library/core/src/test/java/com/google/android/exoplayer2/offline/DownloadHelperTest.java index eb0303178e..6f41e10046 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/offline/DownloadHelperTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/offline/DownloadHelperTest.java @@ -312,6 +312,73 @@ public class DownloadHelperTest { assertSingleTrackSelectionEquals(selectedVideo1, TRACK_GROUP_VIDEO_SINGLE, 0); } + @Test + public void getTrackSelections_afterAddAudioLanguagesToSelection_returnsCombinedSelections() + throws Exception { + prepareDownloadHelper(downloadHelper); + downloadHelper.clearTrackSelections(/* periodIndex= */ 0); + downloadHelper.clearTrackSelections(/* periodIndex= */ 1); + + // Add a non-default language, and a non-existing language (which will select the default). + downloadHelper.addAudioLanguagesToSelection("ZH", "Klingonese"); + List selectedText0 = + downloadHelper.getTrackSelections(/* periodIndex= */ 0, /* rendererIndex= */ 0); + List selectedAudio0 = + downloadHelper.getTrackSelections(/* periodIndex= */ 0, /* rendererIndex= */ 1); + List selectedVideo0 = + downloadHelper.getTrackSelections(/* periodIndex= */ 0, /* rendererIndex= */ 2); + List selectedText1 = + downloadHelper.getTrackSelections(/* periodIndex= */ 1, /* rendererIndex= */ 0); + List selectedAudio1 = + downloadHelper.getTrackSelections(/* periodIndex= */ 1, /* rendererIndex= */ 1); + List selectedVideo1 = + downloadHelper.getTrackSelections(/* periodIndex= */ 1, /* rendererIndex= */ 2); + + assertThat(selectedVideo0).isEmpty(); + assertThat(selectedText0).isEmpty(); + assertThat(selectedAudio0).hasSize(2); + assertTrackSelectionEquals(selectedAudio0.get(0), TRACK_GROUP_AUDIO_ZH, 0); + assertTrackSelectionEquals(selectedAudio0.get(1), TRACK_GROUP_AUDIO_US, 0); + + assertThat(selectedVideo1).isEmpty(); + assertThat(selectedText1).isEmpty(); + assertSingleTrackSelectionEquals(selectedAudio1, TRACK_GROUP_AUDIO_US, 0); + } + + @Test + public void getTrackSelections_afterAddTextLanguagesToSelection_returnsCombinedSelections() + throws Exception { + prepareDownloadHelper(downloadHelper); + downloadHelper.clearTrackSelections(/* periodIndex= */ 0); + downloadHelper.clearTrackSelections(/* periodIndex= */ 1); + + // Add a non-default language, and a non-existing language (which will select the default). + downloadHelper.addTextLanguagesToSelection( + /* selectUndeterminedTextLanguage= */ true, "ZH", "Klingonese"); + List selectedText0 = + downloadHelper.getTrackSelections(/* periodIndex= */ 0, /* rendererIndex= */ 0); + List selectedAudio0 = + downloadHelper.getTrackSelections(/* periodIndex= */ 0, /* rendererIndex= */ 1); + List selectedVideo0 = + downloadHelper.getTrackSelections(/* periodIndex= */ 0, /* rendererIndex= */ 2); + List selectedText1 = + downloadHelper.getTrackSelections(/* periodIndex= */ 1, /* rendererIndex= */ 0); + List selectedAudio1 = + downloadHelper.getTrackSelections(/* periodIndex= */ 1, /* rendererIndex= */ 1); + List selectedVideo1 = + downloadHelper.getTrackSelections(/* periodIndex= */ 1, /* rendererIndex= */ 2); + + assertThat(selectedVideo0).isEmpty(); + assertThat(selectedAudio0).isEmpty(); + assertThat(selectedText0).hasSize(2); + assertTrackSelectionEquals(selectedText0.get(0), TRACK_GROUP_TEXT_ZH, 0); + assertTrackSelectionEquals(selectedText0.get(1), TRACK_GROUP_TEXT_US, 0); + + assertThat(selectedVideo1).isEmpty(); + assertThat(selectedAudio1).isEmpty(); + assertThat(selectedText1).isEmpty(); + } + @Test public void getDownloadAction_createsDownloadAction_withAllSelectedTracks() throws Exception { prepareDownloadHelper(downloadHelper);