From f65094b5fd026fa7367acaf41846f500c17a0e79 Mon Sep 17 00:00:00 2001 From: Stypox Date: Mon, 9 Feb 2026 10:24:18 +0100 Subject: [PATCH] Use getPlayQueueStartingAt in BaseListFragment Instead of overriding the whole showInfoItemDialog --- .../fragments/list/BaseListFragment.java | 27 ++++++++++------ .../list/channel/ChannelTabFragment.java | 24 ++++---------- .../list/playlist/PlaylistFragment.java | 32 +++++++------------ .../ui/components/menu/LongPressAction.kt | 8 +++++ 4 files changed, 45 insertions(+), 46 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListFragment.java index 9aecd487d..c9709d59f 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListFragment.java @@ -30,6 +30,7 @@ import org.schabi.newpipe.fragments.BaseStateFragment; import org.schabi.newpipe.fragments.OnScrollBelowItemsListener; import org.schabi.newpipe.info_list.InfoListAdapter; import org.schabi.newpipe.info_list.ItemViewMode; +import org.schabi.newpipe.player.playqueue.PlayQueue; import org.schabi.newpipe.ui.components.menu.LongPressAction; import org.schabi.newpipe.ui.components.menu.LongPressable; import org.schabi.newpipe.util.NavigationHelper; @@ -42,6 +43,8 @@ import java.util.List; import java.util.Queue; import java.util.function.Supplier; +import kotlin.jvm.functions.Function0; + public abstract class BaseListFragment extends BaseStateFragment implements ListViewContract, StateSaver.WriteRead, SharedPreferences.OnSharedPreferenceChangeListener { @@ -267,8 +270,12 @@ public abstract class BaseListFragment extends BaseStateFragment } @Override - public void held(final StreamInfoItem selectedItem) { - showInfoItemDialog(selectedItem); + public void held(final StreamInfoItem item) { + openLongPressMenuInActivity( + requireActivity(), + LongPressable.fromStreamInfoItem(item), + LongPressAction.fromStreamInfoItem(item, getPlayQueueStartingAt(item)) + ); } }); @@ -325,13 +332,15 @@ public abstract class BaseListFragment extends BaseStateFragment useNormalItemListScrollListener(); } - protected void showInfoItemDialog(final StreamInfoItem item) { - openLongPressMenuInActivity( - requireActivity(), - LongPressable.fromStreamInfoItem(item), - // TODO generalize obtaining queue from here when fully migrating to Compose - LongPressAction.fromStreamInfoItem(item, null) - ); + /** + * @param item an item in the list, from which the built queue should start + * @return a builder for a queue containing all of the items in this list, with the queue index + * set to the item passed as parameter; return {@code null} if no "start playing from here" + * options should be shown + */ + @Nullable + protected Function0 getPlayQueueStartingAt(@NonNull final StreamInfoItem item) { + return null; // disable "play from here" options by default (e.g. in search, kiosks) } /** diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelTabFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelTabFragment.java index 855b28907..c9b87f199 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelTabFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelTabFragment.java @@ -1,7 +1,5 @@ package org.schabi.newpipe.fragments.list.channel; -import static org.schabi.newpipe.ui.components.menu.LongPressMenuKt.openLongPressMenuInActivity; - import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; @@ -28,8 +26,6 @@ import org.schabi.newpipe.fragments.list.BaseListInfoFragment; import org.schabi.newpipe.fragments.list.playlist.PlaylistControlViewHolder; import org.schabi.newpipe.player.playqueue.ChannelTabPlayQueue; import org.schabi.newpipe.player.playqueue.PlayQueue; -import org.schabi.newpipe.ui.components.menu.LongPressAction; -import org.schabi.newpipe.ui.components.menu.LongPressable; import org.schabi.newpipe.ui.emptystate.EmptyStateUtil; import org.schabi.newpipe.util.ChannelTabHelper; import org.schabi.newpipe.util.ExtractorHelper; @@ -41,6 +37,7 @@ import java.util.function.Supplier; import java.util.stream.Collectors; import io.reactivex.rxjava3.core.Single; +import kotlin.jvm.functions.Function0; public class ChannelTabFragment extends BaseListInfoFragment implements PlaylistControlViewHolder { @@ -169,19 +166,6 @@ public class ChannelTabFragment extends BaseListInfoFragment getPlayQueueStartingAt(item)) - ); - } - - private PlayQueue getPlayQueueStartingAt(final StreamInfoItem infoItem) { - return getPlayQueue(streamItems -> Math.max(streamItems.indexOf(infoItem), 0)); - } - public PlayQueue getPlayQueue(final Function, Integer> index) { final List streamItems = infoListAdapter.getItemsList().stream() .filter(StreamInfoItem.class::isInstance) @@ -196,4 +180,10 @@ public class ChannelTabFragment extends BaseListInfoFragment 0); } + + @Nullable + @Override + protected Function0 getPlayQueueStartingAt(@NonNull final StreamInfoItem item) { + return () -> getPlayQueue(streamItems -> Math.max(streamItems.indexOf(item), 0)); + } } diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java index 5cee18136..3f117dbae 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java @@ -3,7 +3,6 @@ package org.schabi.newpipe.fragments.list.playlist; import static org.schabi.newpipe.extractor.utils.Utils.isBlank; import static org.schabi.newpipe.ktx.ViewUtils.animate; import static org.schabi.newpipe.ktx.ViewUtils.animateHideRecyclerViewAllowingScrolling; -import static org.schabi.newpipe.ui.components.menu.LongPressMenuKt.openLongPressMenuInActivity; import static org.schabi.newpipe.util.ServiceHelper.getServiceById; import android.os.Bundle; @@ -46,8 +45,6 @@ import org.schabi.newpipe.local.dialog.PlaylistDialog; import org.schabi.newpipe.local.playlist.RemotePlaylistManager; import org.schabi.newpipe.player.playqueue.PlayQueue; import org.schabi.newpipe.player.playqueue.PlaylistPlayQueue; -import org.schabi.newpipe.ui.components.menu.LongPressAction; -import org.schabi.newpipe.ui.components.menu.LongPressable; import org.schabi.newpipe.util.ExtractorHelper; import org.schabi.newpipe.util.Localization; import org.schabi.newpipe.util.NavigationHelper; @@ -68,6 +65,7 @@ import io.reactivex.rxjava3.core.Flowable; import io.reactivex.rxjava3.core.Single; import io.reactivex.rxjava3.disposables.CompositeDisposable; import io.reactivex.rxjava3.disposables.Disposable; +import kotlin.jvm.functions.Function0; public class PlaylistFragment extends BaseListInfoFragment implements PlaylistControlViewHolder { @@ -144,19 +142,6 @@ public class PlaylistFragment extends BaseListInfoFragment getPlayQueueStartingAt(item)) - ); - } - @Override public void onCreateOptionsMenu(@NonNull final Menu menu, @NonNull final MenuInflater inflater) { @@ -361,10 +346,6 @@ public class PlaylistFragment extends BaseListInfoFragment infoItems = new ArrayList<>(); for (final InfoItem i : infoListAdapter.getItemsList()) { @@ -381,6 +362,17 @@ public class PlaylistFragment extends BaseListInfoFragment getPlayQueueStartingAt(@NonNull final StreamInfoItem item) { + return () -> getPlayQueue(Math.max(infoListAdapter.getItemsList().indexOf(item), 0)); + } + /*////////////////////////////////////////////////////////////////////////// // Utils //////////////////////////////////////////////////////////////////////////*/ diff --git a/app/src/main/java/org/schabi/newpipe/ui/components/menu/LongPressAction.kt b/app/src/main/java/org/schabi/newpipe/ui/components/menu/LongPressAction.kt index f1e985deb..c0dd3b7ce 100644 --- a/app/src/main/java/org/schabi/newpipe/ui/components/menu/LongPressAction.kt +++ b/app/src/main/java/org/schabi/newpipe/ui/components/menu/LongPressAction.kt @@ -141,6 +141,14 @@ data class LongPressAction( ) } + /** + * Instead of queueFromHere, this function could possibly take a + * `() -> List` plus the `StreamInfoItem/StreamEntity/...` + * that was long-pressed, and take care of searching through the list to find the item + * index, and finally take care of building the queue. It would deduplicate some code in + * fragments, but it's probably not possible to do because of all the different types of + * the items involved. + */ private fun buildPlayerFromHereActionList(queueFromHere: () -> PlayQueue): List { return listOf( Type.BackgroundFromHere.buildAction { context ->