[Android] Fix play as video on TV

Nicolas Pomepuy git at videolan.org
Mon Apr 7 16:21:19 UTC 2025


vlc-android | branch: master | Nicolas Pomepuy <nicolas at videolabs.io> | Fri Apr  4 07:59:02 2025 +0200| [4e2e2dd3f1bc1e491153b4cbd17f16aad5a666e7] | committer: Nicolas Pomepuy

Fix play as video on TV

Fixes #3196

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

 .../television/ui/audioplayer/AudioPlayerActivity.kt | 20 +++++++++++++++++++-
 .../videolan/vlc/gui/AudioPlayerContainerActivity.kt |  7 ++++++-
 .../vlc/gui/helpers/PlayerOptionsDelegate.kt         |  9 +++++++--
 3 files changed, 32 insertions(+), 4 deletions(-)

diff --git a/application/television/src/main/java/org/videolan/television/ui/audioplayer/AudioPlayerActivity.kt b/application/television/src/main/java/org/videolan/television/ui/audioplayer/AudioPlayerActivity.kt
index 12a9bb1025..81fef5160a 100644
--- a/application/television/src/main/java/org/videolan/television/ui/audioplayer/AudioPlayerActivity.kt
+++ b/application/television/src/main/java/org/videolan/television/ui/audioplayer/AudioPlayerActivity.kt
@@ -40,6 +40,7 @@ import androidx.lifecycle.ViewModelProvider
 import androidx.lifecycle.lifecycleScope
 import androidx.recyclerview.widget.LinearLayoutManager
 import androidx.vectordrawable.graphics.drawable.AnimatedVectorDrawableCompat
+import kotlinx.coroutines.CoroutineStart
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.MainScope
 import kotlinx.coroutines.flow.launchIn
@@ -75,10 +76,13 @@ import org.videolan.vlc.gui.helpers.KeycodeListener
 import org.videolan.vlc.gui.helpers.MediaComparators
 import org.videolan.vlc.gui.helpers.PlayerKeyListenerDelegate
 import org.videolan.vlc.gui.helpers.PlayerOptionsDelegate
+import org.videolan.vlc.gui.helpers.PlayerOptionsDelegateCallback
 import org.videolan.vlc.gui.helpers.UiTools
 import org.videolan.vlc.gui.helpers.UiTools.showPinIfNeeded
+import org.videolan.vlc.gui.video.VideoPlayerActivity
 import org.videolan.vlc.media.MediaUtils
 import org.videolan.vlc.media.PlaylistManager
+import org.videolan.vlc.media.PlaylistManager.Companion.hasMedia
 import org.videolan.vlc.util.getScreenWidth
 import org.videolan.vlc.viewmodels.BookmarkModel
 import org.videolan.vlc.viewmodels.PlayerState
@@ -86,7 +90,7 @@ import org.videolan.vlc.viewmodels.PlaylistModel
 import kotlin.math.absoluteValue
 
 @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
-class AudioPlayerActivity : BaseTvActivity(),KeycodeListener, PlaybackService.Callback  {
+class AudioPlayerActivity : BaseTvActivity(),KeycodeListener, PlaybackService.Callback, PlayerOptionsDelegateCallback  {
 
     private lateinit var binding: TvAudioPlayerBinding
     private lateinit var adapter: PlaylistAdapter
@@ -498,4 +502,18 @@ class AudioPlayerActivity : BaseTvActivity(),KeycodeListener, PlaybackService.Ca
             }
         }
     }
+
+    override fun onResumeToVideoClick() {
+        model.currentMediaWrapper?.let {
+            if (PlaybackService.hasRenderer()) VideoPlayerActivity.startOpened(
+                this,
+                it.uri, model.currentMediaPosition
+            )
+            else if (hasMedia()) {
+                it.removeFlags(MediaWrapper.MEDIA_FORCE_AUDIO)
+                lifecycleScope.launch(start = CoroutineStart.UNDISPATCHED) { model.switchToVideo() }
+                finish()
+            }
+        }
+    }
 }
diff --git a/application/vlc-android/src/org/videolan/vlc/gui/AudioPlayerContainerActivity.kt b/application/vlc-android/src/org/videolan/vlc/gui/AudioPlayerContainerActivity.kt
index bfc29e31cf..7e83032edb 100644
--- a/application/vlc-android/src/org/videolan/vlc/gui/AudioPlayerContainerActivity.kt
+++ b/application/vlc-android/src/org/videolan/vlc/gui/AudioPlayerContainerActivity.kt
@@ -92,6 +92,7 @@ import org.videolan.vlc.gui.helpers.BottomNavigationBehavior
 import org.videolan.vlc.gui.helpers.KeycodeListener
 import org.videolan.vlc.gui.helpers.PlayerBehavior
 import org.videolan.vlc.gui.helpers.PlayerKeyListenerDelegate
+import org.videolan.vlc.gui.helpers.PlayerOptionsDelegateCallback
 import org.videolan.vlc.gui.helpers.UiTools
 import org.videolan.vlc.gui.helpers.UiTools.isTablet
 import org.videolan.vlc.interfaces.IRefreshable
@@ -115,7 +116,7 @@ private const val PLAYER_OPENED = "player_opened"
 private const val SHOWN_TIPS = "shown_tips"
 private const val BOOKMARK_VISIBLE: String = "bookmark_visible"
 
-open class AudioPlayerContainerActivity : BaseActivity(), KeycodeListener, SchedulerCallback {
+open class AudioPlayerContainerActivity : BaseActivity(), KeycodeListener, SchedulerCallback, PlayerOptionsDelegateCallback {
 
     private var bottomBar: BottomNavigationView? = null
     lateinit var appBarLayout: AppBarLayout
@@ -796,4 +797,8 @@ open class AudioPlayerContainerActivity : BaseActivity(), KeycodeListener, Sched
                 }
             }
         }
+
+    override fun onResumeToVideoClick() {
+        audioPlayer.onResumeToVideoClick()
+    }
 }
diff --git a/application/vlc-android/src/org/videolan/vlc/gui/helpers/PlayerOptionsDelegate.kt b/application/vlc-android/src/org/videolan/vlc/gui/helpers/PlayerOptionsDelegate.kt
index 834efa78dc..459853c027 100644
--- a/application/vlc-android/src/org/videolan/vlc/gui/helpers/PlayerOptionsDelegate.kt
+++ b/application/vlc-android/src/org/videolan/vlc/gui/helpers/PlayerOptionsDelegate.kt
@@ -207,8 +207,9 @@ class PlayerOptionsDelegate(val activity: FragmentActivity, val service: Playbac
             }
             ID_PLAY_AS_AUDIO -> (activity as VideoPlayerActivity).switchToAudioMode(true)
             ID_PLAY_AS_VIDEO -> {
-                val audioPlayerContainerActivity = activity as AudioPlayerContainerActivity
-                audioPlayerContainerActivity.audioPlayer.onResumeToVideoClick()
+                when {
+                    activity is PlayerOptionsDelegateCallback -> activity.onResumeToVideoClick()
+                }
             }
             ID_POPUP_VIDEO -> {
                 (activity as VideoPlayerActivity).switchToPopup()
@@ -450,4 +451,8 @@ class PlayerOptionsDelegate(val activity: FragmentActivity, val service: Playbac
     }
 }
 
+interface PlayerOptionsDelegateCallback {
+    fun onResumeToVideoClick()
+}
+
 data class PlayerOption(val id: Long, val icon: Int, val title: String)



More information about the Android mailing list