2
0
Milan Jurkulak 3 жил өмнө
parent
commit
66bfba6ee3

+ 10 - 3
app/src/main/kotlin/org/mjdev/tvapp/ui/screens/IPTVScreen.kt

@@ -24,13 +24,13 @@ import androidx.navigation.navArgument
 import org.mjdev.tvapp.R
 import org.mjdev.tvlib.annotations.TvPreview
 import org.mjdev.tvlib.extensions.StringExt.parseUri
+import org.mjdev.tvlib.interfaces.ItemWithTitle
 import org.mjdev.tvlib.interfaces.ItemWithUri
 import org.mjdev.tvlib.navigation.AnyType
 import org.mjdev.tvlib.screen.Screen
 import org.mjdev.tvlib.ui.components.media.MediaPlayerContainer
 import java.net.URL
 
-@Suppress("MoveVariableDeclarationIntoWhen")
 class IPTVScreen : Screen() {
 
     private val data = "data"
@@ -53,7 +53,7 @@ class IPTVScreen : Screen() {
 
         val data: Any? = remember { args[data] }
 
-        val uriToPlay: String? = when (data) {
+        val mediaUri: String? = when (data) {
             null -> null
             is ItemWithUri<*> -> data.uri.toString()
             is String -> data.toString()
@@ -62,6 +62,11 @@ class IPTVScreen : Screen() {
             else -> data.toString()
         }
 
+        val mediaTitle: String? = when (data) {
+            is ItemWithTitle<*> -> data.title.toString()
+            else -> null
+        }
+
         Box(
             modifier = Modifier
                 .fillMaxSize()
@@ -69,7 +74,9 @@ class IPTVScreen : Screen() {
         ) {
             MediaPlayerContainer(
                 modifier = Modifier.fillMaxSize(),
-                uri = uriToPlay?.parseUri(),
+                uri = mediaUri?.parseUri(),
+                title = mediaTitle,
+                subtitle = mediaUri
             )
         }
 

+ 8 - 0
tvlib/src/main/kotlin/org/mjdev/tvlib/ui/components/media/ExoPlayerImpl.kt

@@ -69,6 +69,14 @@ class ExoPlayerImpl(
                 useArtwork = true
                 artworkDisplayMode = PlayerView.ARTWORK_DISPLAY_MODE_FIT
                 player = exoPlayer
+                setShowBuffering(PlayerView.SHOW_BUFFERING_ALWAYS)
+                setShowMultiWindowTimeBar(true)
+                setShowNextButton(false)
+                setShowPreviousButton(false)
+                setShowRewindButton(true)
+                setShowFastForwardButton(true)
+                setShowShuffleButton(true)
+                setShowVrButton(false)
                 // todo : buttons tint
 //                doOnAttach {
 //                    buttons.forEach { b ->

+ 9 - 5
tvlib/src/main/kotlin/org/mjdev/tvlib/ui/components/media/MediaPlayerContainer.kt

@@ -30,16 +30,20 @@ import org.mjdev.tvlib.ui.components.media.MediaPlayerState.Companion.rememberMe
 fun MediaPlayerContainer(
     modifier: Modifier = Modifier,
     uri: Uri? = Uri.EMPTY,
+    title: String? = null,
+    subtitle: String? = null,
     autoPlay: Boolean = true,
     startSeek: Long = 0L,
     mediaPlayer: IMediaPlayer = MediaPlayerContainerDefaults.exoPlayer,
 ) {
     val isEdit = isEditMode()
     val state = rememberMediaPlayerState(
-        mediaPlayer,
-        uri ?: Uri.EMPTY,
-        autoPlay,
-        startSeek
+        player = mediaPlayer,
+        uri = uri ?: Uri.EMPTY,
+        autoPlay = autoPlay,
+        startSeek = startSeek,
+        title = title,
+        subtitle = subtitle
     )
     Box(
         modifier = modifier
@@ -58,7 +62,7 @@ fun MediaPlayerContainer(
     }
     DisposableEffect(state) {
         if (state.hasMediaToPlay) {
-            mediaPlayer.setMediaUri(state.mediaUri.value)
+            mediaPlayer.setMediaItem(state.mediaItem)
             mediaPlayer.prepare()
             if (state.seek.value > 0L) {
                 mediaPlayer.seekTo(state.seek.value)

+ 20 - 2
tvlib/src/main/kotlin/org/mjdev/tvlib/ui/components/media/MediaPlayerState.kt

@@ -14,6 +14,8 @@ import androidx.compose.runtime.MutableState
 import androidx.compose.runtime.mutableLongStateOf
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
+import androidx.media3.common.MediaItem
+import androidx.media3.common.MediaMetadata
 
 @Suppress("unused", "MemberVisibilityCanBePrivate")
 class MediaPlayerState(
@@ -21,6 +23,8 @@ class MediaPlayerState(
     uri: Uri = Uri.EMPTY,
     autoPlay: Boolean = true,
     startSeek: Long = 0,
+    var title: String? = null,
+    var subtitle: String? = null
 ) {
 
     constructor(
@@ -42,6 +46,16 @@ class MediaPlayerState(
     val hasMediaToPlay = mediaUri.value != Uri.EMPTY
     val isAutoPlay = isPlaying.value
 
+    val metaData get() = MediaMetadata.Builder()
+        .setDisplayTitle(title)
+        .setSubtitle(subtitle)
+        .build()
+
+    val mediaItem get() = MediaItem.Builder()
+        .setUri(mediaUri.value)
+        .setMediaMetadata(metaData)
+        .build()
+
     fun play() {
         isPlaying.value = true
     }
@@ -74,13 +88,17 @@ class MediaPlayerState(
             player: IMediaPlayer?,
             uri: Uri = Uri.EMPTY,
             autoPlay: Boolean = true,
-            startSeek: Long = 0
+            startSeek: Long = 0,
+            title: String? = null,
+            subtitle: String? = null
         ) = remember {
             MediaPlayerState(
                 player,
                 uri,
                 autoPlay,
-                startSeek
+                startSeek,
+                title,
+                subtitle
             )
         }