Skip to content

Commit 690af88

Browse files
Add PlayQueueItem equals and hashCode
1 parent 840084d commit 690af88

File tree

5 files changed

+40
-39
lines changed

5 files changed

+40
-39
lines changed

app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -852,8 +852,7 @@ private void runWorker(final boolean forceLoad, final boolean addToBackStack) {
852852
if (playQueue == null) {
853853
playQueue = new SinglePlayQueue(result);
854854
}
855-
if (stack.isEmpty() || !stack.peek().getPlayQueue()
856-
.equalStreams(playQueue)) {
855+
if (stack.isEmpty() || !stack.peek().getPlayQueue().equals(playQueue)) {
857856
stack.push(new StackItem(serviceId, url, title, playQueue));
858857
}
859858
}
@@ -1739,7 +1738,7 @@ public void onQueueUpdate(final PlayQueue queue) {
17391738
// deleted/added items inside Channel/Playlist queue and makes possible to have
17401739
// a history of played items
17411740
@Nullable final StackItem stackPeek = stack.peek();
1742-
if (stackPeek != null && !stackPeek.getPlayQueue().equalStreams(queue)) {
1741+
if (stackPeek != null && !stackPeek.getPlayQueue().equals(queue)) {
17431742
@Nullable final PlayQueueItem playQueueItem = queue.getItem();
17441743
if (playQueueItem != null) {
17451744
stack.push(new StackItem(playQueueItem.getServiceId(), playQueueItem.getUrl(),
@@ -1803,7 +1802,7 @@ public void onMetadataUpdate(final StreamInfo info, final PlayQueue queue) {
18031802
// They are not equal when user watches something in popup while browsing in fragment and
18041803
// then changes screen orientation. In that case the fragment will set itself as
18051804
// a service listener and will receive initial call to onMetadataUpdate()
1806-
if (!queue.equalStreams(playQueue)) {
1805+
if (!queue.equals(playQueue)) {
18071806
return;
18081807
}
18091808

@@ -2073,9 +2072,10 @@ private boolean wasCleared() {
20732072
private StackItem findQueueInStack(final PlayQueue queue) {
20742073
StackItem item = null;
20752074
final Iterator<StackItem> iterator = stack.descendingIterator();
2075+
20762076
while (iterator.hasNext()) {
20772077
final StackItem next = iterator.next();
2078-
if (next.getPlayQueue().equalStreams(queue)) {
2078+
if (next.getPlayQueue().equals(queue)) {
20792079
item = next;
20802080
break;
20812081
}
@@ -2089,8 +2089,7 @@ private void replaceQueueIfUserConfirms(final Runnable onAllow) {
20892089
// Player will have STATE_IDLE when a user pressed back button
20902090
if (isClearingQueueConfirmationRequired(activity)
20912091
&& playerIsNotStopped()
2092-
&& activeQueue != null
2093-
&& !activeQueue.equalStreams(playQueue)) {
2092+
&& !Objects.equals(activeQueue, playQueue)) {
20942093
showClearingQueueConfirmation(onAllow);
20952094
} else {
20962095
onAllow.run();

app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueue.java

Lines changed: 9 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -518,31 +518,18 @@ public synchronized boolean previous() {
518518
* This method also gives a chance to track history of items in a queue in
519519
* VideoDetailFragment without duplicating items from two identical queues
520520
*/
521-
public boolean equalStreams(@Nullable final PlayQueue other) {
522-
if (other == null) {
523-
return false;
524-
}
525-
if (size() != other.size()) {
526-
return false;
527-
}
528-
for (int i = 0; i < size(); i++) {
529-
final PlayQueueItem stream = streams.get(i);
530-
final PlayQueueItem otherStream = other.streams.get(i);
531-
// Check is based on serviceId and URL
532-
if (stream.getServiceId() != otherStream.getServiceId()
533-
|| !stream.getUrl().equals(otherStream.getUrl())) {
534-
return false;
535-
}
536-
}
537-
return true;
521+
@Override
522+
public boolean equals(final Object o) {
523+
return o instanceof PlayQueue playQueue && streams.equals(playQueue.streams);
524+
}
525+
526+
@Override
527+
public int hashCode() {
528+
return streams.hashCode();
538529
}
539530

540531
public boolean equalStreamsAndIndex(@Nullable final PlayQueue other) {
541-
if (equalStreams(other)) {
542-
//noinspection ConstantConditions
543-
return other.getIndex() == getIndex(); //NOSONAR: other is not null
544-
}
545-
return false;
532+
return equals(other) && other.getIndex() == getIndex();
546533
}
547534

548535
public boolean isDisposed() {

app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueueItem.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
import java.io.Serializable;
1313
import java.util.List;
14+
import java.util.Objects;
1415

1516
import io.reactivex.rxjava3.core.Single;
1617
import io.reactivex.rxjava3.schedulers.Schedulers;
@@ -139,4 +140,16 @@ public boolean isAutoQueued() {
139140
public void setAutoQueued(final boolean autoQueued) {
140141
isAutoQueued = autoQueued;
141142
}
143+
144+
@Override
145+
public boolean equals(final Object o) {
146+
return o instanceof PlayQueueItem item
147+
&& serviceId == item.serviceId
148+
&& url.equals(item.url);
149+
}
150+
151+
@Override
152+
public int hashCode() {
153+
return Objects.hash(url, serviceId);
154+
}
142155
}
Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,17 @@
11
package org.schabi.newpipe.player.playqueue;
22

3-
import org.junit.Test;
4-
53
import static org.junit.Assert.assertEquals;
6-
import static org.junit.Assert.assertNotEquals;
4+
5+
import org.junit.Test;
76

87
public class PlayQueueItemTest {
98

109
public static final String URL = "MY_URL";
1110

1211
@Test
13-
public void equalsMustNotBeOverloaded() {
12+
public void equalsMustWork() {
1413
final PlayQueueItem a = PlayQueueTest.makeItemWithUrl(URL);
1514
final PlayQueueItem b = PlayQueueTest.makeItemWithUrl(URL);
16-
assertEquals(a, a);
17-
assertNotEquals(a, b); // they should compare different even if they have the same data
15+
assertEquals(a, b);
1816
}
1917
}

app/src/test/java/org/schabi/newpipe/player/playqueue/PlayQueueTest.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import org.junit.Before;
44
import org.junit.BeforeClass;
55
import org.junit.Test;
6+
import org.junit.experimental.runners.Enclosed;
7+
import org.junit.runner.RunWith;
68
import org.schabi.newpipe.extractor.stream.StreamInfoItem;
79
import org.schabi.newpipe.extractor.stream.StreamType;
810

@@ -13,12 +15,14 @@
1315

1416
import static org.junit.Assert.assertEquals;
1517
import static org.junit.Assert.assertFalse;
18+
import static org.junit.Assert.assertNotEquals;
1619
import static org.junit.Assert.assertNull;
1720
import static org.junit.Assert.assertSame;
1821
import static org.junit.Assert.assertTrue;
1922
import static org.mockito.Mockito.doReturn;
2023
import static org.mockito.Mockito.spy;
2124

25+
@RunWith(Enclosed.class)
2226
@SuppressWarnings("checkstyle:HideUtilityClassConstructor")
2327
public class PlayQueueTest {
2428
static PlayQueue makePlayQueue(final int index, final List<PlayQueueItem> streams) {
@@ -168,7 +172,7 @@ public void sameStreams() {
168172
final List<PlayQueueItem> streams = Collections.nCopies(5, item1);
169173
final PlayQueue queue1 = makePlayQueue(0, streams);
170174
final PlayQueue queue2 = makePlayQueue(0, streams);
171-
assertTrue(queue1.equalStreams(queue2));
175+
assertEquals(queue1, queue2);
172176
assertTrue(queue1.equalStreamsAndIndex(queue2));
173177
}
174178

@@ -177,7 +181,7 @@ public void sameStreamsDifferentIndex() {
177181
final List<PlayQueueItem> streams = Collections.nCopies(5, item1);
178182
final PlayQueue queue1 = makePlayQueue(1, streams);
179183
final PlayQueue queue2 = makePlayQueue(4, streams);
180-
assertTrue(queue1.equalStreams(queue2));
184+
assertEquals(queue1, queue2);
181185
assertFalse(queue1.equalStreamsAndIndex(queue2));
182186
}
183187

@@ -187,7 +191,7 @@ public void sameSizeDifferentItems() {
187191
final List<PlayQueueItem> streams2 = Collections.nCopies(5, item2);
188192
final PlayQueue queue1 = makePlayQueue(0, streams1);
189193
final PlayQueue queue2 = makePlayQueue(0, streams2);
190-
assertFalse(queue1.equalStreams(queue2));
194+
assertNotEquals(queue1, queue2);
191195
}
192196

193197
@Test
@@ -196,7 +200,7 @@ public void differentSizeStreams() {
196200
final List<PlayQueueItem> streams2 = Collections.nCopies(6, item2);
197201
final PlayQueue queue1 = makePlayQueue(0, streams1);
198202
final PlayQueue queue2 = makePlayQueue(0, streams2);
199-
assertFalse(queue1.equalStreams(queue2));
203+
assertNotEquals(queue1, queue2);
200204
}
201205
}
202206
}

0 commit comments

Comments
 (0)