Skip to content

Commit d0b6d95

Browse files
carmebarStypox
authored andcommitted
Add Share option to local playlists
A newline-separated text is shared
1 parent 93b913e commit d0b6d95

2 files changed

Lines changed: 29 additions & 3 deletions

File tree

app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.schabi.newpipe.local.playlist;
22

3+
import static org.schabi.newpipe.error.ErrorUtil.showUiErrorSnackbar;
34
import static org.schabi.newpipe.ktx.ViewUtils.animate;
45
import static org.schabi.newpipe.util.ThemeHelper.shouldUseGridLayout;
56

@@ -50,17 +51,20 @@
5051
import org.schabi.newpipe.util.NavigationHelper;
5152
import org.schabi.newpipe.util.OnClickGesture;
5253
import org.schabi.newpipe.info_list.dialog.StreamDialogDefaultEntry;
54+
import org.schabi.newpipe.util.external_communication.ShareUtils;
5355

5456
import java.util.ArrayList;
5557
import java.util.Collections;
5658
import java.util.Iterator;
5759
import java.util.List;
5860
import java.util.concurrent.TimeUnit;
5961
import java.util.concurrent.atomic.AtomicBoolean;
62+
import java.util.stream.Collectors;
6063

6164
import icepick.State;
6265
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
6366
import io.reactivex.rxjava3.core.Flowable;
67+
import io.reactivex.rxjava3.core.Single;
6468
import io.reactivex.rxjava3.disposables.CompositeDisposable;
6569
import io.reactivex.rxjava3.disposables.Disposable;
6670
import io.reactivex.rxjava3.schedulers.Schedulers;
@@ -345,7 +349,11 @@ public void onComplete() {
345349

346350
@Override
347351
public boolean onOptionsItemSelected(final MenuItem item) {
348-
if (item.getItemId() == R.id.menu_item_remove_watched) {
352+
if (item.getItemId() == R.id.menu_item_share_playlist) {
353+
sharePlaylist();
354+
} else if (item.getItemId() == R.id.menu_item_rename_playlist) {
355+
createRenameDialog();
356+
} else if (item.getItemId() == R.id.menu_item_remove_watched) {
349357
if (!isRemovingWatched) {
350358
new AlertDialog.Builder(requireContext())
351359
.setMessage(R.string.remove_watched_popup_warning)
@@ -360,14 +368,26 @@ public boolean onOptionsItemSelected(final MenuItem item) {
360368
.create()
361369
.show();
362370
}
363-
} else if (item.getItemId() == R.id.menu_item_rename_playlist) {
364-
createRenameDialog();
365371
} else {
366372
return super.onOptionsItemSelected(item);
367373
}
368374
return true;
369375
}
370376

377+
/**
378+
* Share the playlist as a newline-separated list of stream URLs.
379+
*/
380+
public void sharePlaylist() {
381+
disposables.add(playlistManager.getPlaylistStreams(playlistId)
382+
.flatMapSingle(playlist -> Single.just(playlist.stream()
383+
.map(PlaylistStreamEntry::getStreamEntity)
384+
.map(StreamEntity::getUrl)
385+
.collect(Collectors.joining("\n"))))
386+
.observeOn(AndroidSchedulers.mainThread())
387+
.subscribe(urlsText -> ShareUtils.shareText(requireContext(), name, urlsText),
388+
throwable -> showUiErrorSnackbar(this, "Sharing playlist", throwable)));
389+
}
390+
371391
public void removeWatchedStreams(final boolean removePartiallyWatched) {
372392
if (isRemovingWatched) {
373393
return;

app/src/main/res/menu/menu_local_playlist.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,12 @@
22
<menu xmlns:android="http://schemas.android.com/apk/res/android"
33
xmlns:app="http://schemas.android.com/apk/res-auto">
44

5+
<item
6+
android:id="@+id/menu_item_share_playlist"
7+
android:icon="@drawable/ic_share"
8+
android:title="@string/share"
9+
app:showAsAction="ifRoom" />
10+
511
<item
612
android:id="@+id/menu_item_rename_playlist"
713
android:title="@string/rename_playlist"

0 commit comments

Comments
 (0)