-Refactored synchronization checks out from MediaSourceManager to ManagedMediaSource.
-Fixed null input causing potential NPE on PlayQueueItem.
This commit is contained in:
parent
68b40f5a03
commit
a27a1fad2a
6 changed files with 61 additions and 35 deletions
|
|
@ -72,7 +72,13 @@ public class FailedMediaSource implements ManagedMediaSource {
|
|||
public void releaseSource() {}
|
||||
|
||||
@Override
|
||||
public boolean canReplace(@NonNull final PlayQueueItem newIdentity) {
|
||||
public boolean shouldBeReplacedWith(@NonNull final PlayQueueItem newIdentity,
|
||||
final boolean isInterruptable) {
|
||||
return newIdentity != playQueueItem || canRetry();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isStreamEqual(@NonNull PlayQueueItem stream) {
|
||||
return playQueueItem == stream;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -59,7 +59,13 @@ public class LoadedMediaSource implements ManagedMediaSource {
|
|||
}
|
||||
|
||||
@Override
|
||||
public boolean canReplace(@NonNull final PlayQueueItem newIdentity) {
|
||||
return newIdentity != stream || isExpired();
|
||||
public boolean shouldBeReplacedWith(@NonNull PlayQueueItem newIdentity,
|
||||
final boolean isInterruptable) {
|
||||
return newIdentity != stream || (isInterruptable && isExpired());
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isStreamEqual(@NonNull PlayQueueItem stream) {
|
||||
return this.stream == stream;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,5 +7,21 @@ import com.google.android.exoplayer2.source.MediaSource;
|
|||
import org.schabi.newpipe.playlist.PlayQueueItem;
|
||||
|
||||
public interface ManagedMediaSource extends MediaSource {
|
||||
boolean canReplace(@NonNull final PlayQueueItem newIdentity);
|
||||
/**
|
||||
* Determines whether or not this {@link ManagedMediaSource} can be replaced.
|
||||
*
|
||||
* @param newIdentity a stream the {@link ManagedMediaSource} should encapsulate over, if
|
||||
* it is different from the existing stream in the
|
||||
* {@link ManagedMediaSource}, then it should be replaced.
|
||||
* @param isInterruptable specifies if this {@link ManagedMediaSource} potentially
|
||||
* being played.
|
||||
* */
|
||||
boolean shouldBeReplacedWith(@NonNull final PlayQueueItem newIdentity,
|
||||
final boolean isInterruptable);
|
||||
|
||||
/**
|
||||
* Determines if the {@link PlayQueueItem} is the one the
|
||||
* {@link ManagedMediaSource} encapsulates over.
|
||||
* */
|
||||
boolean isStreamEqual(@NonNull final PlayQueueItem stream);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -19,7 +19,13 @@ public class PlaceholderMediaSource implements ManagedMediaSource {
|
|||
@Override public void releaseSource() {}
|
||||
|
||||
@Override
|
||||
public boolean canReplace(@NonNull final PlayQueueItem newIdentity) {
|
||||
public boolean shouldBeReplacedWith(@NonNull PlayQueueItem newIdentity,
|
||||
final boolean isInterruptable) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isStreamEqual(@NonNull PlayQueueItem stream) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -268,15 +268,10 @@ public class MediaSourceManager {
|
|||
private boolean isPlaybackReady() {
|
||||
if (sources.getSize() != playQueue.size()) return false;
|
||||
|
||||
final MediaSource mediaSource = sources.getMediaSource(playQueue.getIndex());
|
||||
final ManagedMediaSource mediaSource =
|
||||
(ManagedMediaSource) sources.getMediaSource(playQueue.getIndex());
|
||||
final PlayQueueItem playQueueItem = playQueue.getItem();
|
||||
|
||||
if (mediaSource instanceof LoadedMediaSource) {
|
||||
return playQueueItem == ((LoadedMediaSource) mediaSource).getStream();
|
||||
} else if (mediaSource instanceof FailedMediaSource) {
|
||||
return playQueueItem == ((FailedMediaSource) mediaSource).getStream();
|
||||
}
|
||||
return false;
|
||||
return mediaSource.isStreamEqual(playQueueItem);
|
||||
}
|
||||
|
||||
private void maybeBlock() {
|
||||
|
|
@ -453,12 +448,8 @@ public class MediaSourceManager {
|
|||
if (index == -1 || index >= sources.getSize()) return false;
|
||||
|
||||
final ManagedMediaSource mediaSource = (ManagedMediaSource) sources.getMediaSource(index);
|
||||
|
||||
if (index == playQueue.getIndex() && mediaSource instanceof LoadedMediaSource) {
|
||||
return item != ((LoadedMediaSource) mediaSource).getStream();
|
||||
} else {
|
||||
return mediaSource.canReplace(item);
|
||||
}
|
||||
return mediaSource.shouldBeReplacedWith(item,
|
||||
/*mightBeInProgress=*/index != playQueue.getIndex());
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -479,7 +470,7 @@ public class MediaSourceManager {
|
|||
final ManagedMediaSource currentSource =
|
||||
(ManagedMediaSource) sources.getMediaSource(currentIndex);
|
||||
final PlayQueueItem currentItem = playQueue.getItem();
|
||||
if (!currentSource.canReplace(currentItem)) {
|
||||
if (!currentSource.shouldBeReplacedWith(currentItem, /*canInterruptOnRenew=*/true)) {
|
||||
maybeSynchronizePlayer();
|
||||
return;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue