diff --git a/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueue.java b/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueue.java
index d4d80b0da..16a5f6471 100644
--- a/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueue.java
+++ b/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueue.java
@@ -77,19 +77,21 @@ public abstract class PlayQueue implements Serializable {
* Also starts a self reporter for logging if debug mode is enabled.
*
*/
- public synchronized void init() { // todo: cas mechanics
- BehaviorSubject b = BehaviorSubject.create();
+ public synchronized void init() {
+ if (broadcastReceiver == null || eventBroadcast == null) {
+ BehaviorSubject b = BehaviorSubject.create();
- broadcastReceiver = b.toFlowable(BackpressureStrategy.BUFFER)
- .observeOn(AndroidSchedulers.mainThread())
- .startWithItem(new InitEvent());
- eventBroadcast = b;
+ broadcastReceiver = b.toFlowable(BackpressureStrategy.BUFFER)
+ .observeOn(AndroidSchedulers.mainThread())
+ .startWithItem(new InitEvent());
+ eventBroadcast = b;
+ }
}
/**
* Dispose the play queue by stopping all message buses.
*/
- public synchronized void dispose() { // todo: cas mechanics
+ public synchronized void dispose() {
if (eventBroadcast != null) {
eventBroadcast.onComplete();
}
@@ -447,9 +449,9 @@ public abstract class PlayQueue implements Serializable {
// Create a backup if it doesn't already exist
// Note: The backup-list has to be created at all cost (even when size <= 2).
// Otherwise it's not possible to enter shuffle-mode!
- if (backup == null) {
- backup = new ArrayList<>(streams);
- }
+
+ List copy = backup == null ? new ArrayList<>(streams) : null;
+
// Can't shuffle a list that's empty or only has one element
if (size() <= 2) {
return;
@@ -467,6 +469,9 @@ public abstract class PlayQueue implements Serializable {
history.add(currentItem);
+ if (copy != null)
+ backup = copy;
+
broadcast(new ReorderEvent(originalIndex, 0));
}
@@ -488,6 +493,7 @@ public abstract class PlayQueue implements Serializable {
final PlayQueueItem current = getItem(originIndex);
streams = backup;
+ // storeStoreFence
backup = null;
final int newIndex = streams.indexOf(current);
@@ -535,10 +541,11 @@ public abstract class PlayQueue implements Serializable {
return false;
}
synchronized (this) {
- if (size() != other.size()) {
+ final int size = size();
+ if (size != other.size()) {
return false;
}
- for (int i = 0; i < size(); i++) {
+ for (int i = 0; i < size; i++) {
final PlayQueueItem stream = streams.get(i);
final PlayQueueItem otherStream = other.streams.get(i);
// Check is based on serviceId and URL