[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