From 59841e966e45a05427d1879fe5950104eda15aa1 Mon Sep 17 00:00:00 2001 From: Stypox Date: Sat, 7 Feb 2026 12:56:04 +0100 Subject: [PATCH] Correctly handle Kodi action in long press menu Automatically enable/disable it when changing the "Show play with Kodi" setting Include it in the default actions if the "Show play with Kodi" setting is enabled Hide the Kodi action if Kodi would not support the service. --- .../settings/VideoAudioSettingsFragment.java | 4 ++ .../ui/components/menu/LongPressAction.kt | 25 ++++---- .../ui/components/menu/LongPressMenuEditor.kt | 2 +- .../menu/LongPressMenuEditorState.kt | 4 +- .../components/menu/LongPressMenuSettings.kt | 58 ++++++++++++++++++- 5 files changed, 73 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/settings/VideoAudioSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/VideoAudioSettingsFragment.java index a4d52592f..a382908f0 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/VideoAudioSettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/VideoAudioSettingsFragment.java @@ -1,5 +1,7 @@ package org.schabi.newpipe.settings; +import static org.schabi.newpipe.ui.components.menu.LongPressMenuSettingsKt.addOrRemoveKodiLongPressAction; + import android.content.SharedPreferences; import android.content.res.Resources; import android.os.Bundle; @@ -49,6 +51,8 @@ public class VideoAudioSettingsFragment extends BasePreferenceFragment { updateSeekOptions(); } else if (getString(R.string.show_higher_resolutions_key).equals(key)) { updateResolutionOptions(); + } else if (getString(R.string.show_play_with_kodi_key).equals(key)) { + addOrRemoveKodiLongPressAction(requireContext()); } }; } 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 71c487165..6b58896ce 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 @@ -106,16 +106,6 @@ data class LongPressAction( enabled: () -> Boolean = { true }, action: suspend (context: Context) -> Unit ) = LongPressAction(this, action, enabled) - - companion object { - // ShowChannelDetails is not enabled by default, since navigating to channel details can - // also be done by clicking on the uploader name in the long press menu header - val DefaultEnabledActions: List = listOf( - ShowDetails, Enqueue, EnqueueNext, Background, Popup, BackgroundFromHere, - BackgroundShuffled, Download, AddToPlaylist, Share, OpenInBrowser, MarkAsWatched, - Rename, SetAsPlaylistThumbnail, UnsetPlaylistThumbnail, Delete, Unsubscribe, Remove - ) - } } companion object { @@ -249,11 +239,17 @@ data class LongPressAction( withContext(Dispatchers.IO) { HistoryRecordManager(context).markAsWatched(item).await() } - }, - Type.PlayWithKodi.buildAction { context -> - KoreUtils.playWithKore(context, item.url.toUri()) } - ) + ) + + if (KoreUtils.isServiceSupportedByKore(item.serviceId)) { + listOf( + Type.PlayWithKodi.buildAction( + enabled = { KoreUtils.isServiceSupportedByKore(item.serviceId) } + ) { context -> KoreUtils.playWithKore(context, item.url.toUri()) } + ) + } else { + listOf() + } } /** @@ -264,7 +260,6 @@ data class LongPressAction( fun fromStreamInfoItem( item: StreamInfoItem, queueFromHere: (() -> PlayQueue)? - /* TODO isKodiEnabled: Boolean, */ ): List { return buildPlayerActionList { context -> fetchItemInfoIfSparse(context, item) } + (queueFromHere?.let { buildPlayerFromHereActionList(queueFromHere) } ?: listOf()) + diff --git a/app/src/main/java/org/schabi/newpipe/ui/components/menu/LongPressMenuEditor.kt b/app/src/main/java/org/schabi/newpipe/ui/components/menu/LongPressMenuEditor.kt index 36bfd5fa6..c790e8d80 100644 --- a/app/src/main/java/org/schabi/newpipe/ui/components/menu/LongPressMenuEditor.kt +++ b/app/src/main/java/org/schabi/newpipe/ui/components/menu/LongPressMenuEditor.kt @@ -114,7 +114,7 @@ fun LongPressMenuEditorPage(onBackClick: () -> Unit) { title = stringResource(R.string.long_press_menu_actions_editor), onBackClick = onBackClick, actions = { - ResetToDefaultsButton(state::resetToDefaults) + ResetToDefaultsButton { state.resetToDefaults(context) } } ) { paddingValues -> // test scrolling on Android TV by adding `.padding(horizontal = 350.dp)` here diff --git a/app/src/main/java/org/schabi/newpipe/ui/components/menu/LongPressMenuEditorState.kt b/app/src/main/java/org/schabi/newpipe/ui/components/menu/LongPressMenuEditorState.kt index 89f005105..c1b9abbc0 100644 --- a/app/src/main/java/org/schabi/newpipe/ui/components/menu/LongPressMenuEditorState.kt +++ b/app/src/main/java/org/schabi/newpipe/ui/components/menu/LongPressMenuEditorState.kt @@ -88,9 +88,9 @@ class LongPressMenuEditorState( }.toList() } - fun resetToDefaults() { + fun resetToDefaults(context: Context) { items.clear() - items.addAll(buildItemsInList(true, LongPressAction.Type.DefaultEnabledActions)) + items.addAll(buildItemsInList(true, getDefaultEnabledLongPressActions(context))) } private fun findItemForOffsetOrClosestInRow(offset: IntOffset): LazyGridItemInfo? { diff --git a/app/src/main/java/org/schabi/newpipe/ui/components/menu/LongPressMenuSettings.kt b/app/src/main/java/org/schabi/newpipe/ui/components/menu/LongPressMenuSettings.kt index be14125dc..16eaddd16 100644 --- a/app/src/main/java/org/schabi/newpipe/ui/components/menu/LongPressMenuSettings.kt +++ b/app/src/main/java/org/schabi/newpipe/ui/components/menu/LongPressMenuSettings.kt @@ -5,6 +5,25 @@ import android.util.Log import androidx.core.content.edit import androidx.preference.PreferenceManager import org.schabi.newpipe.R +import org.schabi.newpipe.ui.components.menu.LongPressAction.Type.AddToPlaylist +import org.schabi.newpipe.ui.components.menu.LongPressAction.Type.Background +import org.schabi.newpipe.ui.components.menu.LongPressAction.Type.BackgroundFromHere +import org.schabi.newpipe.ui.components.menu.LongPressAction.Type.BackgroundShuffled +import org.schabi.newpipe.ui.components.menu.LongPressAction.Type.Delete +import org.schabi.newpipe.ui.components.menu.LongPressAction.Type.Download +import org.schabi.newpipe.ui.components.menu.LongPressAction.Type.Enqueue +import org.schabi.newpipe.ui.components.menu.LongPressAction.Type.EnqueueNext +import org.schabi.newpipe.ui.components.menu.LongPressAction.Type.MarkAsWatched +import org.schabi.newpipe.ui.components.menu.LongPressAction.Type.OpenInBrowser +import org.schabi.newpipe.ui.components.menu.LongPressAction.Type.PlayWithKodi +import org.schabi.newpipe.ui.components.menu.LongPressAction.Type.Popup +import org.schabi.newpipe.ui.components.menu.LongPressAction.Type.Remove +import org.schabi.newpipe.ui.components.menu.LongPressAction.Type.Rename +import org.schabi.newpipe.ui.components.menu.LongPressAction.Type.SetAsPlaylistThumbnail +import org.schabi.newpipe.ui.components.menu.LongPressAction.Type.Share +import org.schabi.newpipe.ui.components.menu.LongPressAction.Type.ShowDetails +import org.schabi.newpipe.ui.components.menu.LongPressAction.Type.UnsetPlaylistThumbnail +import org.schabi.newpipe.ui.components.menu.LongPressAction.Type.Unsubscribe private const val TAG: String = "LongPressMenuSettings" @@ -20,12 +39,35 @@ fun storeIsHeaderEnabledToSettings(context: Context, enabled: Boolean) { } } +// ShowChannelDetails is not enabled by default, since navigating to channel details can +// also be done by clicking on the uploader name in the long press menu header. +// PlayWithKodi is only added by default if it is enabled in settings. +private val DefaultEnabledActions: List = listOf( + ShowDetails, Enqueue, EnqueueNext, Background, Popup, BackgroundFromHere, + BackgroundShuffled, Download, AddToPlaylist, Share, OpenInBrowser, MarkAsWatched, + Rename, SetAsPlaylistThumbnail, UnsetPlaylistThumbnail, Delete, Unsubscribe, Remove +) + +private fun getShowPlayWithKodi(context: Context): Boolean { + return PreferenceManager.getDefaultSharedPreferences(context) + .getBoolean(context.getString(R.string.show_play_with_kodi_key), false) +} + +fun getDefaultEnabledLongPressActions(context: Context): List { + return if (getShowPlayWithKodi(context)) { + // only include Kodi in the default actions if it is enabled in settings + DefaultEnabledActions + listOf(PlayWithKodi) + } else { + DefaultEnabledActions + } +} + fun loadLongPressActionArrangementFromSettings(context: Context): List { val key = context.getString(R.string.long_press_menu_action_arrangement_key) val items = PreferenceManager.getDefaultSharedPreferences(context) .getString(key, null) if (items == null) { - return LongPressAction.Type.DefaultEnabledActions + return getDefaultEnabledLongPressActions(context) } try { @@ -45,7 +87,7 @@ fun loadLongPressActionArrangementFromSettings(context: Context): List