@Override public void stop(boolean reset) { verifyApplicationThread(); player.stop(reset); if (mediaSource != null) { mediaSource.removeEventListener(analyticsCollector); analyticsCollector.resetForNewMediaSource(); if (reset) { mediaSource = null; } } audioFocusManager.handleStop(); currentCues = Collections.emptyList(); }
@Override public void release() { audioFocusManager.handleStop(); player.release(); removeSurfaceCallbacks(); if (surface != null) { if (ownsSurface) { surface.release(); } surface = null; } if (mediaSource != null) { mediaSource.removeEventListener(analyticsCollector); mediaSource = null; } bandwidthMeter.removeEventListener(analyticsCollector); currentCues = Collections.emptyList(); }
@Test public void handleStop_withoutHandlingAudioFocus_isNoOp() { // Ensure that handleStop is a no-op if audio focus isn't handled. Shadows.shadowOf(audioManager) .setNextFocusRequestResponse(AudioManager.AUDIOFOCUS_REQUEST_GRANTED); assertThat( audioFocusManager.setAudioAttributes( /* audioAttributes= */ null, /* playWhenReady= */ false, Player.STATE_READY)) .isEqualTo(PLAYER_COMMAND_DO_NOT_PLAY); assertThat(Shadows.shadowOf(audioManager).getLastAbandonedAudioFocusListener()).isNull(); ShadowAudioManager.AudioFocusRequest request = Shadows.shadowOf(audioManager).getLastAudioFocusRequest(); assertThat(request).isNull(); audioFocusManager.handleStop(); assertThat(Shadows.shadowOf(audioManager).getLastAbandonedAudioFocusListener()).isNull(); }
@Test public void handleStop_withoutAudioFocus_stillAbandonsFocus() { // Ensure that handleStop causes AudioFocusManager to call through to abandon audio focus // even if focus wasn't requested. AudioAttributes media = new AudioAttributes.Builder() .setUsage(C.USAGE_MEDIA) .setContentType(C.CONTENT_TYPE_SPEECH) .build(); Shadows.shadowOf(audioManager) .setNextFocusRequestResponse(AudioManager.AUDIOFOCUS_REQUEST_GRANTED); assertThat( audioFocusManager.setAudioAttributes( media, /* playWhenReady= */ false, Player.STATE_READY)) .isEqualTo(PLAYER_COMMAND_DO_NOT_PLAY); assertThat(Shadows.shadowOf(audioManager).getLastAbandonedAudioFocusListener()).isNull(); ShadowAudioManager.AudioFocusRequest request = Shadows.shadowOf(audioManager).getLastAudioFocusRequest(); assertThat(request).isNull(); audioFocusManager.handleStop(); assertThat(Shadows.shadowOf(audioManager).getLastAbandonedAudioFocusListener()).isNotNull(); }
@Test public void handleStop_withAudioFocus_abandonsAudioFocus() { // Ensure that handleStop causes AudioFocusManager to abandon audio focus. AudioAttributes media = new AudioAttributes.Builder() .setUsage(C.USAGE_MEDIA) .setContentType(C.CONTENT_TYPE_SPEECH) .build(); Shadows.shadowOf(audioManager) .setNextFocusRequestResponse(AudioManager.AUDIOFOCUS_REQUEST_GRANTED); assertThat( audioFocusManager.setAudioAttributes( media, /* playWhenReady= */ true, Player.STATE_READY)) .isEqualTo(PLAYER_COMMAND_PLAY_WHEN_READY); assertThat(Shadows.shadowOf(audioManager).getLastAbandonedAudioFocusListener()).isNull(); ShadowAudioManager.AudioFocusRequest request = Shadows.shadowOf(audioManager).getLastAudioFocusRequest(); audioFocusManager.handleStop(); assertThat(Shadows.shadowOf(audioManager).getLastAbandonedAudioFocusListener()) .isEqualTo(request.listener); }