6262import static org .schabi .newpipe .util .ListHelper .getPopupResolutionIndex ;
6363import static org .schabi .newpipe .util .ListHelper .getResolutionIndex ;
6464import static org .schabi .newpipe .util .Localization .assureCorrectAppLanguage ;
65- import static org .schabi .newpipe .util .Localization .containsCaseInsensitive ;
6665import static java .util .concurrent .TimeUnit .MILLISECONDS ;
6766
6867import android .animation .Animator ;
130129import com .google .android .exoplayer2 .C ;
131130import com .google .android .exoplayer2 .DefaultRenderersFactory ;
132131import com .google .android .exoplayer2 .ExoPlayer ;
132+ import com .google .android .exoplayer2 .Format ;
133133import com .google .android .exoplayer2 .PlaybackException ;
134134import com .google .android .exoplayer2 .PlaybackParameters ;
135135import com .google .android .exoplayer2 .Player .PositionInfo ;
138138import com .google .android .exoplayer2 .TracksInfo ;
139139import com .google .android .exoplayer2 .source .MediaSource ;
140140import com .google .android .exoplayer2 .source .TrackGroup ;
141- import com .google .android .exoplayer2 .source .TrackGroupArray ;
142141import com .google .android .exoplayer2 .text .Cue ;
143142import com .google .android .exoplayer2 .trackselection .DefaultTrackSelector ;
144143import com .google .android .exoplayer2 .trackselection .MappingTrackSelector ;
@@ -2530,7 +2529,7 @@ public void onTracksInfoChanged(@NonNull final TracksInfo tracksInfo) {
25302529 Log .d (TAG , "ExoPlayer - onTracksChanged(), "
25312530 + "track group size = " + tracksInfo .getTrackGroupInfos ().size ());
25322531 }
2533- onTextTracksChanged ();
2532+ onTextTracksChanged (tracksInfo );
25342533 }
25352534
25362535 @ Override
@@ -3516,17 +3515,7 @@ private void buildCaptionMenu(@NonNull final List<String> availableLanguages) {
35163515 return ;
35173516 }
35183517 captionPopupMenu .getMenu ().removeGroup (POPUP_MENU_ID_CAPTION );
3519-
3520- final String userPreferredLanguage =
3521- prefs .getString (context .getString (R .string .caption_user_set_key ), null );
3522- /*
3523- * only search for autogenerated cc as fallback
3524- * if "(auto-generated)" was not already selected
3525- * we are only looking for "(" instead of "(auto-generated)" to hopefully get all
3526- * internationalized variants such as "(automatisch-erzeugt)" and so on
3527- */
3528- boolean searchForAutogenerated = userPreferredLanguage != null
3529- && !userPreferredLanguage .contains ("(" );
3518+ captionPopupMenu .setOnDismissListener (this );
35303519
35313520 // Add option for turning off caption
35323521 final MenuItem captionOffItem = captionPopupMenu .getMenu ().add (POPUP_MENU_ID_CAPTION ,
@@ -3549,6 +3538,9 @@ private void buildCaptionMenu(@NonNull final List<String> availableLanguages) {
35493538 captionItem .setOnMenuItemClickListener (menuItem -> {
35503539 final int textRendererIndex = getCaptionRendererIndex ();
35513540 if (textRendererIndex != RENDERER_UNAVAILABLE ) {
3541+ // DefaultTrackSelector will select for tracks with similar language names
3542+ // if a track of userPreferredLanguage is not found
3543+ // This means (auto-generated) will be resolved automatically.
35523544 trackSelector .setParameters (trackSelector .buildUponParameters ()
35533545 .setPreferredTextLanguage (captionLanguage )
35543546 .setRendererDisabled (textRendererIndex , false ));
@@ -3557,22 +3549,23 @@ private void buildCaptionMenu(@NonNull final List<String> availableLanguages) {
35573549 }
35583550 return true ;
35593551 });
3560- // apply caption language from previous user preference
3561- if (userPreferredLanguage != null
3562- && (captionLanguage .equals (userPreferredLanguage )
3563- || (searchForAutogenerated && captionLanguage .startsWith (userPreferredLanguage ))
3564- || (userPreferredLanguage .contains ("(" ) && captionLanguage .startsWith (
3565- userPreferredLanguage .substring (0 , userPreferredLanguage .indexOf ('(' )))))) {
3566- final int textRendererIndex = getCaptionRendererIndex ();
3567- if (textRendererIndex != RENDERER_UNAVAILABLE ) {
3568- trackSelector .setParameters (trackSelector .buildUponParameters ()
3569- .setPreferredTextLanguage (captionLanguage )
3570- .setRendererDisabled (textRendererIndex , false ));
3571- }
3572- searchForAutogenerated = false ;
3573- }
35743552 }
3575- captionPopupMenu .setOnDismissListener (this );
3553+
3554+ // apply caption language from previous user preference
3555+ final List <String > selectedPreferredLanguages =
3556+ trackSelector .getParameters ().preferredTextLanguages ;
3557+ final String userPreferredLanguage =
3558+ prefs .getString (context .getString (R .string .caption_user_set_key ), null );
3559+ final int textRendererIndex = getCaptionRendererIndex ();
3560+
3561+ if (userPreferredLanguage != null
3562+ && availableLanguages .contains (userPreferredLanguage )
3563+ && !selectedPreferredLanguages .contains (userPreferredLanguage )
3564+ && textRendererIndex != RENDERER_UNAVAILABLE ) {
3565+ trackSelector .setParameters (trackSelector .buildUponParameters ()
3566+ .setPreferredTextLanguage (userPreferredLanguage )
3567+ .setRendererDisabled (textRendererIndex , false ));
3568+ }
35763569 }
35773570
35783571 /**
@@ -3668,41 +3661,45 @@ private void setupSubtitleView() {
36683661 binding .subtitleView .setStyle (captionStyle );
36693662 }
36703663
3671- private void onTextTracksChanged () {
3672- final int textRenderer = getCaptionRendererIndex ();
3673-
3664+ private void onTextTracksChanged (@ NonNull final TracksInfo currentTrackInfo ) {
36743665 if (binding == null ) {
36753666 return ;
36763667 }
3668+
36773669 if (trackSelector .getCurrentMappedTrackInfo () == null
3678- || textRenderer == RENDERER_UNAVAILABLE ) {
3670+ || ! currentTrackInfo . isTypeSupportedOrEmpty ( C . TRACK_TYPE_TEXT ) ) {
36793671 binding .captionTextView .setVisibility (View .GONE );
36803672 return ;
36813673 }
36823674
3683- final TrackGroupArray textTracks = trackSelector .getCurrentMappedTrackInfo ()
3684- .getTrackGroups (textRenderer );
3685-
36863675 // Extract all loaded languages
3687- final List <String > availableLanguages = new ArrayList <>(textTracks .length );
3688- for (int i = 0 ; i < textTracks .length ; i ++) {
3689- final TrackGroup textTrack = textTracks .get (i );
3676+ final List <TracksInfo .TrackGroupInfo > textTracks = currentTrackInfo
3677+ .getTrackGroupInfos ()
3678+ .stream ()
3679+ .filter (trackGroupInfo -> C .TRACK_TYPE_TEXT == trackGroupInfo .getTrackType ())
3680+ .collect (Collectors .toList ());
3681+ final List <String > availableLanguages = new ArrayList <>(textTracks .size ());
3682+ for (int i = 0 ; i < textTracks .size (); i ++) {
3683+ final TrackGroup textTrack = textTracks .get (i ).getTrackGroup ();
36903684 if (textTrack .length > 0 ) {
36913685 availableLanguages .add (textTrack .getFormat (0 ).language );
36923686 }
36933687 }
36943688
3695- // Normalize mismatching language strings
3696- final String preferredLanguage = trackSelector .getParameters ()
3697- .preferredTextLanguages .stream ().findFirst ().orElse (null );
3689+ // Find selected text track
3690+ final Optional <Format > selectedTracks = textTracks .stream ()
3691+ .filter (TracksInfo .TrackGroupInfo ::isSelected )
3692+ .filter (info -> info .getTrackGroup ().length >= 1 )
3693+ .map (info -> info .getTrackGroup ().getFormat (0 ))
3694+ .findFirst ();
3695+
36983696 // Build UI
36993697 buildCaptionMenu (availableLanguages );
3700- if (trackSelector .getParameters ().getRendererDisabled (textRenderer )
3701- || preferredLanguage == null || (!availableLanguages .contains (preferredLanguage )
3702- && !containsCaseInsensitive (availableLanguages , preferredLanguage ))) {
3698+ if (trackSelector .getParameters ().getRendererDisabled (getCaptionRendererIndex ())
3699+ || !selectedTracks .isPresent ()) {
37033700 binding .captionTextView .setText (R .string .caption_none );
37043701 } else {
3705- binding .captionTextView .setText (preferredLanguage );
3702+ binding .captionTextView .setText (selectedTracks . get (). language );
37063703 }
37073704 binding .captionTextView .setVisibility (
37083705 availableLanguages .isEmpty () ? View .GONE : View .VISIBLE );
0 commit comments