Skip to content

Commit 10a5741

Browse files
committed
Tried to implement the feature
1 parent 8fc5fa9 commit 10a5741

6 files changed

Lines changed: 80 additions & 39 deletions

File tree

app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistEntity.java

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public class PlaylistEntity {
1515
public static final String PLAYLIST_ID = "uid";
1616
public static final String PLAYLIST_NAME = "name";
1717
public static final String PLAYLIST_THUMBNAIL_URL = "thumbnail_url";
18-
//TODO: add field
18+
public static final String PLAYLIST_THUMBNAIL_SET = "isThumbnailSet";
1919

2020
@PrimaryKey(autoGenerate = true)
2121
@ColumnInfo(name = PLAYLIST_ID)
@@ -27,9 +27,14 @@ public class PlaylistEntity {
2727
@ColumnInfo(name = PLAYLIST_THUMBNAIL_URL)
2828
private String thumbnailUrl;
2929

30-
public PlaylistEntity(final String name, final String thumbnailUrl) {
30+
@ColumnInfo(name = PLAYLIST_THUMBNAIL_SET)
31+
private boolean isThumbnailSet;
32+
33+
public PlaylistEntity(final String name, final String thumbnailUrl,
34+
final boolean isThumbnailSet) {
3135
this.name = name;
3236
this.thumbnailUrl = thumbnailUrl;
37+
this.isThumbnailSet = isThumbnailSet;
3338
}
3439

3540
public long getUid() {
@@ -55,4 +60,13 @@ public String getThumbnailUrl() {
5560
public void setThumbnailUrl(final String thumbnailUrl) {
5661
this.thumbnailUrl = thumbnailUrl;
5762
}
63+
64+
public boolean getIsThumbnailSet() {
65+
return isThumbnailSet;
66+
}
67+
68+
public void setIsThumbnailSet(final boolean isThumbnailSet) {
69+
this.isThumbnailSet = isThumbnailSet;
70+
}
71+
5872
}

app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java

Lines changed: 34 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
import android.view.LayoutInflater;
99
import android.view.View;
1010
import android.view.ViewGroup;
11+
import android.widget.ArrayAdapter;
12+
import android.widget.TextView;
1113

1214
import androidx.annotation.NonNull;
1315
import androidx.annotation.Nullable;
@@ -24,7 +26,6 @@
2426
import org.schabi.newpipe.database.playlist.PlaylistMetadataEntry;
2527
import org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity;
2628
import org.schabi.newpipe.databinding.DialogEditTextBinding;
27-
import org.schabi.newpipe.databinding.DialogTitleBinding;
2829
import org.schabi.newpipe.error.ErrorInfo;
2930
import org.schabi.newpipe.error.UserAction;
3031
import org.schabi.newpipe.local.BaseLocalListFragment;
@@ -258,32 +259,51 @@ private void showRemoteDeleteDialog(final PlaylistRemoteEntity item) {
258259
}
259260

260261
private void showLocalDialog(final PlaylistMetadataEntry selectedItem) {
262+
final boolean isPlaylistThumbnailSet = localPlaylistManager
263+
.getIsPlaylistThumbnailSet(selectedItem.uid);
264+
final AlertDialog.Builder builder = new AlertDialog.Builder(activity);
261265

262-
//TODO
266+
final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(getContext(),
267+
android.R.layout.simple_list_item_1) {
268+
@Override
269+
public View getView(final int position, final View convertView,
270+
final ViewGroup parent) {
271+
final View v = super.getView(position, convertView, parent);
272+
final TextView textView = v.findViewById(android.R.id.text1);
273+
274+
if (!isPlaylistThumbnailSet && position == 2) {
275+
textView.setEnabled(false);
276+
return v;
277+
}
263278

264-
final DialogTitleBinding dialogBinding =
265-
DialogTitleBinding.inflate(LayoutInflater.from(requireContext()));
279+
textView.setEnabled(true);
280+
return v;
281+
}
282+
};
283+
arrayAdapter.addAll(getString(R.string.rename), getString(R.string.delete),
284+
getString(R.string.unset_playlist_thumbnail));
266285

267-
dialogBinding.itemRoot.setVisibility(View.GONE);
268-
dialogBinding.itemTitleView.setVisibility(View.GONE);
269-
dialogBinding.itemAdditionalDetails.setVisibility(View.GONE);
270-
final String[] items = new String[]{"Delete", "Rename", "Thumbnail"};
271-
final DialogInterface.OnClickListener action = (d, index) -> {
286+
// Rename = 0; Delete = 1; Unset Thumbnail = 2
287+
final DialogInterface.OnClickListener action = (dialog, index) -> {
272288
switch (index) {
273289
case 0: showRenameDialog(selectedItem);
274290
break;
275291
case 1:
292+
showDeleteDialog(selectedItem.name,
293+
localPlaylistManager.deletePlaylist(selectedItem.uid));
294+
dialog.dismiss();
276295
break;
277296
case 2:
297+
if (isPlaylistThumbnailSet) {
298+
final String ur = "drawable://" + R.drawable.placeholder_thumbnail_playlist;
299+
localPlaylistManager.changePlaylistThumbnail(selectedItem.uid, ur,
300+
false).observeOn(AndroidSchedulers.mainThread()).subscribe();
301+
}
278302
break;
279303
}
280304
};
281305

282-
//TODO add rename dialog
283-
284-
final AlertDialog.Builder builder = new AlertDialog.Builder(activity);
285-
286-
builder.setItems(items, action)
306+
builder.setAdapter(arrayAdapter, action)
287307
.create()
288308
.show();
289309
}
@@ -302,11 +322,6 @@ private void showRenameDialog(final PlaylistMetadataEntry selectedItem) {
302322
selectedItem.uid,
303323
dialogBinding.dialogEditText.getText().toString()))
304324
.setNegativeButton(R.string.cancel, null)
305-
.setNeutralButton(R.string.delete, (dialog, which) -> {
306-
showDeleteDialog(selectedItem.name,
307-
localPlaylistManager.deletePlaylist(selectedItem.uid));
308-
dialog.dismiss();
309-
})
310325
.create()
311326
.show();
312327
}

app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ private void onPlaylistSelected(@NonNull final LocalPlaylistManager manager,
134134
if (playlist.thumbnailUrl
135135
.equals("drawable://" + R.drawable.placeholder_thumbnail_playlist)) {
136136
playlistDisposables.add(manager
137-
.changePlaylistThumbnail(playlist.uid, streams.get(0).getThumbnailUrl())
137+
.changePlaylistThumbnail(playlist.uid, streams.get(0).getThumbnailUrl(), false)
138138
.observeOn(AndroidSchedulers.mainThread())
139139
.subscribe(ignored -> successToast.show()));
140140
}

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

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -405,8 +405,9 @@ public void removeWatchedStreams(final boolean removePartiallyWatched) {
405405
.zipWith(historyIdsMaybe, (playlist, historyStreamIds) -> {
406406
// Remove Watched, Functionality data
407407
final List<PlaylistStreamEntry> notWatchedItems = new ArrayList<>();
408+
final boolean isThumbnailSet = playlistManager
409+
.getIsPlaylistThumbnailSet(playlistId);
408410
boolean thumbnailVideoRemoved = false;
409-
//TODO: add blocker here
410411

411412
if (removePartiallyWatched) {
412413
for (final var playlistItem : playlist) {
@@ -415,7 +416,7 @@ public void removeWatchedStreams(final boolean removePartiallyWatched) {
415416

416417
if (indexInHistory < 0) {
417418
notWatchedItems.add(playlistItem);
418-
} else if (!thumbnailVideoRemoved
419+
} else if (!isThumbnailSet && !thumbnailVideoRemoved
419420
&& playlistManager.getPlaylistThumbnail(playlistId)
420421
.equals(playlistItem.getStreamEntity().getThumbnailUrl())) {
421422
thumbnailVideoRemoved = true;
@@ -436,7 +437,7 @@ public void removeWatchedStreams(final boolean removePartiallyWatched) {
436437
if (indexInHistory < 0 || (streamStateEntity != null
437438
&& !streamStateEntity.isFinished(duration))) {
438439
notWatchedItems.add(playlistItem);
439-
} else if (!thumbnailVideoRemoved
440+
} else if (!isThumbnailSet && !thumbnailVideoRemoved
440441
&& playlistManager.getPlaylistThumbnail(playlistId)
441442
.equals(playlistItem.getStreamEntity().getThumbnailUrl())) {
442443
thumbnailVideoRemoved = true;
@@ -586,13 +587,12 @@ private void changePlaylistName(final String title) {
586587
disposables.add(disposable);
587588
}
588589

589-
private void changeThumbnailUrl(final String thumbnailUrl) {
590-
if (playlistManager == null) {
590+
private void changeThumbnailUrl(final String thumbnailUrl, final boolean isPermanent) {
591+
if (playlistManager == null || (!isPermanent && playlistManager
592+
.getIsPlaylistThumbnailSet(playlistId))) {
591593
return;
592594
}
593595

594-
//TODO add blocker here
595-
596596
final Toast successToast = Toast.makeText(getActivity(),
597597
R.string.playlist_thumbnail_change_success,
598598
Toast.LENGTH_SHORT);
@@ -603,7 +603,7 @@ private void changeThumbnailUrl(final String thumbnailUrl) {
603603
}
604604

605605
final Disposable disposable = playlistManager
606-
.changePlaylistThumbnail(playlistId, thumbnailUrl)
606+
.changePlaylistThumbnail(playlistId, thumbnailUrl, isPermanent)
607607
.observeOn(AndroidSchedulers.mainThread())
608608
.subscribe(ignore -> successToast.show(), throwable ->
609609
showError(new ErrorInfo(throwable, UserAction.REQUESTED_BOOKMARK,
@@ -612,16 +612,19 @@ private void changeThumbnailUrl(final String thumbnailUrl) {
612612
}
613613

614614
private void updateThumbnailUrl() {
615+
if (playlistManager.getIsPlaylistThumbnailSet(playlistId)) {
616+
return;
617+
}
618+
615619
final String newThumbnailUrl;
616-
//TODO: add blocker here
617620
if (!itemListAdapter.getItemsList().isEmpty()) {
618621
newThumbnailUrl = ((PlaylistStreamEntry) itemListAdapter.getItemsList().get(0))
619622
.getStreamEntity().getThumbnailUrl();
620623
} else {
621624
newThumbnailUrl = "drawable://" + R.drawable.placeholder_thumbnail_playlist;
622625
}
623626

624-
changeThumbnailUrl(newThumbnailUrl);
627+
changeThumbnailUrl(newThumbnailUrl, false);
625628
}
626629

627630
private void deleteItem(final PlaylistStreamEntry item) {
@@ -789,7 +792,8 @@ context, getPlayQueueStartingAt(item), true))
789792
.setAction(
790793
StreamDialogDefaultEntry.SET_AS_PLAYLIST_THUMBNAIL,
791794
(f, i) ->
792-
changeThumbnailUrl(item.getStreamEntity().getThumbnailUrl()))
795+
changeThumbnailUrl(item.getStreamEntity().getThumbnailUrl(),
796+
true))
793797
.setAction(
794798
StreamDialogDefaultEntry.DELETE,
795799
(f, i) -> deleteItem(item))

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

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ public Maybe<List<Long>> createPlaylist(final String name, final List<StreamEnti
4141
}
4242
final StreamEntity defaultStream = streams.get(0);
4343
final PlaylistEntity newPlaylist =
44-
new PlaylistEntity(name, defaultStream.getThumbnailUrl());
44+
new PlaylistEntity(name, defaultStream.getThumbnailUrl(), false);
4545

4646
return Maybe.fromCallable(() -> database.runInTransaction(() ->
4747
upsertStreams(playlistTable.insert(newPlaylist), streams, 0))
@@ -96,31 +96,37 @@ public Single<Integer> deletePlaylist(final long playlistId) {
9696
}
9797

9898
public Maybe<Integer> renamePlaylist(final long playlistId, final String name) {
99-
return modifyPlaylist(playlistId, name, null);
99+
return modifyPlaylist(playlistId, name, null, false);
100100
}
101101

102102
public Maybe<Integer> changePlaylistThumbnail(final long playlistId,
103-
final String thumbnailUrl) {
104-
return modifyPlaylist(playlistId, null, thumbnailUrl);
103+
final String thumbnailUrl,
104+
final boolean isPermanent) {
105+
return modifyPlaylist(playlistId, null, thumbnailUrl, isPermanent);
105106
}
106107

107108
public String getPlaylistThumbnail(final long playlistId) {
108109
return playlistTable.getPlaylist(playlistId).blockingFirst().get(0).getThumbnailUrl();
109110
}
110111

112+
public boolean getIsPlaylistThumbnailSet(final long playlistId) {
113+
return playlistTable.getPlaylist(playlistId).blockingFirst().get(0).getIsThumbnailSet();
114+
}
115+
111116
private Maybe<Integer> modifyPlaylist(final long playlistId,
112117
@Nullable final String name,
113-
@Nullable final String thumbnailUrl) {
118+
@Nullable final String thumbnailUrl,
119+
final boolean isPermanent) {
114120
return playlistTable.getPlaylist(playlistId)
115121
.firstElement()
116-
.filter(playlistEntities -> !playlistEntities.isEmpty())
117122
.map(playlistEntities -> {
118123
final PlaylistEntity playlist = playlistEntities.get(0);
119124
if (name != null) {
120125
playlist.setName(name);
121126
}
122127
if (thumbnailUrl != null) {
123128
playlist.setThumbnailUrl(thumbnailUrl);
129+
playlist.setIsThumbnailSet(isPermanent);
124130
}
125131
return playlistTable.update(playlist);
126132
}).subscribeOn(Schedulers.io());

app/src/main/res/values/strings.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
<string name="install">Install</string>
88
<string name="cancel">Cancel</string>
99
<string name="ok">OK</string>
10+
<string name="yes">Yes</string>
1011
<string name="open_in_browser">Open in browser</string>
1112
<string name="mark_as_watched">Mark as watched</string>
1213
<string name="open_in_popup_mode">Open in popup mode</string>
@@ -438,6 +439,7 @@
438439
<string name="mute">Mute</string>
439440
<string name="unmute">Unmute</string>
440441
<string name="set_as_playlist_thumbnail">Set as playlist thumbnail</string>
442+
<string name="unset_playlist_thumbnail">Unset thumbnail</string>
441443
<string name="bookmark_playlist">Bookmark Playlist</string>
442444
<string name="unbookmark_playlist">Remove Bookmark</string>
443445
<string name="delete_playlist_prompt">Delete this playlist\?</string>

0 commit comments

Comments
 (0)