[Android] Implement the default playback action for video

Nicolas Pomepuy git at videolan.org
Tue Mar 25 11:55:47 UTC 2025


vlc-android | branch: master | Nicolas Pomepuy <nicolas at videolabs.io> | Tue Mar 18 09:09:57 2025 +0100| [e6ea5245ea88ef4fac8f01e668b3acd4bf34453b] | committer: Nicolas Pomepuy

Implement the default playback action for video

> https://code.videolan.org/videolan/vlc-android/commit/e6ea5245ea88ef4fac8f01e668b3acd4bf34453b
---

 .../resources/src/main/res/values/strings.xml      |  1 +
 .../vlc/gui/helpers/DefaultPlaybackAction.kt       |  2 +-
 .../videolan/vlc/gui/video/VideoGridFragment.kt    | 28 +++++++++++++++-------
 .../vlc/viewmodels/mobile/VideosViewModel.kt       |  5 +---
 4 files changed, 23 insertions(+), 13 deletions(-)

diff --git a/application/resources/src/main/res/values/strings.xml b/application/resources/src/main/res/values/strings.xml
index 7129aa4873..904d203e43 100644
--- a/application/resources/src/main/res/values/strings.xml
+++ b/application/resources/src/main/res/values/strings.xml
@@ -763,6 +763,7 @@
     <string name="episodes">episodes</string>
     <string name="movies">movies</string>
     <string name="videos">videos</string>
+    <string name="default_action_videos">Videos</string>
     <string name="videos_all">All videos</string>
     <string name="clear_playback_history">Clear playback history</string>
     <string name="ml_scanning">Scanning for media files</string>
diff --git a/application/vlc-android/src/org/videolan/vlc/gui/helpers/DefaultPlaybackAction.kt b/application/vlc-android/src/org/videolan/vlc/gui/helpers/DefaultPlaybackAction.kt
index 27ae4be540..52ddb253d4 100644
--- a/application/vlc-android/src/org/videolan/vlc/gui/helpers/DefaultPlaybackAction.kt
+++ b/application/vlc-android/src/org/videolan/vlc/gui/helpers/DefaultPlaybackAction.kt
@@ -70,7 +70,7 @@ enum class DefaultPlaybackAction(@StringRes val title: Int, var selected: Boolea
  * @constructor Create empty Default playback action media type
  */
 enum class DefaultPlaybackActionMediaType(@StringRes val title: Int, val defaultActionKey: String, val allowPlayAll: Boolean = true) {
-    VIDEO(R.string.videos, "default_playback_action_video"),
+    VIDEO(R.string.default_action_videos, "default_playback_action_video"),
     ARTIST(R.string.artists, "default_playback_action_artist", false),
     ALBUM(R.string.albums, "default_playback_action_album", false),
     TRACK(R.string.tracks, "default_playback_action_track"),
diff --git a/application/vlc-android/src/org/videolan/vlc/gui/video/VideoGridFragment.kt b/application/vlc-android/src/org/videolan/vlc/gui/video/VideoGridFragment.kt
index 77bf425a2d..9a38654da3 100644
--- a/application/vlc-android/src/org/videolan/vlc/gui/video/VideoGridFragment.kt
+++ b/application/vlc-android/src/org/videolan/vlc/gui/video/VideoGridFragment.kt
@@ -69,7 +69,6 @@ import org.videolan.resources.PLAYLIST_TYPE_VIDEO
 import org.videolan.resources.UPDATE_SEEN
 import org.videolan.resources.util.parcelable
 import org.videolan.resources.util.parcelableArray
-import org.videolan.resources.util.parcelableList
 import org.videolan.resources.util.waitForML
 import org.videolan.tools.MultiSelectHelper
 import org.videolan.tools.PLAYBACK_HISTORY
@@ -89,6 +88,7 @@ import org.videolan.vlc.gui.dialogs.CONFIRM_PERMISSION_CHANGED
 import org.videolan.vlc.gui.dialogs.CONFIRM_RENAME_DIALOG_RESULT
 import org.videolan.vlc.gui.dialogs.CURRENT_SORT
 import org.videolan.vlc.gui.dialogs.CtxActionReceiver
+import org.videolan.vlc.gui.dialogs.DEFAULT_ACTIONS
 import org.videolan.vlc.gui.dialogs.DISPLAY_IN_CARDS
 import org.videolan.vlc.gui.dialogs.DisplaySettingsDialog
 import org.videolan.vlc.gui.dialogs.KEY_PERMISSION_CHANGED
@@ -100,6 +100,8 @@ import org.videolan.vlc.gui.dialogs.SavePlaylistDialog
 import org.videolan.vlc.gui.dialogs.VIDEO_GROUPING
 import org.videolan.vlc.gui.dialogs.showContext
 import org.videolan.vlc.gui.helpers.AudioUtil.setRingtone
+import org.videolan.vlc.gui.helpers.DefaultPlaybackAction
+import org.videolan.vlc.gui.helpers.DefaultPlaybackActionMediaType
 import org.videolan.vlc.gui.helpers.ItemOffsetDecoration
 import org.videolan.vlc.gui.helpers.MedialibraryUtils
 import org.videolan.vlc.gui.helpers.UiTools
@@ -274,12 +276,14 @@ class VideoGridFragment : MediaBrowserFragment<VideosViewModel>(), SwipeRefreshL
                 }
                 //Open the display settings Bottom sheet
                 DisplaySettingsDialog.newInstance(
-                        displayInCards = settings.getBoolean(KEY_VIDEOS_CARDS, true),
-                        onlyFavs = viewModel.provider.onlyFavorites,
-                        sorts = sorts,
-                        currentSort = viewModel.provider.sort,
-                        currentSortDesc = viewModel.provider.desc,
-                        videoGroup = settings.getString(KEY_GROUP_VIDEOS, GROUP_VIDEOS_NAME)
+                    displayInCards = settings.getBoolean(KEY_VIDEOS_CARDS, true),
+                    onlyFavs = viewModel.provider.onlyFavorites,
+                    sorts = sorts,
+                    currentSort = viewModel.provider.sort,
+                    currentSortDesc = viewModel.provider.desc,
+                    videoGroup = settings.getString(KEY_GROUP_VIDEOS, GROUP_VIDEOS_NAME),
+                    defaultPlaybackActions = DefaultPlaybackActionMediaType.VIDEO.getDefaultPlaybackActions(settings),
+                    defaultActionType = getString(DefaultPlaybackActionMediaType.VIDEO.title)
                 )
                         .show(requireActivity().supportFragmentManager, "DisplaySettingsDialog")
             }
@@ -370,6 +374,9 @@ class VideoGridFragment : MediaBrowserFragment<VideosViewModel>(), SwipeRefreshL
                 settings.putSingle(KEY_GROUP_VIDEOS, videoGroup.value)
                 changeGroupingType(videoGroup.type)
             }
+            DEFAULT_ACTIONS -> {
+                Settings.getInstance(requireActivity()).putSingle(DefaultPlaybackActionMediaType.VIDEO.defaultActionKey, (value as DefaultPlaybackAction).name)
+            }
         }
     }
 
@@ -764,7 +771,12 @@ class VideoGridFragment : MediaBrowserFragment<VideosViewModel>(), SwipeRefreshL
                     multiSelectHelper.toggleSelection(position)
                     invalidateActionMode()
                 } else {
-                    viewModel.playVideo(activity, item, position)
+                    when(DefaultPlaybackActionMediaType.VIDEO.getCurrentPlaybackAction(settings)) {
+                        DefaultPlaybackAction.PLAY -> viewModel.playVideo(activity, item, position)
+                        DefaultPlaybackAction.ADD_TO_QUEUE -> MediaUtils.appendMedia(activity, item)
+                        DefaultPlaybackAction.INSERT_NEXT -> MediaUtils.insertNext(activity, item)
+                        else  -> viewModel.playVideo(activity, item, position, forceAll = true)
+                    }
                 }
             }
             is Folder -> {
diff --git a/application/vlc-android/src/org/videolan/vlc/viewmodels/mobile/VideosViewModel.kt b/application/vlc-android/src/org/videolan/vlc/viewmodels/mobile/VideosViewModel.kt
index 8d59931811..7905e0730a 100644
--- a/application/vlc-android/src/org/videolan/vlc/viewmodels/mobile/VideosViewModel.kt
+++ b/application/vlc-android/src/org/videolan/vlc/viewmodels/mobile/VideosViewModel.kt
@@ -32,8 +32,6 @@ import org.videolan.medialibrary.interfaces.media.Folder
 import org.videolan.medialibrary.interfaces.media.MediaWrapper
 import org.videolan.medialibrary.interfaces.media.VideoGroup
 import org.videolan.medialibrary.media.MediaLibraryItem
-import org.videolan.tools.PLAYLIST_MODE_VIDEO
-import org.videolan.tools.Settings
 import org.videolan.tools.isStarted
 import org.videolan.vlc.gui.helpers.UiTools
 import org.videolan.vlc.gui.helpers.UiTools.addToPlaylist
@@ -136,8 +134,7 @@ class VideosViewModel(context: Context, type: VideoGroupingType, val folder: Fol
         }
         mw.removeFlags(MediaWrapper.MEDIA_FORCE_AUDIO)
         PlaylistManager.playingAsAudio = false
-        val settings = Settings.getInstance(context)
-        if (!fromStart && (settings.getBoolean(PLAYLIST_MODE_VIDEO, Settings.tvUI) || forceAll)) {
+        if (forceAll) {
             when(val prov = provider) {
                 is VideosProvider -> MediaUtils.playAll(context, prov, position, false)
                 is FoldersProvider -> MediaUtils.playAllTracks(context, prov, position, false)



More information about the Android mailing list