[Android] Always return suggestions for quick search client
Robert Stone
git at videolan.org
Thu Apr 24 07:23:39 UTC 2025
vlc-android | branch: master | Robert Stone <rhstone at gmail.com> | Mon Apr 21 23:29:47 2025 -0700| [8e88994523d72afb75bdd3549e0c633ab2da615b] | committer: Nicolas Pomepuy
Always return suggestions for quick search client
Remove unused menu structure and do not return Shuffle All in suggestions
Fixes #3163
> https://code.videolan.org/videolan/vlc-android/commit/8e88994523d72afb75bdd3549e0c633ab2da615b
---
.../main/java/org/videolan/resources/Constants.kt | 2 +-
.../src/org/videolan/vlc/PlaybackService.kt | 5 ++-
.../org/videolan/vlc/media/MediaSessionBrowser.kt | 43 +++++++---------------
3 files changed, 18 insertions(+), 32 deletions(-)
diff --git a/application/resources/src/main/java/org/videolan/resources/Constants.kt b/application/resources/src/main/java/org/videolan/resources/Constants.kt
index 1814f3ea0f..35d4e39391 100644
--- a/application/resources/src/main/java/org/videolan/resources/Constants.kt
+++ b/application/resources/src/main/java/org/videolan/resources/Constants.kt
@@ -75,7 +75,7 @@ const val PLAYLIST_TYPE_AUDIO = 0
const val PLAYLIST_TYPE_VIDEO = 1
const val PLAYLIST_TYPE_ALL = 2
const val MEDIALIBRARY_PAGE_SIZE = 500
-const val DRIVING_MODE_APP_PKG = "com.google.android.googlequicksearchbox"
+const val QUICK_SEARCH_BOX_APP_PKG = "com.google.android.googlequicksearchbox"
const val ANDROID_AUTO_APP_PKG = "com.google.android.projection.gearhead"
const val EXTRA_BROWSER_ICON_SIZE = "com.google.android.gms.car.media.BrowserIconSize"
const val WEARABLE_SHOW_CUSTOM_ACTION = "android.support.wearable.media.extra.CUSTOM_ACTION_SHOW_ON_WEAR"
diff --git a/application/vlc-android/src/org/videolan/vlc/PlaybackService.kt b/application/vlc-android/src/org/videolan/vlc/PlaybackService.kt
index f620bf15ef..56b6944f92 100644
--- a/application/vlc-android/src/org/videolan/vlc/PlaybackService.kt
+++ b/application/vlc-android/src/org/videolan/vlc/PlaybackService.kt
@@ -122,7 +122,6 @@ import org.videolan.resources.CUSTOM_ACTION_REPEAT
import org.videolan.resources.CUSTOM_ACTION_REWIND
import org.videolan.resources.CUSTOM_ACTION_SHUFFLE
import org.videolan.resources.CUSTOM_ACTION_SPEED
-import org.videolan.resources.DRIVING_MODE_APP_PKG
import org.videolan.resources.EXTRA_CUSTOM_ACTION_ID
import org.videolan.resources.EXTRA_PLAY_ONLY
import org.videolan.resources.EXTRA_SEARCH_BUNDLE
@@ -131,6 +130,7 @@ import org.videolan.resources.PLAYBACK_SLOT_RESERVATION_SKIP_TO_NEXT
import org.videolan.resources.PLAYBACK_SLOT_RESERVATION_SKIP_TO_PREV
import org.videolan.resources.PLAYLIST_TYPE_ALL
import org.videolan.resources.PLAYLIST_TYPE_AUDIO
+import org.videolan.resources.QUICK_SEARCH_BOX_APP_PKG
import org.videolan.resources.VLCInstance
import org.videolan.resources.VLCOptions
import org.videolan.resources.WEARABLE_RESERVE_SLOT_SKIP_TO_NEXT
@@ -1907,10 +1907,11 @@ class PlaybackService : MediaBrowserServiceCompat(), LifecycleOwner, CoroutineSc
rootHints?.containsKey(BrowserRoot.EXTRA_SUGGESTED) == true -> BrowserRoot(MediaSessionBrowser.ID_SUGGESTED, null)
else -> {
val rootId = when (clientPackageName) {
- DRIVING_MODE_APP_PKG -> MediaSessionBrowser.ID_ROOT_NO_TABS
+ QUICK_SEARCH_BOX_APP_PKG -> MediaSessionBrowser.ID_SUGGESTED
else -> MediaSessionBrowser.ID_ROOT
}
val extras = MediaSessionBrowser.getContentStyle().apply {
+ putBoolean(BrowserRoot.EXTRA_SUGGESTED, true)
putBoolean(MediaConstants.BROWSER_SERVICE_EXTRAS_KEY_SEARCH_SUPPORTED, true)
}
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.O && clientPackageName == ANDROID_AUTO_APP_PKG) {
diff --git a/application/vlc-android/src/org/videolan/vlc/media/MediaSessionBrowser.kt b/application/vlc-android/src/org/videolan/vlc/media/MediaSessionBrowser.kt
index 457a3c758c..ed116b546c 100644
--- a/application/vlc-android/src/org/videolan/vlc/media/MediaSessionBrowser.kt
+++ b/application/vlc-android/src/org/videolan/vlc/media/MediaSessionBrowser.kt
@@ -119,7 +119,6 @@ class MediaSessionBrowser {
// Root item
// MediaIds are all strings. Maintain in uri parsable format.
const val ID_ROOT = "//${BuildConfig.APP_ID}/r"
- const val ID_ROOT_NO_TABS = "$ID_ROOT?f=1"
const val ID_MEDIA = "$ID_ROOT/media"
const val ID_SEARCH = "$ID_ROOT/search"
const val ID_SUGGESTED = "$ID_ROOT/suggested"
@@ -161,20 +160,16 @@ class MediaSessionBrowser {
val page = parentIdUri.getQueryParameter("p")
val pageOffset = page?.toInt()?.times(MAX_RESULT_SIZE) ?: 0
val isAndroidAuto = rootHints?.containsKey(EXTRA_BROWSER_ICON_SIZE) ?: false
- val flatten = parentIdUri.getBooleanQueryParameter("f", false)
when (parentIdUri.removeQuery().toString()) {
ID_ROOT -> {
//Home
- if (flatten) browse(context, ID_HOME, isShuffling)?.let { results.addAll(it) }
- else {
- val homeMediaDesc = MediaDescriptionCompat.Builder()
- .setMediaId(ID_HOME)
- .setTitle(res.getString(R.string.auto_home))
- .setIconUri(res.getResourceUri(R.drawable.ic_auto_home))
- .setExtras(getContentStyle(CONTENT_STYLE_GRID_ITEM_HINT_VALUE, CONTENT_STYLE_GRID_ITEM_HINT_VALUE))
- .build()
- results.add(MediaBrowserCompat.MediaItem(homeMediaDesc, MediaBrowserCompat.MediaItem.FLAG_BROWSABLE))
- }
+ val homeMediaDesc = MediaDescriptionCompat.Builder()
+ .setMediaId(ID_HOME)
+ .setTitle(res.getString(R.string.auto_home))
+ .setIconUri(res.getResourceUri(R.drawable.ic_auto_home))
+ .setExtras(getContentStyle(CONTENT_STYLE_GRID_ITEM_HINT_VALUE, CONTENT_STYLE_GRID_ITEM_HINT_VALUE))
+ .build()
+ results.add(MediaBrowserCompat.MediaItem(homeMediaDesc, MediaBrowserCompat.MediaItem.FLAG_BROWSABLE))
//Playlists
val playlistMediaDesc = MediaDescriptionCompat.Builder()
.setMediaId(ID_PLAYLIST)
@@ -184,16 +179,13 @@ class MediaSessionBrowser {
.build()
results.add(MediaBrowserCompat.MediaItem(playlistMediaDesc, MediaBrowserCompat.MediaItem.FLAG_BROWSABLE))
//My library
- if (flatten) browse(context, ID_LIBRARY, isShuffling)?.let { results.addAll(it) }
- else {
- val libraryMediaDesc = MediaDescriptionCompat.Builder()
- .setMediaId(ID_LIBRARY)
- .setTitle(res.getString(R.string.auto_my_library))
- .setIconUri(res.getResourceUri(R.drawable.ic_auto_my_library))
- .setExtras(getContentStyle(CONTENT_STYLE_CATEGORY_ITEM_HINT_VALUE))
- .build()
- results.add(MediaBrowserCompat.MediaItem(libraryMediaDesc, MediaBrowserCompat.MediaItem.FLAG_BROWSABLE))
- }
+ val libraryMediaDesc = MediaDescriptionCompat.Builder()
+ .setMediaId(ID_LIBRARY)
+ .setTitle(res.getString(R.string.auto_my_library))
+ .setIconUri(res.getResourceUri(R.drawable.ic_auto_my_library))
+ .setExtras(getContentStyle(CONTENT_STYLE_CATEGORY_ITEM_HINT_VALUE))
+ .build()
+ results.add(MediaBrowserCompat.MediaItem(libraryMediaDesc, MediaBrowserCompat.MediaItem.FLAG_BROWSABLE))
//Streams
val streamsMediaDesc = MediaDescriptionCompat.Builder()
.setMediaId(ID_STREAM)
@@ -442,13 +434,6 @@ class MediaSessionBrowser {
if (!recentAudio.isNullOrEmpty()) for (mw in recentAudio) mw.albumName?.let { albumNames.add(it) }
/* Build the list of media items */
val results: ArrayList<MediaBrowserCompat.MediaItem> = ArrayList()
- val shuffleAllPath = Uri.Builder()
- .appendPath(ArtworkProvider.SHUFFLE_ALL)
- .appendPath(ArtworkProvider.computeExpiration())
- .appendPath("$audioCount")
- .build()
- val shuffleAllMediaDesc = getPlayAllBuilder(context, ID_SHUFFLE_ALL, R.string.shuffle_all_title, audioCount, shuffleAllPath).build()
- results.add(MediaBrowserCompat.MediaItem(shuffleAllMediaDesc, MediaBrowserCompat.MediaItem.FLAG_PLAYABLE))
/* Query albums by name */
val albums = mutableSetOf<Album>()
for (albumName in albumNames) ml.searchAlbum(albumName)?.let { albums.addAll(it.toList()) }
More information about the Android
mailing list