added a "Shuffle and play" menu item in Playlist fragments (closes #24)

This commit is contained in:
polymorphicshade 2024-04-03 20:08:26 -06:00
parent 305c17c201
commit c995fdb189
8 changed files with 77 additions and 0 deletions

View file

@ -28,6 +28,7 @@ import org.schabi.newpipe.util.ChannelTabHelper;
import org.schabi.newpipe.util.ExtractorHelper;
import org.schabi.newpipe.util.PlayButtonHelper;
import java.util.Collections;
import java.util.List;
import java.util.function.Supplier;
import java.util.stream.Collectors;
@ -165,4 +166,17 @@ public class ChannelTabFragment extends BaseListInfoFragment<InfoItem, ChannelTa
return new ChannelTabPlayQueue(currentInfo.getServiceId(), tabHandler,
currentInfo.getNextPage(), streamItems, 0);
}
@Override
public PlayQueue getShuffledQueue() {
final List<StreamInfoItem> streamItems = infoListAdapter.getItemsList().stream()
.filter(StreamInfoItem.class::isInstance)
.map(StreamInfoItem.class::cast)
.collect(Collectors.toList());
Collections.shuffle(streamItems);
return new ChannelTabPlayQueue(currentInfo.getServiceId(),
tabHandler, currentInfo.getNextPage(), streamItems, 0);
}
}

View file

@ -8,4 +8,6 @@ import org.schabi.newpipe.player.playqueue.PlayQueue;
*/
public interface PlaylistControlViewHolder {
PlayQueue getPlayQueue();
PlayQueue getShuffledQueue();
}

View file

@ -57,6 +57,7 @@ import org.schabi.newpipe.util.image.PicassoHelper;
import org.schabi.newpipe.util.text.TextEllipsizer;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Supplier;
@ -259,6 +260,9 @@ public class PlaylistFragment extends BaseListInfoFragment<StreamInfoItem, Playl
));
}
break;
case R.id.menu_item_playlist_shuffle_all:
NavigationHelper.playOnMainPlayer(activity, getShuffledQueue());
break;
default:
return super.onOptionsItemSelected(item);
}
@ -375,13 +379,27 @@ public class PlaylistFragment extends BaseListInfoFragment<StreamInfoItem, Playl
return getPlayQueue(0);
}
@Override
public PlayQueue getShuffledQueue() {
return getPlayQueue(0, true);
}
private PlayQueue getPlayQueue(final int index) {
return getPlayQueue(index, false);
}
private PlayQueue getPlayQueue(final int index, final boolean shuffled) {
final List<StreamInfoItem> infoItems = new ArrayList<>();
for (final InfoItem i : infoListAdapter.getItemsList()) {
if (i instanceof StreamInfoItem) {
infoItems.add((StreamInfoItem) i);
}
}
if (shuffled) {
Collections.shuffle(infoItems);
}
return new PlaylistPlayQueue(
currentInfo.getServiceId(),
currentInfo.getUrl(),

View file

@ -372,7 +372,16 @@ public class StatisticsPlaylistFragment
return getPlayQueue(0);
}
@Override
public PlayQueue getShuffledQueue() {
return getPlayQueue(0, true);
}
private PlayQueue getPlayQueue(final int index) {
return getPlayQueue(index, false);
}
private PlayQueue getPlayQueue(final int index, final boolean shuffled) {
if (itemListAdapter == null) {
return new SinglePlayQueue(Collections.emptyList(), 0);
}
@ -384,6 +393,11 @@ public class StatisticsPlaylistFragment
streamInfoItems.add(((StreamStatisticsEntry) item).toStreamInfoItem());
}
}
if (shuffled) {
Collections.shuffle(streamInfoItems);
}
return new SinglePlayQueue(streamInfoItems, index);
}

View file

@ -377,6 +377,8 @@ public class LocalPlaylistFragment extends BaseLocalListFragment<List<PlaylistSt
if (!isRewritingPlaylist) {
openRemoveDuplicatesDialog();
}
} else if (item.getItemId() == R.id.menu_item_playlist_shuffle_all) {
NavigationHelper.playOnMainPlayer(activity, getShuffledQueue());
} else {
return super.onOptionsItemSelected(item);
}
@ -846,7 +848,16 @@ public class LocalPlaylistFragment extends BaseLocalListFragment<List<PlaylistSt
return getPlayQueue(0);
}
@Override
public PlayQueue getShuffledQueue() {
return getPlayQueue(0, true);
}
private PlayQueue getPlayQueue(final int index) {
return getPlayQueue(index, false);
}
private PlayQueue getPlayQueue(final int index, final boolean shuffled) {
if (itemListAdapter == null) {
return new SinglePlayQueue(Collections.emptyList(), 0);
}
@ -858,6 +869,11 @@ public class LocalPlaylistFragment extends BaseLocalListFragment<List<PlaylistSt
streamInfoItems.add(((PlaylistStreamEntry) item).toStreamInfoItem());
}
}
if (shuffled) {
Collections.shuffle(streamInfoItems);
}
return new SinglePlayQueue(streamInfoItems, index);
}

View file

@ -22,4 +22,10 @@
android:id="@+id/menu_item_remove_duplicates"
android:title="@string/remove_duplicates"
app:showAsAction="never" />
<item
android:id="@+id/menu_item_playlist_shuffle_all"
android:orderInCategory="4"
android:title="@string/shuffle_and_play"
app:showAsAction="never" />
</menu>

View file

@ -34,4 +34,10 @@
android:orderInCategory="3"
android:title="@string/add_to_playlist"
app:showAsAction="never" />
<item
android:id="@+id/menu_item_playlist_shuffle_all"
android:orderInCategory="4"
android:title="@string/shuffle_and_play"
app:showAsAction="never" />
</menu>

View file

@ -454,6 +454,7 @@
<string name="rename_playlist">Rename</string>
<string name="name">Name</string>
<string name="add_to_playlist">Add to playlist</string>
<string name="shuffle_and_play">Shuffle and play</string>
<string name="processing_may_take_a_moment">Processing… May take a moment</string>
<string name="mute">Mute</string>
<string name="unmute">Unmute</string>