[Android] Add a warning in the video player when playing using a file descriptor

Nicolas Pomepuy git at videolan.org
Thu Feb 6 10:14:41 UTC 2025


vlc-android | branch: master | Nicolas Pomepuy <nicolas at videolabs.io> | Wed Jan 22 09:30:52 2025 +0100| [ededfb8f08fd06ee3fc7634b3735a628396836d2] | committer: Nicolas Pomepuy

Add a warning in the video player when playing using a file descriptor

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

 .../src/main/res/drawable/ic_warning_small.xml     | 16 +++++++++++++
 .../resources/src/main/res/values/strings.xml      |  1 +
 .../vlc-android/res/layout/player_hud_right.xml    | 28 ++++++++++++++++++++++
 .../videolan/vlc/gui/video/VideoPlayerActivity.kt  | 14 +++++++----
 .../vlc/gui/video/VideoPlayerOverlayDelegate.kt    | 15 +++++++++++-
 5 files changed, 69 insertions(+), 5 deletions(-)

diff --git a/application/resources/src/main/res/drawable/ic_warning_small.xml b/application/resources/src/main/res/drawable/ic_warning_small.xml
new file mode 100644
index 0000000000..8b66c70fdd
--- /dev/null
+++ b/application/resources/src/main/res/drawable/ic_warning_small.xml
@@ -0,0 +1,16 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24dp"
+        android:height="24dp"
+        android:viewportWidth="32"
+        android:viewportHeight="32">
+    <path
+            android:pathData="m16,1.0001c-1.5553,0.016 -3.1211,1.3632 -4,4l-7.332,22L2,27.0001c-1.108,0 -2,0.892 -2,2v2h32v-2c0,-1.108 -0.892,-2 -2,-2L27.332,27.0001L20,5.0001c-0.8999,-2.6997 -2.4447,-4.0157 -4,-4zM16,9.0001a2,2 0,0 1,2 2,2 2,0 0,1 -0.0117,0.1758L18,11.1759l-1.0039,10.8828a1,1 0,0 1,0 0.039l-0.0078,0.062A1,1 0,0 1,16 22.9962a1,1 0,0 1,-0.9844 -0.832h-0.0039l-0.0078,-0.094L14,11.1759h0.0078A2,2 0,0 1,14 11.0001a2,2 0,0 1,2 -2zM16,25.0001a2,2 0,0 1,2 2,2 2,0 0,1 -2,2 2,2 0,0 1,-2 -2,2 2,0 0,1 2,-2z"
+            android:strokeAlpha="1"
+            android:strokeLineJoin="round"
+            android:strokeWidth="0.2"
+            android:fillColor="@color/grey400"
+            android:strokeColor="@color/grey400"
+            android:fillType="nonZero"
+            android:fillAlpha="1"
+            android:strokeLineCap="round" />
+</vector>
diff --git a/application/resources/src/main/res/values/strings.xml b/application/resources/src/main/res/values/strings.xml
index 816e02541d..e987b39ccf 100644
--- a/application/resources/src/main/res/values/strings.xml
+++ b/application/resources/src/main/res/values/strings.xml
@@ -842,6 +842,7 @@
     <string name="permission_video">VLC needs your permission to access video media on your device</string>
     <string name="permission_audio">VLC needs your permission to access audio media on your device</string>
     <string name="medialibrary_scan_explanation">VLC can automatically scan your device to organize your media collection.</string>
+    <string name="player_title_fd_warning">Without the storage permission, VLC cannot retrieve the media title nor save the progress</string>
     <string name="onboarding_theme_title">Make yourself at home</string>
     <string name="done">Done</string>
     <string name="onboarding_scan_title">Auto-discover your media</string>
diff --git a/application/vlc-android/res/layout/player_hud_right.xml b/application/vlc-android/res/layout/player_hud_right.xml
index 9b97361ec2..9e21b5a009 100644
--- a/application/vlc-android/res/layout/player_hud_right.xml
+++ b/application/vlc-android/res/layout/player_hud_right.xml
@@ -88,6 +88,34 @@
                 app:layout_constraintTop_toTopOf="parent"
                 tools:text="Game of Thrones S01-E01" />
 
+        <TextView
+                android:id="@+id/player_overlay_title_warning"
+                android:layout_width="wrap_content"
+                android:layout_height="48dp"
+                android:layout_marginTop="8dp"
+                android:background="?attr/selectableItemBackground"
+                android:paddingStart="8dp"
+                android:paddingEnd="8dp"
+                android:drawablePadding="16dp"
+                android:ellipsize="end"
+                android:fontFamily="sans-serif-light"
+                android:gravity="center"
+                android:maxLines="2"
+                android:paddingBottom="4dp"
+                android:shadowColor="@color/blacktransparent"
+                android:shadowDx="0"
+                android:shadowDy="2"
+                android:shadowRadius="11"
+                android:text="@string/unknown"
+                android:textAlignment="center"
+                android:textColor="@color/white"
+                android:textSize="22sp"
+                app:drawableStartCompat="@drawable/ic_warning_small"
+                app:layout_constrainedWidth="true"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintTop_toTopOf="parent" />
+
         <ImageView
             android:id="@+id/playlist_toggle"
             android:layout_width="wrap_content"
diff --git a/application/vlc-android/src/org/videolan/vlc/gui/video/VideoPlayerActivity.kt b/application/vlc-android/src/org/videolan/vlc/gui/video/VideoPlayerActivity.kt
index 728abaa960..7b80d73e9a 100644
--- a/application/vlc-android/src/org/videolan/vlc/gui/video/VideoPlayerActivity.kt
+++ b/application/vlc-android/src/org/videolan/vlc/gui/video/VideoPlayerActivity.kt
@@ -20,7 +20,6 @@
 
 package org.videolan.vlc.gui.video
 
-import android.R.attr.keycode
 import android.annotation.SuppressLint
 import android.annotation.TargetApi
 import android.app.Activity
@@ -747,7 +746,7 @@ open class VideoPlayerActivity : AppCompatActivity(), PlaybackService.Callback,
         setIntent(intent)
         if (playbackStarted) service?.run {
             if (overlayDelegate.isHudRightBindingInitialized()) {
-                overlayDelegate.hudRightBinding.playerOverlayTitle.text = currentMediaWrapper?.title
+                overlayDelegate.setTitle(currentMediaWrapper?.title)
                         ?: return at run
             }
             var uri: Uri? = if (intent.hasExtra(PLAY_EXTRA_ITEM_LOCATION)) {
@@ -1707,7 +1706,7 @@ open class VideoPlayerActivity : AppCompatActivity(), PlaybackService.Callback,
         }
         setESTracks()
         if (overlayDelegate.isHudRightBindingInitialized() && overlayDelegate.hudRightBinding.playerOverlayTitle.length() == 0)
-            overlayDelegate.hudRightBinding.playerOverlayTitle.text = mw.title
+            overlayDelegate.setTitle(mw.title)
         // Get possible subtitles
         observeDownloadedSubtitles()
         optionsDelegate?.setup()
@@ -1981,6 +1980,13 @@ open class VideoPlayerActivity : AppCompatActivity(), PlaybackService.Callback,
             R.id.orientation_quick_action -> {
                 overlayDelegate.nextOrientation()
             }
+            R.id.player_overlay_title_warning -> {
+                val snackbar = UiTools.snackerMessageInfinite(this, getString(R.string.player_title_fd_warning))
+                snackbar?.setAction(R.string.ok) {
+                    snackbar.dismiss()
+                }
+                snackbar?.show()
+            }
         }
     }
 
@@ -2244,7 +2250,7 @@ open class VideoPlayerActivity : AppCompatActivity(), PlaybackService.Callback,
             }
             if (itemTitle != null) title = itemTitle
             if (overlayDelegate.isHudRightBindingInitialized()) {
-                overlayDelegate.hudRightBinding.playerOverlayTitle.text = title
+                overlayDelegate.setTitle(title)
             }
 
             if (wasPaused) {
diff --git a/application/vlc-android/src/org/videolan/vlc/gui/video/VideoPlayerOverlayDelegate.kt b/application/vlc-android/src/org/videolan/vlc/gui/video/VideoPlayerOverlayDelegate.kt
index 3d01c31c22..9deae3268e 100644
--- a/application/vlc-android/src/org/videolan/vlc/gui/video/VideoPlayerOverlayDelegate.kt
+++ b/application/vlc-android/src/org/videolan/vlc/gui/video/VideoPlayerOverlayDelegate.kt
@@ -592,7 +592,7 @@ class VideoPlayerOverlayDelegate (private val player: VideoPlayerActivity) {
                     RendererDelegate.renderers.observe(player) { updateRendererVisibility() }
                 }
 
-                hudRightBinding.playerOverlayTitle.text = service.currentMediaWrapper?.title
+                setTitle(service.currentMediaWrapper?.title)
                 manageTitleConstraints()
                 updateTitleConstraints()
                 updateHudMargins()
@@ -616,6 +616,18 @@ class VideoPlayerOverlayDelegate (private val player: VideoPlayerActivity) {
         }
     }
 
+    fun setTitle(title: String?) {
+        if (!::hudBinding.isInitialized) return
+        hudRightBinding.playerOverlayTitle.text = title
+        if (title?.startsWith("fd://") == false) {
+            hudRightBinding.playerOverlayTitle.setVisible()
+            hudRightBinding.playerOverlayTitleWarning.setGone()
+        } else {
+            hudRightBinding.playerOverlayTitle.setGone()
+            hudRightBinding.playerOverlayTitleWarning.setVisible()
+        }
+    }
+
     fun updateSeekable(seekable: Boolean) {
         if (!::hudBinding.isInitialized) return
         hudBinding.playerOverlayRewind.isEnabled = seekable
@@ -654,6 +666,7 @@ class VideoPlayerOverlayDelegate (private val player: VideoPlayerActivity) {
                     }
                 }
             }
+            hudRightBinding.playerOverlayTitleWarning.setOnClickListener(player)
         }
         if (::hudRightBinding.isInitialized){
             hudRightBinding.playerOverlayNavmenu.setOnClickListener(if (enabled) player else null)



More information about the Android mailing list