@Test public void givenMultipleQueuedActions_whenClearingActions_thenRemovesAllActions() { delayedActionExecutor = new DelayedActionExecutor(nonExecutingHandler, runnables); delayedActionExecutor.performAfterDelay(action, ANY_DELAY_IN_MILLIS); delayedActionExecutor.performAfterDelay(secondaryAction, ANY_DELAY_IN_MILLIS); delayedActionExecutor.clearAllActions(); assertThat(runnables).isEmpty(); verify(nonExecutingHandler, times(2)).removeCallbacks(any(Runnable.class)); }
@Test public void whenPerformingActionAfterDelay_thenPerformsAction() { delayedActionExecutor = new DelayedActionExecutor(immediatelyExecutingHandler, runnables); delayedActionExecutor.performAfterDelay(action, ANY_DELAY_IN_MILLIS); verify(action).perform(); }
private void reset() { delayedActionExecutor.clearAllActions(); listenersHolder.resetState(); loadTimeout.cancel(); heart.stopBeatingHeart(); mediaPlayer.release(); destroySurfaceByHidingVideoContainer(); }
/** * Workaround to fix some devices (nexus 7 2013 in particular) from natively crashing the mediaplayer * by starting the mediaplayer before seeking it. */ private void initialSeekWorkaround(Either<Surface, SurfaceHolder> surface, final long initialPlayPositionInMillis) throws IllegalStateException { listenersHolder.getBufferStateListeners().onBufferStarted(); initialisePlaybackForSeeking(surface); delayedActionExecutor.performAfterDelay(new DelayedActionExecutor.Action() { @Override public void perform() { seekWithIntentToPlay(initialPlayPositionInMillis); } }, INITIAL_PLAY_SEEK_DELAY_IN_MILLIS); }
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 whenActionIsNotPerformedYet_thenMapContainsAction() { delayedActionExecutor = new DelayedActionExecutor(nonExecutingHandler, runnables); delayedActionExecutor.performAfterDelay(action, ANY_DELAY_IN_MILLIS); assertThat(runnables).hasSize(1); }
@Test public void givenInitialised_whenCallingOnError_thenPlayerResourcesAreReleased_andNotListeners() { player.initialise(); ArgumentCaptor<NoPlayer.ErrorListener> errorListenerCaptor = ArgumentCaptor.forClass(NoPlayer.ErrorListener.class); verify(listenersHolder).addErrorListener(errorListenerCaptor.capture()); NoPlayer.ErrorListener errorListener = errorListenerCaptor.getValue(); errorListener.onError(mock(NoPlayer.PlayerError.class)); verify(delayedActionExecutor).clearAllActions(); verify(listenersHolder).resetState(); verify(loadTimeout).cancel(); verify(heart).stopBeatingHeart(); verify(mediaPlayer).release(); verify(listenersHolder, never()).clear(); verify(stateChangedListener, never()).onVideoStopped(); }
@Test public void givenPositionThatDiffersFromPlayheadPosition_whenStartingPlayAtVideoPosition_thenSeeksToVideoPosition() { long differentPositionInMillis = givenPositionThatDiffersFromPlayheadPosition(); player.playAt(differentPositionInMillis); ArgumentCaptor<DelayedActionExecutor.Action> argumentCaptor = ArgumentCaptor.forClass(DelayedActionExecutor.Action.class); verify(delayedActionExecutor).performAfterDelay(argumentCaptor.capture(), eq(DELAY_MILLIS)); argumentCaptor.getValue().perform(); verify(mediaPlayer).seekTo(differentPositionInMillis); }
@Test public void whenPerformingActionAfterDelay_thenRemovesActionFromMap() { delayedActionExecutor = new DelayedActionExecutor(immediatelyExecutingHandler, runnables); delayedActionExecutor.performAfterDelay(action, ANY_DELAY_IN_MILLIS); assertThat(runnables).isEmpty(); }
@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 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(); }
@Test public void whenReleasing_thenPlayerResourcesAreReleased() { player.release(); verify(delayedActionExecutor).clearAllActions(); verify(listenersHolder).resetState(); verify(stateChangedListener).onVideoStopped(); verify(loadTimeout).cancel(); verify(heart).stopBeatingHeart(); verify(mediaPlayer).release(); verify(listenersHolder).clear(); }
@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(); } }