[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