Search in sources :

Example 26 with Player

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();
}
Also used : SessionPlayer(androidx.media2.common.SessionPlayer) ExoPlayer(com.google.android.exoplayer2.ExoPlayer) CountDownLatch(java.util.concurrent.CountDownLatch) MediumTest(androidx.test.filters.MediumTest) LargeTest(androidx.test.filters.LargeTest) SmallTest(androidx.test.filters.SmallTest) Test(org.junit.Test) LargeTest(androidx.test.filters.LargeTest)

Example 27 with Player

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;
}
Also used : Timeline(com.google.android.exoplayer2.Timeline)

Example 28 with Player

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);
    }
}
Also used : Timeline(com.google.android.exoplayer2.Timeline)

Example 29 with Player

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;
}
Also used : Timeline(com.google.android.exoplayer2.Timeline) MediaSessionCompat(android.support.v4.media.session.MediaSessionCompat) ArrayDeque(java.util.ArrayDeque)

Example 30 with Player

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);
}
Also used : Timeline(com.google.android.exoplayer2.Timeline)

Aggregations

Test (org.junit.Test)250 FakeMediaSource (com.google.android.exoplayer2.testutil.FakeMediaSource)185 TestExoPlayerBuilder (com.google.android.exoplayer2.testutil.TestExoPlayerBuilder)174 FakeTimeline (com.google.android.exoplayer2.testutil.FakeTimeline)127 PlayerRunnable (com.google.android.exoplayer2.testutil.ActionSchedule.PlayerRunnable)107 ActionSchedule (com.google.android.exoplayer2.testutil.ActionSchedule)91 SinglePeriodTimeline (com.google.android.exoplayer2.source.SinglePeriodTimeline)89 NoUidTimeline (com.google.android.exoplayer2.testutil.NoUidTimeline)89 Listener (com.google.android.exoplayer2.Player.Listener)85 TimelineWindowDefinition (com.google.android.exoplayer2.testutil.FakeTimeline.TimelineWindowDefinition)72 MediaSource (com.google.android.exoplayer2.source.MediaSource)68 ExoPlayerTestRunner (com.google.android.exoplayer2.testutil.ExoPlayerTestRunner)67 ConcatenatingMediaSource (com.google.android.exoplayer2.source.ConcatenatingMediaSource)66 Nullable (androidx.annotation.Nullable)56 ClippingMediaSource (com.google.android.exoplayer2.source.ClippingMediaSource)49 CompositeMediaSource (com.google.android.exoplayer2.source.CompositeMediaSource)49 MaskingMediaSource (com.google.android.exoplayer2.source.MaskingMediaSource)49 ServerSideAdInsertionMediaSource (com.google.android.exoplayer2.source.ads.ServerSideAdInsertionMediaSource)49 FakeAdaptiveMediaSource (com.google.android.exoplayer2.testutil.FakeAdaptiveMediaSource)49 ExoPlayer (com.google.android.exoplayer2.ExoPlayer)47