Skip to content

Commit 4e0d542

Browse files
authored
Merge pull request #12929 from TeamNewPipe/fix/playlist-remove-watched
2 parents d7dffb7 + 817fccb commit 4e0d542

71 files changed

Lines changed: 130 additions & 117 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

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

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

3+
import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
4+
import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
35
import static org.schabi.newpipe.error.ErrorUtil.showUiErrorSnackbar;
46
import static org.schabi.newpipe.ktx.ViewUtils.animate;
57
import static org.schabi.newpipe.local.playlist.ExportPlaylistKt.export;
@@ -22,6 +24,8 @@
2224
import android.view.MenuItem;
2325
import android.view.View;
2426
import android.view.ViewGroup;
27+
import android.widget.LinearLayout;
28+
import android.widget.LinearLayout.LayoutParams;
2529
import android.widget.Toast;
2630

2731
import androidx.annotation.NonNull;
@@ -54,6 +58,7 @@
5458
import org.schabi.newpipe.local.history.HistoryRecordManager;
5559
import org.schabi.newpipe.player.playqueue.PlayQueue;
5660
import org.schabi.newpipe.player.playqueue.SinglePlayQueue;
61+
import org.schabi.newpipe.util.DeviceUtils;
5762
import org.schabi.newpipe.util.Localization;
5863
import org.schabi.newpipe.util.NavigationHelper;
5964
import org.schabi.newpipe.util.OnClickGesture;
@@ -365,17 +370,7 @@ public boolean onOptionsItemSelected(final MenuItem item) {
365370
createRenameDialog();
366371
} else if (item.getItemId() == R.id.menu_item_remove_watched) {
367372
if (!isRewritingPlaylist) {
368-
new AlertDialog.Builder(requireContext())
369-
.setMessage(R.string.remove_watched_popup_warning)
370-
.setTitle(R.string.remove_watched_popup_title)
371-
.setPositiveButton(R.string.ok, (d, id) ->
372-
removeWatchedStreams(false))
373-
.setNeutralButton(
374-
R.string.remove_watched_popup_yes_and_partially_watched_videos,
375-
(d, id) -> removeWatchedStreams(true))
376-
.setNegativeButton(R.string.cancel,
377-
(d, id) -> d.cancel())
378-
.show();
373+
openRemoveWatchedConfirmationDialog();
379374
}
380375
} else if (item.getItemId() == R.id.menu_item_remove_duplicates) {
381376
if (!isRewritingPlaylist) {
@@ -447,39 +442,28 @@ public void removeWatchedStreams(final boolean removePartiallyWatched) {
447442
.getIsPlaylistThumbnailPermanent(playlistId);
448443
boolean thumbnailVideoRemoved = false;
449444

450-
if (removePartiallyWatched) {
451-
for (final var playlistItem : playlist) {
452-
final int indexInHistory = Collections.binarySearch(historyStreamIds,
453-
playlistItem.getStreamId());
454-
455-
if (indexInHistory < 0) {
456-
itemsToKeep.add(playlistItem);
457-
} else if (!isThumbnailPermanent && !thumbnailVideoRemoved
458-
&& playlistManager.getPlaylistThumbnailStreamId(playlistId)
459-
== playlistItem.getStreamEntity().getUid()) {
460-
thumbnailVideoRemoved = true;
461-
}
462-
}
463-
} else {
464-
final var streamStates = recordManager
465-
.loadLocalStreamStateBatch(playlist).blockingGet();
466-
467-
for (int i = 0; i < playlist.size(); i++) {
468-
final var playlistItem = playlist.get(i);
469-
final var streamStateEntity = streamStates.get(i);
470-
471-
final int indexInHistory = Collections.binarySearch(historyStreamIds,
472-
playlistItem.getStreamId());
473-
final long duration = playlistItem.toStreamInfoItem().getDuration();
474-
475-
if (indexInHistory < 0 || (streamStateEntity != null
476-
&& !streamStateEntity.isFinished(duration))) {
477-
itemsToKeep.add(playlistItem);
478-
} else if (!isThumbnailPermanent && !thumbnailVideoRemoved
479-
&& playlistManager.getPlaylistThumbnailStreamId(playlistId)
480-
== playlistItem.getStreamEntity().getUid()) {
481-
thumbnailVideoRemoved = true;
482-
}
445+
final var streamStates = recordManager
446+
.loadLocalStreamStateBatch(playlist).blockingGet();
447+
448+
for (int i = 0; i < playlist.size(); i++) {
449+
final var playlistItem = playlist.get(i);
450+
final var streamStateEntity = streamStates.get(i);
451+
final int indexInHistory = Collections.binarySearch(historyStreamIds,
452+
playlistItem.getStreamId());
453+
final long duration = playlistItem.toStreamInfoItem().getDuration();
454+
455+
if (indexInHistory < 0 // stream is not in history
456+
// stream is in history but the streamStateEntity is null
457+
// if the stream was played for less than 5 seconds, see
458+
// StreamStateEntity#PLAYBACK_SAVE_THRESHOLD_START_MILLISECONDS
459+
|| streamStateEntity == null
460+
|| (!removePartiallyWatched
461+
&& !streamStateEntity.isFinished(duration))) {
462+
itemsToKeep.add(playlistItem);
463+
} else if (!isThumbnailPermanent && !thumbnailVideoRemoved
464+
&& playlistManager.getPlaylistThumbnailStreamId(playlistId)
465+
== playlistItem.getStreamEntity().getUid()) {
466+
thumbnailVideoRemoved = true;
483467
}
484468
}
485469

@@ -904,6 +888,35 @@ private void createShareConfirmationDialog() {
904888
.show();
905889
}
906890

891+
/**
892+
* Opens a confirmation dialog to remove watched streams from the playlist.
893+
* The user can also choose to remove partially watched streams.
894+
*/
895+
private void openRemoveWatchedConfirmationDialog() {
896+
final android.widget.CheckBox removePartiallyWatchedCheckbox =
897+
new android.widget.CheckBox(requireContext());
898+
removePartiallyWatchedCheckbox.setText(
899+
R.string.remove_watched_popup_partially_watched_streams);
900+
901+
// Wrap the checkbox in a container with dialog-like horizontal padding
902+
// so it aligns with the dialog title and message on the start side.
903+
final LinearLayout checkboxContainer = new LinearLayout(requireContext());
904+
checkboxContainer.setOrientation(LinearLayout.VERTICAL);
905+
final int padding = DeviceUtils.dpToPx(20, requireContext());
906+
checkboxContainer.setPadding(padding, padding, padding, 0);
907+
checkboxContainer.addView(removePartiallyWatchedCheckbox,
908+
new LayoutParams(MATCH_PARENT, WRAP_CONTENT));
909+
910+
new AlertDialog.Builder(requireContext())
911+
.setMessage(R.string.remove_watched_popup_warning)
912+
.setTitle(R.string.remove_watched_popup_title)
913+
.setView(checkboxContainer)
914+
.setPositiveButton(R.string.yes, (d, id) ->
915+
removeWatchedStreams(removePartiallyWatchedCheckbox.isChecked()))
916+
.setNegativeButton(R.string.cancel, (d, id) -> d.cancel())
917+
.show();
918+
}
919+
907920
public void setTabsPagerAdapter(
908921
@Nullable final MainFragment.SelectedTabsPagerAdapter tabsPagerAdapter) {
909922
this.tabsPagerAdapter = tabsPagerAdapter;

app/src/main/res/values-ar-rLY/strings.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@
124124
<item quantity="other">%s مُشاهِد</item>
125125
</plurals>
126126
<string name="show_hold_to_append_summary">عرض تلميح عند الضغط على زر استخدام المشغل الخلفي أو النافذة المنبثقة في صفحة تفاصيل الفديو</string>
127-
<string name="remove_watched_popup_yes_and_partially_watched_videos">نعم، ومقاطع الفيديو التي تمت مشاهدتها جزئيًا</string>
127+
<string name="remove_watched_popup_partially_watched_streams">نعم، ومقاطع الفيديو التي تمت مشاهدتها جزئيًا</string>
128128
<string name="error_timeout">انتهى وقت الاتصال</string>
129129
<string name="unknown_audio_track">غير معروف</string>
130130
<string name="autoplay_title">تشغيل تلقائي</string>

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -547,7 +547,7 @@
547547
<string name="restricted_video">هذا الفيديو مقيد بالفئة العمرية.
548548
\n
549549
\nقم بتشغيل \"%1$s\" في الإعدادات إذا كنت تريد رؤيته.</string>
550-
<string name="remove_watched_popup_yes_and_partially_watched_videos">نعم، ومقاطع الفيديو التي تمت مشاهدتها جزئيًا</string>
550+
<string name="remove_watched_popup_partially_watched_streams">نعم، ومقاطع الفيديو التي تمت مشاهدتها جزئيًا</string>
551551
<string name="remove_watched_popup_warning">ستتم إزالة مقاطع الفيديو التي تمت مشاهدتها قبل وبعد إضافتها إلى قائمة التشغيل.
552552
\nهل أنت واثق؟ لا يمكن التراجع عن هذا!</string>
553553
<string name="remove_watched_popup_title">إزالة مقاطع الفيديو التي تمت مشاهدتها؟</string>

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -652,7 +652,7 @@
652652
<string name="playback_speed_control">Oynatma Sürəti Nizamlamaları</string>
653653
<string name="unhook_checkbox">Ayır (pozuntuya səbəb ola bilər)</string>
654654
<string name="show_error">Xətanı göstər</string>
655-
<string name="remove_watched_popup_yes_and_partially_watched_videos">Bəli və qismən baxılmış videolar</string>
655+
<string name="remove_watched_popup_partially_watched_streams">Bəli və qismən baxılmış videolar</string>
656656
<plurals name="deleted_downloads_toast">
657657
<item quantity="one">%1$s endirməsi silindi</item>
658658
<item quantity="other">%1$s endirmə silindi</item>

app/src/main/res/values-b+ast/strings.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -312,7 +312,7 @@
312312
<string name="feed_oldest_subscription_update">Últimu anovamientu del feed: %s</string>
313313
<string name="feed_groups_header_title">Grupos de canales</string>
314314
<string name="new_seek_duration_toast">Pola mor de les torgues d\'ExoPlayer la duración afitóse en %d segundos</string>
315-
<string name="remove_watched_popup_yes_and_partially_watched_videos">Sí, y tamién los vistos parcialmente</string>
315+
<string name="remove_watched_popup_partially_watched_streams">Sí, y tamién los vistos parcialmente</string>
316316
<string name="remove_watched_popup_warning">Van desaniciase los vídeos que se vieren enantes y dempués d\'amestase a la llista de reproducción.
317317
\n¿De xuru\? ¡Esto nun pue desfacese!</string>
318318
<string name="remove_watched_popup_title">¿Desaniciar los vídeos vistos\?</string>

app/src/main/res/values-b+uz+Latn/strings.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -384,7 +384,7 @@
384384
<item quantity="other">%d sekondlar</item>
385385
</plurals>
386386
<string name="new_seek_duration_toast">ExoPlayer cheklovlari tufayli qidiruv davomiyligi %d soniya qilib belgilandi</string>
387-
<string name="remove_watched_popup_yes_and_partially_watched_videos">Ha, va qisman videolarni tomosha qildim</string>
387+
<string name="remove_watched_popup_partially_watched_streams">Ha, va qisman videolarni tomosha qildim</string>
388388
<string name="remove_watched_popup_warning">Pleylistga qo\'shilishdan oldin va keyin ko\'rilgan videolar o\'chiriladi.
389389
\nIshonchingiz komilmi\? Buni qaytarib bo\'lmaydi!</string>
390390
<string name="remove_watched_popup_title">Ko\'rilgan videolar olib tashlansinmi\?</string>

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -617,7 +617,7 @@
617617
<string name="downloads_storage_ask_summary_no_saf_notice">Пры кожным спампоўванні вам будзе прапанавана выбраць месца захавання</string>
618618
<string name="feed_notification_loading">Загрузка канала…</string>
619619
<string name="remove_watched_popup_title">Выдаліць прагледжаныя відэа\?</string>
620-
<string name="remove_watched_popup_yes_and_partially_watched_videos">Так, часткова прагледжаныя відэа таксама</string>
620+
<string name="remove_watched_popup_partially_watched_streams">Так, часткова прагледжаныя відэа таксама</string>
621621
<string name="percent">Працэнт</string>
622622
<string name="remove_watched_popup_warning">Відэа, якія прагледжаны перад дадаваннем і пасля дадавання ў спіс прайгравання, будуць выдалены. \nВы ўпэўнены? Гэта дзеянне немагчыма скасаваць!</string>
623623
<string name="show_crash_the_player_summary">Паказвае варыянт збою пры выкарыстанні плэера</string>

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -502,7 +502,7 @@
502502
<string name="paid_content">Съдържанието е достъпно само за хора, които са си платили, затова не може да бъде гледано или изтеглено с NewPipe.</string>
503503
<string name="youtube_music_premium_content">Това видео е достъпно за абонати на YouTube Music Premium, затова не може да бъде гледано или изтеглено с NewPipe.</string>
504504
<string name="remove_watched_popup_title">Премахни изгледаните видеа\?</string>
505-
<string name="remove_watched_popup_yes_and_partially_watched_videos">Да, както и само частично изгледаните видеа</string>
505+
<string name="remove_watched_popup_partially_watched_streams">Да, както и само частично изгледаните видеа</string>
506506
<string name="subscribers_count_not_available">Брой на абонати не е наличен</string>
507507
<string name="peertube_instance_add_exists">Инстанцията вече съществува</string>
508508
<string name="missing_file">Файлът е преместен или изтрит</string>

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,7 @@
337337
<string name="player_unrecoverable_failure">অপুনরুদ্ধারযোগ্য প্লেয়ার ত্রুটি ঘটেছে</string>
338338
<string name="peertube_instance_add_fail">ইন্সট্যান্সটি যাচাই করা যায়নি</string>
339339
<string name="recaptcha_cookies_cleared">রিক্যাপচা কুকিগুলো পরিষ্কার করা হয়েছে</string>
340-
<string name="remove_watched_popup_yes_and_partially_watched_videos">হ্যাঁ, এবং আংশিকভাবে দেখা ভিডিও</string>
340+
<string name="remove_watched_popup_partially_watched_streams">হ্যাঁ, এবং আংশিকভাবে দেখা ভিডিও</string>
341341
<string name="permission_denied">ব্যবস্থা দ্বারা ক্রিয়া অস্বীকার করা হয়েছে</string>
342342
<string name="autoplay_summary">স্বয়ংক্রিয়ভাবে প্লেব্যাক শুরু করো %s — তে</string>
343343
<string name="start_here_on_popup">একটি পপ-আপে প্লে শুরু করো</string>

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -579,7 +579,7 @@
579579
<string name="remove_duplicates_title">Ukloniti duplikate?</string>
580580
<string name="remove_duplicates_message">Želite li ukloniti sve duplikatne tokove na ovoj listi za reprodukciju?</string>
581581
<string name="remove_watched_popup_warning">Videozapisi koji su pregledani prije i poslije dodavanja na listu za reprodukciju bit će uklonjeni.\nJeste li sigurni? Ovo se ne može poništiti!</string>
582-
<string name="remove_watched_popup_yes_and_partially_watched_videos">Da, i djelimično odgledani videozapisi</string>
582+
<string name="remove_watched_popup_partially_watched_streams">Da, i djelimično odgledani videozapisi</string>
583583
<string name="new_seek_duration_toast">Zbog ograničenja ExoPlayera, trajanje pretraživanja je postavljeno na %d sekundi</string>
584584
<string name="fragment_feed_title">Šta je novo</string>
585585
<string name="feed_group_page_summary">Stranica grupe kanala</string>

0 commit comments

Comments
 (0)