[Android] Add playlist, artist, and album information to the playback screen
Robert Stone
git at videolan.org
Tue Nov 3 15:47:09 CET 2020
vlc-android | branch: 3.3.x | Robert Stone <rhstone at gmail.com> | Wed Oct 21 21:18:47 2020 -0700| [27fe82a2ced21585f7aab37c45b566c41445abc1] | committer: Nicolas Pomepuy
Add playlist, artist, and album information to the playback screen
(cherry picked from commit 85677afc29aa58819a6218da5904434e648701bc)
> https://code.videolan.org/videolan/vlc-android/commit/27fe82a2ced21585f7aab37c45b566c41445abc1
---
.../java/org/videolan/resources/AndroidDevices.kt | 7 +++++++
.../tools/src/main/java/org/videolan/tools/Util.kt | 11 -----------
.../src/org/videolan/vlc/PlaybackService.kt | 5 +++++
.../videolan/vlc/gui/helpers/NotificationHelper.kt | 2 +-
.../src/org/videolan/vlc/media/MediaUtils.kt | 19 +++++++++++++++++++
5 files changed, 32 insertions(+), 12 deletions(-)
diff --git a/application/resources/src/main/java/org/videolan/resources/AndroidDevices.kt b/application/resources/src/main/java/org/videolan/resources/AndroidDevices.kt
index 8ac3ed2a2..8543ec420 100644
--- a/application/resources/src/main/java/org/videolan/resources/AndroidDevices.kt
+++ b/application/resources/src/main/java/org/videolan/resources/AndroidDevices.kt
@@ -21,8 +21,10 @@
package org.videolan.resources
import android.annotation.TargetApi
+import android.app.UiModeManager
import android.content.Context
import android.content.pm.PackageManager
+import android.content.res.Configuration
import android.net.Uri
import android.os.Build
import android.os.Build.VERSION_CODES
@@ -166,6 +168,11 @@ object AndroidDevices {
return Build.VERSION.SDK_INT > VERSION_CODES.P || Build.VERSION.SDK_INT == VERSION_CODES.P && "samsung" == Build.MANUFACTURER.toLowerCase(Locale.US)
}
+ fun isCarMode(ctx: Context): Boolean {
+ val uiModeManager = ctx.getSystemService(Context.UI_MODE_SERVICE) as UiModeManager
+ return uiModeManager.currentModeType == Configuration.UI_MODE_TYPE_CAR
+ }
+
private fun hasPlayServices(pm: PackageManager): Boolean {
try {
pm.getPackageInfo("com.google.android.gsf", PackageManager.GET_SERVICES)
diff --git a/application/tools/src/main/java/org/videolan/tools/Util.kt b/application/tools/src/main/java/org/videolan/tools/Util.kt
deleted file mode 100644
index 550ad180f..000000000
--- a/application/tools/src/main/java/org/videolan/tools/Util.kt
+++ /dev/null
@@ -1,11 +0,0 @@
-package org.videolan.tools
-
-fun getMediaDescription(artist: String?, album: String?): String {
- val hasArtist = !artist.isNullOrEmpty()
- val hasAlbum = !album.isNullOrEmpty()
- if (!hasAlbum && !hasArtist) return ""
- val contentBuilder = StringBuilder(if (hasArtist) artist!! else "")
- if (hasArtist && hasAlbum) contentBuilder.append(" - ")
- if (hasAlbum) contentBuilder.append(album)
- return contentBuilder.toString()
-}
\ No newline at end of file
diff --git a/application/vlc-android/src/org/videolan/vlc/PlaybackService.kt b/application/vlc-android/src/org/videolan/vlc/PlaybackService.kt
index 3ab57e758..5872b3d4e 100644
--- a/application/vlc-android/src/org/videolan/vlc/PlaybackService.kt
+++ b/application/vlc-android/src/org/videolan/vlc/PlaybackService.kt
@@ -850,6 +850,11 @@ class PlaybackService : MediaBrowserServiceCompat(), LifecycleOwner {
putString(MediaMetadataCompat.METADATA_KEY_ALBUM, MediaUtils.getMediaAlbum(ctx, media))
putLong(MediaMetadataCompat.METADATA_KEY_DURATION, if (length != 0L) length else -1L)
}
+ if (AndroidDevices.isCarMode(ctx)) {
+ bob.putString(MediaMetadataCompat.METADATA_KEY_DISPLAY_TITLE, title)
+ bob.putString(MediaMetadataCompat.METADATA_KEY_DISPLAY_SUBTITLE, MediaUtils.getDisplaySubtitle(ctx, media, currentMediaPosition, mediaListSize))
+ bob.putString(MediaMetadataCompat.METADATA_KEY_DISPLAY_DESCRIPTION, MediaUtils.getMediaAlbum(ctx, media))
+ }
if (coverOnLockscreen) {
val cover = AudioUtil.readCoverBitmap(Uri.decode(media.artworkMrl), 512)
if (cover?.config != null)
diff --git a/application/vlc-android/src/org/videolan/vlc/gui/helpers/NotificationHelper.kt b/application/vlc-android/src/org/videolan/vlc/gui/helpers/NotificationHelper.kt
index ae5e965e1..8afecea79 100644
--- a/application/vlc-android/src/org/videolan/vlc/gui/helpers/NotificationHelper.kt
+++ b/application/vlc-android/src/org/videolan/vlc/gui/helpers/NotificationHelper.kt
@@ -37,8 +37,8 @@ import androidx.media.session.MediaButtonReceiver
import org.videolan.libvlc.util.AndroidUtil
import org.videolan.resources.*
import org.videolan.tools.getContextWithLocale
-import org.videolan.tools.getMediaDescription
import org.videolan.vlc.R
+import org.videolan.vlc.media.MediaUtils.getMediaDescription
private const val MEDIALIBRRARY_CHANNEL_ID = "vlc_medialibrary"
private const val PLAYBACK_SERVICE_CHANNEL_ID = "vlc_playback"
diff --git a/application/vlc-android/src/org/videolan/vlc/media/MediaUtils.kt b/application/vlc-android/src/org/videolan/vlc/media/MediaUtils.kt
index cabce930e..02f826f3c 100644
--- a/application/vlc-android/src/org/videolan/vlc/media/MediaUtils.kt
+++ b/application/vlc-android/src/org/videolan/vlc/media/MediaUtils.kt
@@ -348,6 +348,25 @@ object MediaUtils {
return subtitle
}
+ fun getMediaDescription(artist: String?, album: String?): String {
+ val hasArtist = !artist.isNullOrEmpty()
+ val hasAlbum = !album.isNullOrEmpty()
+ if (!hasAlbum && !hasArtist) return ""
+ val contentBuilder = StringBuilder(artist ?: "")
+ if (hasArtist && hasAlbum) contentBuilder.append(" - ")
+ if (hasAlbum) contentBuilder.append(album)
+ return contentBuilder.toString()
+ }
+
+ fun getDisplaySubtitle(ctx: Context, media: MediaWrapper, mediaPosition: Int, mediaSize: Int): String {
+ val sb = StringBuilder()
+ if (mediaSize > 1) sb.append("${mediaPosition + 1} / $mediaSize")
+ val desc = getMediaDescription(MediaUtils.getMediaArtist(ctx, media), MediaUtils.getMediaAlbum(ctx, media))
+ sb.append(if (desc.isNotEmpty()) (if (sb.isNotEmpty()) " • $desc" else desc) else "")
+ //Replace full-spaces with thin-spaces (Unicode 2009)
+ return sb.toString().replace(" ", "\u2009")
+ }
+
fun getMediaTitle(mediaWrapper: MediaWrapper) = mediaWrapper.title
?: FileUtils.getFileNameFromPath(mediaWrapper.location)
More information about the Android
mailing list