2018-03-16 07:42:46 +01:00
|
|
|
package org.schabi.newpipe.player.mediasession;
|
|
|
|
|
|
|
|
import android.os.Bundle;
|
|
|
|
import android.os.ResultReceiver;
|
2019-10-07 07:54:31 +02:00
|
|
|
import android.support.v4.media.session.MediaSessionCompat;
|
|
|
|
|
2019-10-04 14:59:08 +02:00
|
|
|
import androidx.annotation.NonNull;
|
|
|
|
import androidx.annotation.Nullable;
|
2018-03-16 07:42:46 +01:00
|
|
|
|
2019-10-07 07:54:31 +02:00
|
|
|
import com.google.android.exoplayer2.ControlDispatcher;
|
2018-03-16 07:42:46 +01:00
|
|
|
import com.google.android.exoplayer2.Player;
|
|
|
|
import com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector;
|
|
|
|
import com.google.android.exoplayer2.util.Util;
|
|
|
|
|
|
|
|
import java.util.ArrayList;
|
|
|
|
import java.util.Collections;
|
|
|
|
import java.util.List;
|
|
|
|
|
|
|
|
import static android.support.v4.media.session.PlaybackStateCompat.ACTION_SKIP_TO_NEXT;
|
|
|
|
import static android.support.v4.media.session.PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS;
|
|
|
|
import static android.support.v4.media.session.PlaybackStateCompat.ACTION_SKIP_TO_QUEUE_ITEM;
|
|
|
|
|
|
|
|
|
|
|
|
public class PlayQueueNavigator implements MediaSessionConnector.QueueNavigator {
|
|
|
|
public static final int DEFAULT_MAX_QUEUE_SIZE = 10;
|
|
|
|
|
|
|
|
private final MediaSessionCompat mediaSession;
|
|
|
|
private final MediaSessionCallback callback;
|
|
|
|
private final int maxQueueSize;
|
|
|
|
|
|
|
|
private long activeQueueItemId;
|
|
|
|
|
|
|
|
public PlayQueueNavigator(@NonNull final MediaSessionCompat mediaSession,
|
|
|
|
@NonNull final MediaSessionCallback callback) {
|
|
|
|
this.mediaSession = mediaSession;
|
|
|
|
this.callback = callback;
|
|
|
|
this.maxQueueSize = DEFAULT_MAX_QUEUE_SIZE;
|
|
|
|
|
|
|
|
this.activeQueueItemId = MediaSessionCompat.QueueItem.UNKNOWN_ID;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public long getSupportedQueueNavigatorActions(@Nullable Player player) {
|
|
|
|
return ACTION_SKIP_TO_NEXT | ACTION_SKIP_TO_PREVIOUS | ACTION_SKIP_TO_QUEUE_ITEM;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void onTimelineChanged(Player player) {
|
|
|
|
publishFloatingQueueWindow();
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void onCurrentWindowIndexChanged(Player player) {
|
|
|
|
if (activeQueueItemId == MediaSessionCompat.QueueItem.UNKNOWN_ID
|
|
|
|
|| player.getCurrentTimeline().getWindowCount() > maxQueueSize) {
|
|
|
|
publishFloatingQueueWindow();
|
|
|
|
} else if (!player.getCurrentTimeline().isEmpty()) {
|
|
|
|
activeQueueItemId = player.getCurrentWindowIndex();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public long getActiveQueueItemId(@Nullable Player player) {
|
|
|
|
return callback.getCurrentPlayingIndex();
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2019-10-07 07:54:31 +02:00
|
|
|
public void onSkipToPrevious(Player player, ControlDispatcher controlDispatcher) {
|
2018-03-16 07:42:46 +01:00
|
|
|
callback.onSkipToPrevious();
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2019-10-07 07:54:31 +02:00
|
|
|
public void onSkipToQueueItem(Player player, ControlDispatcher controlDispatcher, long id) {
|
2018-03-16 07:42:46 +01:00
|
|
|
callback.onSkipToIndex((int) id);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2019-10-07 07:54:31 +02:00
|
|
|
public void onSkipToNext(Player player, ControlDispatcher controlDispatcher) {
|
2018-03-16 07:42:46 +01:00
|
|
|
callback.onSkipToNext();
|
|
|
|
}
|
|
|
|
|
|
|
|
private void publishFloatingQueueWindow() {
|
|
|
|
if (callback.getQueueSize() == 0) {
|
2018-08-28 19:17:14 +02:00
|
|
|
mediaSession.setQueue(Collections.emptyList());
|
2018-03-16 07:42:46 +01:00
|
|
|
activeQueueItemId = MediaSessionCompat.QueueItem.UNKNOWN_ID;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Yes this is almost a copypasta, got a problem with that? =\
|
|
|
|
int windowCount = callback.getQueueSize();
|
|
|
|
int currentWindowIndex = callback.getCurrentPlayingIndex();
|
|
|
|
int queueSize = Math.min(maxQueueSize, windowCount);
|
|
|
|
int startIndex = Util.constrainValue(currentWindowIndex - ((queueSize - 1) / 2), 0,
|
|
|
|
windowCount - queueSize);
|
|
|
|
|
|
|
|
List<MediaSessionCompat.QueueItem> queue = new ArrayList<>();
|
|
|
|
for (int i = startIndex; i < startIndex + queueSize; i++) {
|
|
|
|
queue.add(new MediaSessionCompat.QueueItem(callback.getQueueMetadata(i), i));
|
|
|
|
}
|
|
|
|
mediaSession.setQueue(queue);
|
|
|
|
activeQueueItemId = currentWindowIndex;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2019-10-07 07:54:31 +02:00
|
|
|
public boolean onCommand(Player player, ControlDispatcher controlDispatcher, String command, Bundle extras, ResultReceiver cb) {
|
|
|
|
return false;
|
2018-03-16 07:42:46 +01:00
|
|
|
}
|
|
|
|
}
|