use of com.google.android.exoplayer2.Player in project ExoPlayer by google.
the class SessionPlayerConnectorTest method play_byUnderlyingPlayer_notifiesOnPlayerStateChanges.
@Test
@LargeTest
public void play_byUnderlyingPlayer_notifiesOnPlayerStateChanges() throws Exception {
TestUtils.loadResource(R.raw.audio, sessionPlayerConnector);
ExoPlayer exoPlayer = playerTestRule.getExoPlayer();
CountDownLatch onPlayingLatch = new CountDownLatch(1);
sessionPlayerConnector.registerPlayerCallback(executor, new SessionPlayer.PlayerCallback() {
@Override
public void onPlayerStateChanged(SessionPlayer player, int playerState) {
if (playerState == PLAYER_STATE_PLAYING) {
onPlayingLatch.countDown();
}
}
});
assertPlayerResultSuccess(sessionPlayerConnector.prepare());
InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> exoPlayer.setPlayWhenReady(true));
assertThat(onPlayingLatch.await(PLAYER_STATE_CHANGE_WAIT_TIME_MS, MILLISECONDS)).isTrue();
}
use of com.google.android.exoplayer2.Player in project ExoPlayer by google.
the class TimelineQueueNavigator method getSupportedQueueNavigatorActions.
@Override
public long getSupportedQueueNavigatorActions(Player player) {
boolean enableSkipTo = false;
boolean enablePrevious = false;
boolean enableNext = false;
Timeline timeline = player.getCurrentTimeline();
if (!timeline.isEmpty() && !player.isPlayingAd()) {
timeline.getWindow(player.getCurrentMediaItemIndex(), window);
enableSkipTo = timeline.getWindowCount() > 1;
enablePrevious = player.isCommandAvailable(COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM) || !window.isLive() || player.isCommandAvailable(COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM);
enableNext = (window.isLive() && window.isDynamic) || player.isCommandAvailable(COMMAND_SEEK_TO_NEXT_MEDIA_ITEM);
}
long actions = 0;
if (enableSkipTo) {
actions |= PlaybackStateCompat.ACTION_SKIP_TO_QUEUE_ITEM;
}
if (enablePrevious) {
actions |= PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS;
}
if (enableNext) {
actions |= PlaybackStateCompat.ACTION_SKIP_TO_NEXT;
}
return actions;
}
use of com.google.android.exoplayer2.Player in project ExoPlayer by google.
the class TimelineQueueNavigator method onSkipToQueueItem.
@Override
public void onSkipToQueueItem(Player player, long id) {
Timeline timeline = player.getCurrentTimeline();
if (timeline.isEmpty() || player.isPlayingAd()) {
return;
}
int windowIndex = (int) id;
if (0 <= windowIndex && windowIndex < timeline.getWindowCount()) {
player.seekToDefaultPosition(windowIndex);
}
}
use of com.google.android.exoplayer2.Player in project ExoPlayer by google.
the class TimelineQueueNavigator method publishFloatingQueueWindow.
// Helper methods.
private void publishFloatingQueueWindow(Player player) {
Timeline timeline = player.getCurrentTimeline();
if (timeline.isEmpty()) {
mediaSession.setQueue(Collections.emptyList());
activeQueueItemId = MediaSessionCompat.QueueItem.UNKNOWN_ID;
return;
}
ArrayDeque<MediaSessionCompat.QueueItem> queue = new ArrayDeque<>();
int queueSize = min(maxQueueSize, timeline.getWindowCount());
// Add the active queue item.
int currentMediaItemIndex = player.getCurrentMediaItemIndex();
queue.add(new MediaSessionCompat.QueueItem(getMediaDescription(player, currentMediaItemIndex), currentMediaItemIndex));
// Fill queue alternating with next and/or previous queue items.
int firstMediaItemIndex = currentMediaItemIndex;
int lastMediaItemIndex = currentMediaItemIndex;
boolean shuffleModeEnabled = player.getShuffleModeEnabled();
while ((firstMediaItemIndex != C.INDEX_UNSET || lastMediaItemIndex != C.INDEX_UNSET) && queue.size() < queueSize) {
// Begin with next to have a longer tail than head if an even sized queue needs to be trimmed.
if (lastMediaItemIndex != C.INDEX_UNSET) {
lastMediaItemIndex = timeline.getNextWindowIndex(lastMediaItemIndex, Player.REPEAT_MODE_OFF, shuffleModeEnabled);
if (lastMediaItemIndex != C.INDEX_UNSET) {
queue.add(new MediaSessionCompat.QueueItem(getMediaDescription(player, lastMediaItemIndex), lastMediaItemIndex));
}
}
if (firstMediaItemIndex != C.INDEX_UNSET && queue.size() < queueSize) {
firstMediaItemIndex = timeline.getPreviousWindowIndex(firstMediaItemIndex, Player.REPEAT_MODE_OFF, shuffleModeEnabled);
if (firstMediaItemIndex != C.INDEX_UNSET) {
queue.addFirst(new MediaSessionCompat.QueueItem(getMediaDescription(player, firstMediaItemIndex), firstMediaItemIndex));
}
}
}
mediaSession.setQueue(new ArrayList<>(queue));
activeQueueItemId = currentMediaItemIndex;
}
use of com.google.android.exoplayer2.Player in project ExoPlayer by google.
the class DefaultAnalyticsCollector method generateMediaPeriodEventTime.
private EventTime generateMediaPeriodEventTime(int windowIndex, @Nullable MediaPeriodId mediaPeriodId) {
checkNotNull(player);
if (mediaPeriodId != null) {
boolean isInKnownTimeline = mediaPeriodQueueTracker.getMediaPeriodIdTimeline(mediaPeriodId) != null;
return isInKnownTimeline ? generateEventTime(mediaPeriodId) : generateEventTime(Timeline.EMPTY, windowIndex, mediaPeriodId);
}
Timeline timeline = player.getCurrentTimeline();
boolean windowIsInTimeline = windowIndex < timeline.getWindowCount();
return generateEventTime(windowIsInTimeline ? timeline : Timeline.EMPTY, windowIndex, /* mediaPeriodId= */
null);
}
Aggregations