public NoPlayer createMediaPlayer(Context context) { AndroidMediaPlayerImpl player = internalCreator.create(context); player.initialise(); return player; }
@Override public void loadVideoWithTimeout(Uri uri, Options options, Timeout timeout, LoadTimeoutCallback loadTimeoutCallback) { loadTimeout.start(timeout, loadTimeoutCallback); loadVideo(uri, options); }
@Override public void playAt(final long positionInMillis) throws IllegalStateException { if (playheadPositionInMillis() == positionInMillis) { play(); } else { requestSurface(new SurfaceRequester.Callback() { @Override public void onSurfaceReady(Either<Surface, SurfaceHolder> surface) { initialSeekWorkaround(surface, positionInMillis); } }); } }
@Override public void loadVideo(final Uri uri, final Options options) { if (mediaPlayer.hasPlayedContent()) { stop(); } assertPlayerViewIsAttached(); createSurfaceByShowingVideoContainer(); listenersHolder.getBufferStateListeners().onBufferStarted(); requestSurface(new SurfaceRequester.Callback() { @Override public void onSurfaceReady(Either<Surface, SurfaceHolder> surface) { mediaPlayer.prepareVideo(uri, surface); } }); }
@Test public void givenPlayerIsSeeking_whenGettingPlayheadPosition_thenReturnsSeekPosition() { long seekPositionInMillis = TEN_SECONDS; player.seekTo(seekPositionInMillis); long videoPositionInMillis = player.playheadPositionInMillis(); assertThat(videoPositionInMillis).isEqualTo(seekPositionInMillis); }
@Test public void givenInitialised_whenCallingOnVideoSizeChanged_thenVideoWidthAndHeightMatches() { player.initialise(); ArgumentCaptor<NoPlayer.VideoSizeChangedListener> videoSizeChangedListenerCaptor = ArgumentCaptor.forClass(NoPlayer.VideoSizeChangedListener.class); verify(listenersHolder).addVideoSizeChangedListener(videoSizeChangedListenerCaptor.capture()); NoPlayer.VideoSizeChangedListener videoSizeChangedListener = videoSizeChangedListenerCaptor.getValue(); videoSizeChangedListener.onVideoSizeChanged(WIDTH, HEIGHT, ANY_ROTATION_DEGREES, ANY_PIXEL_WIDTH_HEIGHT); assertThat(player.videoWidth()).isEqualTo(WIDTH); assertThat(player.videoHeight()).isEqualTo(HEIGHT); }
@Test public void whenStartingPlay_thenStartsBeatingHeart() { player.play(); verify(heart).startBeatingHeart(); }
@Test public void givenAttachedPlayerView_whenStopping_thenPlayerResourcesAreReleased_andNotListeners() { player.attach(playerView); player.stop(); verify(delayedActionExecutor).clearAllActions(); verify(listenersHolder).resetState(); verify(stateChangedListener).onVideoStopped(); verify(loadTimeout).cancel(); verify(heart).stopBeatingHeart(); verify(mediaPlayer).release(); verify(containerView).setVisibility(View.GONE); verify(listenersHolder, never()).clear(); }
@Override public void release() { stop(); listenersHolder.clear(); }
private void seekWithIntentToPlay(long positionInMillis) throws IllegalStateException { seekingWithIntentToPlay = true; seekTo(positionInMillis); }
public AndroidMediaPlayerImpl create(Context context) { LoadTimeout loadTimeout = new LoadTimeout(new SystemClock(), handler); MediaPlayerForwarder forwarder = new MediaPlayerForwarder(); AndroidMediaPlayerFacade facade = AndroidMediaPlayerFacade.newInstance(context, forwarder); PlayerListenersHolder listenersHolder = new PlayerListenersHolder(); CheckBufferHeartbeatCallback bufferHeartbeatCallback = new CheckBufferHeartbeatCallback(); Heart heart = Heart.newInstance(handler); MediaPlayerTypeReader mediaPlayerTypeReader = new MediaPlayerTypeReader(new SystemProperties(), Build.VERSION.SDK_INT); DelayedActionExecutor delayedActionExecutor = new DelayedActionExecutor(handler, new HashMap<DelayedActionExecutor.Action, Runnable>()); BuggyVideoDriverPreventer preventer = new BuggyVideoDriverPreventer(mediaPlayerTypeReader); MediaPlayerInformation mediaPlayerInformation = new MediaPlayerInformation(mediaPlayerTypeReader); return new AndroidMediaPlayerImpl( mediaPlayerInformation, facade, forwarder, listenersHolder, bufferHeartbeatCallback, loadTimeout, heart, delayedActionExecutor, preventer ); } }
@Test public void givenAttachedPlayerView_whenReleasing_thenPlayerResourcesAreReleased() { player.attach(playerView); player.release(); verify(delayedActionExecutor).clearAllActions(); verify(listenersHolder).resetState(); verify(stateChangedListener).onVideoStopped(); verify(loadTimeout).cancel(); verify(heart).stopBeatingHeart(); verify(mediaPlayer).release(); verify(containerView).setVisibility(View.GONE); verify(listenersHolder).clear(); } }
@Test public void givenPlayerIsNotSeeking_whenGettingPlayheadPosition_thenReturnsCurrentMediaPlayerPosition() { given(mediaPlayer.currentPositionInMillis()).willReturn(ONE_SECOND_IN_MILLIS); long playheadPositionInMillis = player.playheadPositionInMillis(); assertThat(playheadPositionInMillis).isEqualTo(ONE_SECOND_IN_MILLIS); }
@Test public void givenAndroidMediaPlayerIsPlaying_whenCallingIsPlaying_thenReturnsTrue() { given(mediaPlayer.isPlaying()).willReturn(IS_PLAYING); boolean isPlaying = player.isPlaying(); assertThat(isPlaying).isTrue(); }
@Override public void setUp() { super.setUp(); player.attach(playerView); }
@Test public void whenStartingPlay_thenNotifiesStateListenersThatVideoIsPlaying() { player.play(); verify(stateChangedListener).onVideoPlaying(); }
@Test public void whenStopping_thenPlayerResourcesAreReleased_andNotListeners() { player.stop(); verify(delayedActionExecutor).clearAllActions(); verify(listenersHolder).resetState(); verify(stateChangedListener).onVideoStopped(); verify(loadTimeout).cancel(); verify(heart).stopBeatingHeart(); verify(mediaPlayer).release(); verify(listenersHolder, never()).clear(); }
@Test public void whenSeeking_thenSeeksToPosition() { long seekPositionInMillis = TWO_MINUTES_IN_MILLIS; player.seekTo(seekPositionInMillis); verify(mediaPlayer).seekTo(seekPositionInMillis); }
given(forwarder.onHeartbeatListener()).willReturn(bufferListener); player = new AndroidMediaPlayerImpl( mediaPlayerInformation, mediaPlayer,