From 6794007afd1dffbb8fbdb692a7eca9b3c7853aba Mon Sep 17 00:00:00 2001 From: Ferran Garriga Date: Mon, 19 Jun 2017 14:48:58 +0100 Subject: [PATCH] Return boolean for functions selecting tracks --- .../main/java/com/novoda/noplayer/Player.java | 4 +- .../noplayer/exoplayer/ExoPlayerFacade.java | 8 +-- .../noplayer/exoplayer/ExoPlayerTwoImpl.java | 15 +++-- .../ExoPlayerAudioTrackSelector.java | 4 +- .../ExoPlayerSubtitleTrackSelector.java | 4 +- .../mediasource/ExoPlayerTrackSelector.java | 11 ++-- .../AndroidMediaPlayerAudioTrackSelector.java | 3 +- .../mediaplayer/AndroidMediaPlayerFacade.java | 4 +- .../mediaplayer/AndroidMediaPlayerImpl.java | 13 +++- .../exoplayer/ExoPlayerFacadeTest.java | 59 +++++++++++++++++++ .../exoplayer/ExoPlayerTwoImplTest.java | 20 +++++++ 11 files changed, 121 insertions(+), 24 deletions(-) diff --git a/core/src/main/java/com/novoda/noplayer/Player.java b/core/src/main/java/com/novoda/noplayer/Player.java index 2df2384d..208a1b74 100644 --- a/core/src/main/java/com/novoda/noplayer/Player.java +++ b/core/src/main/java/com/novoda/noplayer/Player.java @@ -31,9 +31,9 @@ public interface Player extends PlayerState { void detach(PlayerView playerView); - void selectAudioTrack(PlayerAudioTrack audioTrack); + boolean selectAudioTrack(PlayerAudioTrack audioTrack); - void showSubtitleTrack(PlayerSubtitleTrack subtitleTrack); + boolean showSubtitleTrack(PlayerSubtitleTrack subtitleTrack); void hideSubtitleTrack(); diff --git a/core/src/main/java/com/novoda/noplayer/exoplayer/ExoPlayerFacade.java b/core/src/main/java/com/novoda/noplayer/exoplayer/ExoPlayerFacade.java index ee06bfb3..68ef2efb 100644 --- a/core/src/main/java/com/novoda/noplayer/exoplayer/ExoPlayerFacade.java +++ b/core/src/main/java/com/novoda/noplayer/exoplayer/ExoPlayerFacade.java @@ -113,9 +113,9 @@ void loadVideo(Uri uri, ContentType contentType, ExoPlayerForwarder forwarder) { exoPlayer.prepare(mediaSource, RESET_POSITION, DO_NOT_RESET_STATE); } - void selectAudioTrack(PlayerAudioTrack audioTrack) { + boolean selectAudioTrack(PlayerAudioTrack audioTrack) { assertVideoLoaded(); - audioTrackSelector.selectAudioTrack(audioTrack, rendererTypeRequester); + return audioTrackSelector.selectAudioTrack(audioTrack, rendererTypeRequester); } List getAudioTracks() { @@ -133,9 +133,9 @@ void removeSubtitleRendererOutput() { exoPlayer.setTextOutput(null); } - void selectSubtitleTrack(PlayerSubtitleTrack subtitleTrack) { + boolean selectSubtitleTrack(PlayerSubtitleTrack subtitleTrack) { assertVideoLoaded(); - subtitleTrackSelector.selectTextTrack(subtitleTrack, rendererTypeRequester); + return subtitleTrackSelector.selectTextTrack(subtitleTrack, rendererTypeRequester); } List getSubtitleTracks() { diff --git a/core/src/main/java/com/novoda/noplayer/exoplayer/ExoPlayerTwoImpl.java b/core/src/main/java/com/novoda/noplayer/exoplayer/ExoPlayerTwoImpl.java index 66374aaa..67ae1719 100644 --- a/core/src/main/java/com/novoda/noplayer/exoplayer/ExoPlayerTwoImpl.java +++ b/core/src/main/java/com/novoda/noplayer/exoplayer/ExoPlayerTwoImpl.java @@ -198,16 +198,23 @@ public void detach(PlayerView playerView) { this.playerView = null; } + /** + * @return Whether the selection was successful + */ @Override - public void selectAudioTrack(PlayerAudioTrack audioTrack) { - exoPlayer.selectAudioTrack(audioTrack); + public boolean selectAudioTrack(PlayerAudioTrack audioTrack) { + return exoPlayer.selectAudioTrack(audioTrack); } + /** + * + * @return Whether the selection was successful + */ @Override - public void showSubtitleTrack(PlayerSubtitleTrack subtitleTrack) { + public boolean showSubtitleTrack(PlayerSubtitleTrack subtitleTrack) { setSubtitleRendererOutput(); - exoPlayer.selectSubtitleTrack(subtitleTrack); playerView.showSubtitles(); + return exoPlayer.selectSubtitleTrack(subtitleTrack); } private void setSubtitleRendererOutput() { diff --git a/core/src/main/java/com/novoda/noplayer/exoplayer/mediasource/ExoPlayerAudioTrackSelector.java b/core/src/main/java/com/novoda/noplayer/exoplayer/mediasource/ExoPlayerAudioTrackSelector.java index d6d1a5d7..e0b4a726 100644 --- a/core/src/main/java/com/novoda/noplayer/exoplayer/mediasource/ExoPlayerAudioTrackSelector.java +++ b/core/src/main/java/com/novoda/noplayer/exoplayer/mediasource/ExoPlayerAudioTrackSelector.java @@ -23,7 +23,7 @@ public ExoPlayerAudioTrackSelector(ExoPlayerTrackSelector trackSelector, TrackSe this.trackSelectionFactory = trackSelectionFactory; } - public void selectAudioTrack(PlayerAudioTrack audioTrack, RendererTypeRequester rendererTypeRequester) { + public boolean selectAudioTrack(PlayerAudioTrack audioTrack, RendererTypeRequester rendererTypeRequester) { TrackGroupArray trackGroups = trackSelector.trackGroups(AUDIO, rendererTypeRequester); MappingTrackSelector.SelectionOverride selectionOverride = new MappingTrackSelector.SelectionOverride( @@ -31,7 +31,7 @@ public void selectAudioTrack(PlayerAudioTrack audioTrack, RendererTypeRequester audioTrack.groupIndex(), audioTrack.formatIndex() ); - trackSelector.setSelectionOverride(AUDIO, rendererTypeRequester, trackGroups, selectionOverride); + return trackSelector.setSelectionOverride(AUDIO, rendererTypeRequester, trackGroups, selectionOverride); } public List getAudioTracks(RendererTypeRequester rendererTypeRequester) { diff --git a/core/src/main/java/com/novoda/noplayer/exoplayer/mediasource/ExoPlayerSubtitleTrackSelector.java b/core/src/main/java/com/novoda/noplayer/exoplayer/mediasource/ExoPlayerSubtitleTrackSelector.java index 1c635bde..e575dac1 100644 --- a/core/src/main/java/com/novoda/noplayer/exoplayer/mediasource/ExoPlayerSubtitleTrackSelector.java +++ b/core/src/main/java/com/novoda/noplayer/exoplayer/mediasource/ExoPlayerSubtitleTrackSelector.java @@ -23,7 +23,7 @@ public ExoPlayerSubtitleTrackSelector(ExoPlayerTrackSelector trackSelector, Trac this.trackSelectionFactory = trackSelectionFactory; } - public void selectTextTrack(PlayerSubtitleTrack subtitleTrack, RendererTypeRequester rendererTypeRequester) { + public boolean selectTextTrack(PlayerSubtitleTrack subtitleTrack, RendererTypeRequester rendererTypeRequester) { TrackGroupArray trackGroups = trackSelector.trackGroups(TEXT, rendererTypeRequester); MappingTrackSelector.SelectionOverride selectionOverride = new MappingTrackSelector.SelectionOverride( @@ -31,7 +31,7 @@ public void selectTextTrack(PlayerSubtitleTrack subtitleTrack, RendererTypeReque subtitleTrack.groupIndex(), subtitleTrack.formatIndex() ); - trackSelector.setSelectionOverride(TEXT, rendererTypeRequester, trackGroups, selectionOverride); + return trackSelector.setSelectionOverride(TEXT, rendererTypeRequester, trackGroups, selectionOverride); } public List getSubtitleTracks(RendererTypeRequester rendererTypeRequester) { diff --git a/core/src/main/java/com/novoda/noplayer/exoplayer/mediasource/ExoPlayerTrackSelector.java b/core/src/main/java/com/novoda/noplayer/exoplayer/mediasource/ExoPlayerTrackSelector.java index 6e42bea9..b0b23c29 100644 --- a/core/src/main/java/com/novoda/noplayer/exoplayer/mediasource/ExoPlayerTrackSelector.java +++ b/core/src/main/java/com/novoda/noplayer/exoplayer/mediasource/ExoPlayerTrackSelector.java @@ -47,13 +47,16 @@ private int mappedTrackInfoLength() { return trackSelector.getCurrentMappedTrackInfo().length; } - void setSelectionOverride(TrackType trackType, - RendererTypeRequester rendererTypeRequester, - TrackGroupArray trackGroups, - MappingTrackSelector.SelectionOverride selectionOverride) { + boolean setSelectionOverride(TrackType trackType, + RendererTypeRequester rendererTypeRequester, + TrackGroupArray trackGroups, + MappingTrackSelector.SelectionOverride selectionOverride) { Optional audioRendererIndex = rendererTrackIndexExtractor.extract(trackType, mappedTrackInfoLength(), rendererTypeRequester); if (audioRendererIndex.isPresent()) { trackSelector.setSelectionOverride(audioRendererIndex.get(), trackGroups, selectionOverride); + return true; + } else { + return false; } } diff --git a/core/src/main/java/com/novoda/noplayer/mediaplayer/AndroidMediaPlayerAudioTrackSelector.java b/core/src/main/java/com/novoda/noplayer/mediaplayer/AndroidMediaPlayerAudioTrackSelector.java index ba21a262..db8ec701 100644 --- a/core/src/main/java/com/novoda/noplayer/mediaplayer/AndroidMediaPlayerAudioTrackSelector.java +++ b/core/src/main/java/com/novoda/noplayer/mediaplayer/AndroidMediaPlayerAudioTrackSelector.java @@ -46,11 +46,12 @@ List getAudioTracks(MediaPlayer mediaPlayer) { return audioTracks; } - void selectAudioTrack(MediaPlayer mediaPlayer, PlayerAudioTrack playerAudioTrack) { + boolean selectAudioTrack(MediaPlayer mediaPlayer, PlayerAudioTrack playerAudioTrack) { if (mediaPlayer == null) { throw new NullPointerException("You can only call selectAudioTrack() when video is prepared."); } mediaPlayer.selectTrack(playerAudioTrack.groupIndex()); + return true; } } diff --git a/core/src/main/java/com/novoda/noplayer/mediaplayer/AndroidMediaPlayerFacade.java b/core/src/main/java/com/novoda/noplayer/mediaplayer/AndroidMediaPlayerFacade.java index 962fad9b..885401f8 100644 --- a/core/src/main/java/com/novoda/noplayer/mediaplayer/AndroidMediaPlayerFacade.java +++ b/core/src/main/java/com/novoda/noplayer/mediaplayer/AndroidMediaPlayerFacade.java @@ -211,9 +211,9 @@ List getAudioTracks() { return trackSelector.getAudioTracks(mediaPlayer); } - void selectAudioTrack(PlayerAudioTrack playerAudioTrack) { + boolean selectAudioTrack(PlayerAudioTrack playerAudioTrack) { assertIsInPlaybackState(); - trackSelector.selectAudioTrack(mediaPlayer, playerAudioTrack); + return trackSelector.selectAudioTrack(mediaPlayer, playerAudioTrack); } void setOnSeekCompleteListener(MediaPlayer.OnSeekCompleteListener seekToResettingSeekListener) { diff --git a/core/src/main/java/com/novoda/noplayer/mediaplayer/AndroidMediaPlayerImpl.java b/core/src/main/java/com/novoda/noplayer/mediaplayer/AndroidMediaPlayerImpl.java index 37d7dfe5..bfb967fb 100644 --- a/core/src/main/java/com/novoda/noplayer/mediaplayer/AndroidMediaPlayerImpl.java +++ b/core/src/main/java/com/novoda/noplayer/mediaplayer/AndroidMediaPlayerImpl.java @@ -261,15 +261,22 @@ public void detach(PlayerView playerView) { buggyVideoDriverPreventer.clear(playerView.getContainerView()); } + /** + * @return Whether the selection was successful + */ @Override - public void selectAudioTrack(PlayerAudioTrack audioTrack) { - mediaPlayer.selectAudioTrack(audioTrack); + public boolean selectAudioTrack(PlayerAudioTrack audioTrack) { + return mediaPlayer.selectAudioTrack(audioTrack); } + /** + * @return Whether the selection was successful + */ @Override - public void showSubtitleTrack(PlayerSubtitleTrack subtitleTrack) { + public boolean showSubtitleTrack(PlayerSubtitleTrack subtitleTrack) { SubtitlesError subtitlesError = new SubtitlesError("Subtitles not implemented for Android Media Player", new IllegalStateException()); listenersHolder.getErrorListeners().onError(this, subtitlesError); + return false; } @Override diff --git a/core/src/test/java/com/novoda/noplayer/exoplayer/ExoPlayerFacadeTest.java b/core/src/test/java/com/novoda/noplayer/exoplayer/ExoPlayerFacadeTest.java index 8ee65645..24909936 100644 --- a/core/src/test/java/com/novoda/noplayer/exoplayer/ExoPlayerFacadeTest.java +++ b/core/src/test/java/com/novoda/noplayer/exoplayer/ExoPlayerFacadeTest.java @@ -7,6 +7,7 @@ import com.google.android.exoplayer2.source.MediaSource; import com.novoda.noplayer.ContentType; import com.novoda.noplayer.PlayerAudioTrack; +import com.novoda.noplayer.PlayerSubtitleTrack; import com.novoda.noplayer.VideoDuration; import com.novoda.noplayer.VideoPosition; import com.novoda.noplayer.exoplayer.forwarder.ExoPlayerForwarder; @@ -164,6 +165,15 @@ public void whenGettingAudioTracks_thenThrowsIllegalStateException() { facade.getAudioTracks(); } + + @Test + public void selectSubtitleTrack_thenThrowsIllegalStateException() { + thrown.expect(ExceptionMatcher.matches("Video must be loaded before trying to interact with the player", IllegalStateException.class)); + + PlayerSubtitleTrack subtitleTrack = mock(PlayerSubtitleTrack.class); + + facade.selectSubtitleTrack(subtitleTrack); + } } public static class GivenVideoIsLoaded extends Base { @@ -293,6 +303,55 @@ public void whenSelectingAudioTrack_thenDelegatesToTrackSelector() { verify(audioTrackSelector).selectAudioTrack(audioTrack, rendererTypeRequester); } + @Test + public void givenSelectingAudioTrackSuceeds_whenSelectingAudioTrack_thenReturnsTrue() { + PlayerAudioTrack audioTrack = mock(PlayerAudioTrack.class); + given(audioTrackSelector.selectAudioTrack(audioTrack, rendererTypeRequester)).willReturn(true); + + boolean success = facade.selectAudioTrack(audioTrack); + + assertThat(success).isTrue(); + } + + @Test + public void givenSelectingAudioTrackFails_whenSelectingAudioTrack_thenReturnsFalse() { + PlayerAudioTrack audioTrack = mock(PlayerAudioTrack.class); + given(audioTrackSelector.selectAudioTrack(audioTrack, rendererTypeRequester)).willReturn(false); + + boolean success = facade.selectAudioTrack(audioTrack); + + assertThat(success).isFalse(); + } + + @Test + public void whenSelectingSubtitlesTrack_thenDelegatesToTrackSelector() { + PlayerSubtitleTrack subtitleTrack = mock(PlayerSubtitleTrack.class); + + facade.selectSubtitleTrack(subtitleTrack); + + verify(subtitleTrackSelector).selectTextTrack(subtitleTrack, rendererTypeRequester); + } + + @Test + public void givenSelectingTextTrackSuceeds_whenSelectingSubtitlesTrack_thenReturnsTrue() { + PlayerSubtitleTrack subtitleTrack = mock(PlayerSubtitleTrack.class); + given(subtitleTrackSelector.selectTextTrack(subtitleTrack, rendererTypeRequester)).willReturn(true); + + boolean success = facade.selectSubtitleTrack(subtitleTrack); + + assertThat(success).isTrue(); + } + + @Test + public void givenSelectingTextTrackFails_whenSelectingSubtitlesTrack_thenReturnsFalse() { + PlayerSubtitleTrack subtitleTrack = mock(PlayerSubtitleTrack.class); + given(subtitleTrackSelector.selectTextTrack(subtitleTrack, rendererTypeRequester)).willReturn(false); + + boolean success = facade.selectSubtitleTrack(subtitleTrack); + + assertThat(success).isFalse(); + } + @Test public void whenGettingAudioTracks_thenDelegatesToTrackSelector() { given(audioTrackSelector.getAudioTracks(any(RendererTypeRequester.class))).willReturn(AUDIO_TRACKS); diff --git a/core/src/test/java/com/novoda/noplayer/exoplayer/ExoPlayerTwoImplTest.java b/core/src/test/java/com/novoda/noplayer/exoplayer/ExoPlayerTwoImplTest.java index 2b0770bc..43e1d71e 100644 --- a/core/src/test/java/com/novoda/noplayer/exoplayer/ExoPlayerTwoImplTest.java +++ b/core/src/test/java/com/novoda/noplayer/exoplayer/ExoPlayerTwoImplTest.java @@ -441,6 +441,26 @@ public void whenSelectingSubtitlesTrack_thenShowsPlayerSubtitlesView() { verify(playerView).showSubtitles(); } + @Test + public void givenSelectingSubtitleTrackSuceeds_whenSelectingSubtitlesTrack_thenReturnsTrue() { + PlayerSubtitleTrack playerSubtitleTrack = mock(PlayerSubtitleTrack.class); + given(exoPlayerFacade.selectSubtitleTrack(playerSubtitleTrack)).willReturn(true); + + boolean success = player.showSubtitleTrack(playerSubtitleTrack); + + assertThat(success).isTrue(); + } + + @Test + public void givenSelectingSubtitleTrackFails_whenSelectingSubtitlesTrack_thenReturnsFalse() { + PlayerSubtitleTrack playerSubtitleTrack = mock(PlayerSubtitleTrack.class); + given(exoPlayerFacade.selectSubtitleTrack(playerSubtitleTrack)).willReturn(false); + + boolean success = player.showSubtitleTrack(playerSubtitleTrack); + + assertThat(success).isFalse(); + } + @Test public void givenPlayerHasLoadedSubtitleCues_whenSelectingSubtitlesTrack_thenSetsSubtitleCuesOnView() { TextCues textCues = givenPlayerHasLoadedSubtitleCues();