@Before public void setUp() { loadTimeout = new LoadTimeout(clock, handler); doAnswer(new Answer<Void>() { @Override public Void answer(InvocationOnMock invocation) throws Throwable { Runnable runnable = invocation.getArgument(0); runnable.run(); return null; } }).when(handler).post(any(Runnable.class)); }
@Override public void onPrepared(PlayerState playerState) { loadTimeout.cancel(); } });
@Override public void loadVideoWithTimeout(Uri uri, Options options, Timeout timeout, LoadTimeoutCallback loadTimeoutCallback) { loadTimeout.start(timeout, loadTimeoutCallback); loadVideo(uri, options); }
@Override public void onPrepared(PlayerState playerState) { loadTimeout.cancel(); mediaPlayer.setOnSeekCompleteListener(seekToResettingSeekListener); } });
@Override public void loadVideoWithTimeout(Uri uri, Options options, Timeout timeout, LoadTimeoutCallback loadTimeoutCallback) { loadTimeout.start(timeout, loadTimeoutCallback); loadVideo(uri, options); }
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 ); } }
public void start(Timeout timeout, NoPlayer.LoadTimeoutCallback loadTimeoutCallback) { cancel(); this.loadTimeoutCallback = loadTimeoutCallback; startTime = clock.getCurrentTime(); endTime = startTime + timeout.inMillis(); handler.post(loadTimeoutCheck); }
@Test public void whenStartingATimeout_thenTheTimeoutRunnableIsPosted() { loadTimeout.start(ANY_TIME, any(NoPlayer.LoadTimeoutCallback.class)); verify(handler).post(any(Runnable.class)); }
LoadTimeout loadTimeout = new LoadTimeout(new SystemClock(), handler); Heart heart = Heart.newInstance(handler);
@Override public void run() { if (clock.getCurrentTime() >= endTime) { loadTimeoutCallback.onLoadTimeout(); cancel(); } else { handler.postDelayed(this, DELAY_MILLIS); } } };
@Test public void whenStartingATimeout_thenAnyPreviouslySetTimeoutRunnableAreRemoved() { loadTimeout.start(ANY_TIME, any(NoPlayer.LoadTimeoutCallback.class)); verify(handler).removeCallbacks(any(Runnable.class)); }
@Test public void whenCancelingATimeout_thenTimeoutRunnableIsRemoved() { loadTimeout.cancel(); verify(handler).removeCallbacks(any(Runnable.class)); } }
@Test public void givenTimeoutIsNotReached_whenStarting_thenTimeoutIsRescheduled() { when(clock.getCurrentTime()).thenReturn(START_TIME, END_TIME); loadTimeout.start(TIMEOUT_NOT_REACHED, loadTimeoutCallback); ArgumentCaptor<Runnable> captor = ArgumentCaptor.forClass(Runnable.class); verify(handler).post(captor.capture()); verify(handler).postDelayed(captor.getValue(), RESCHEDULE_DELAY_MILLIS); } }
private void reset() { listenersHolder.resetState(); loadTimeout.cancel(); heart.stopBeatingHeart(); exoPlayer.release(); destroySurfaceByHidingVideoContainer(); }
@Test public void whenLoadingVideoWithTimeout_thenStartsTimeout() { player.loadVideoWithTimeout(URI, OPTIONS, ANY_TIMEOUT, ANY_LOAD_TIMEOUT_CALLBACK); verify(loadTimeout).start(ANY_TIMEOUT, ANY_LOAD_TIMEOUT_CALLBACK); }
@Test public void givenInitialised_whenCallingOnError_thenCancelsTimeout() { 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(loadTimeout).cancel(); }
@Test public void givenTimeoutIsReached_whenStarting_thenOnLoadTimeoutIsCalled() { when(clock.getCurrentTime()).thenReturn(START_TIME, END_TIME); loadTimeout.start(TIMEOUT_REACHED, loadTimeoutCallback); verify(loadTimeoutCallback).onLoadTimeout(); }
@Test public void givenInitialised_whenCallingOnPrepared_thenCancelsTimeout() { player.initialise(); ArgumentCaptor<NoPlayer.PreparedListener> preparedListenerCaptor = ArgumentCaptor.forClass(NoPlayer.PreparedListener.class); verify(listenersHolder).addPreparedListener(preparedListenerCaptor.capture()); NoPlayer.PreparedListener preparedListener = preparedListenerCaptor.getValue(); preparedListener.onPrepared(player); verify(loadTimeout).cancel(); }
@Test public void whenLoadingVideoWithTimeout_thenStartsLoadTimeout() { player.attach(playerView); player.loadVideoWithTimeout(uri, OPTIONS, ANY_TIMEOUT, ANY_LOAD_TIMEOUT_CALLBACK); verify(loadTimeout).start(ANY_TIMEOUT, ANY_LOAD_TIMEOUT_CALLBACK); }
@Test public void givenPlayerIsInitialised_whenVideoIsPrepared_thenCancelsTimeout() { player.initialise(); ArgumentCaptor<NoPlayer.PreparedListener> argumentCaptor = ArgumentCaptor.forClass(NoPlayer.PreparedListener.class); verify(listenersHolder).addPreparedListener(argumentCaptor.capture()); NoPlayer.PreparedListener preparedListener = argumentCaptor.getValue(); preparedListener.onPrepared(player); verify(loadTimeout).cancel(); }