62 lines
1.8 KiB
Kotlin
62 lines
1.8 KiB
Kotlin
package core.presentation.components
|
|
|
|
import androidx.annotation.OptIn
|
|
import androidx.compose.foundation.layout.fillMaxSize
|
|
import androidx.compose.runtime.*
|
|
import androidx.compose.ui.Modifier
|
|
import androidx.compose.ui.platform.LocalContext
|
|
import androidx.compose.ui.viewinterop.AndroidView
|
|
import androidx.media3.common.MediaItem
|
|
import androidx.media3.common.Player
|
|
import androidx.media3.common.util.UnstableApi
|
|
import androidx.media3.exoplayer.ExoPlayer
|
|
import androidx.media3.ui.PlayerView
|
|
import androidx.media3.ui.AspectRatioFrameLayout
|
|
|
|
@OptIn(UnstableApi::class)
|
|
@Composable
|
|
fun AppVideoPlayer(
|
|
url: String,
|
|
modifier: Modifier = Modifier,
|
|
useController: Boolean = true,
|
|
autoPlay: Boolean = true,
|
|
onVideoFinished: () -> Unit = {}
|
|
) {
|
|
val context = LocalContext.current
|
|
|
|
val exoPlayer = remember {
|
|
ExoPlayer.Builder(context).build().apply {
|
|
val mediaItem = MediaItem.fromUri(url)
|
|
setMediaItem(mediaItem)
|
|
prepare()
|
|
playWhenReady = autoPlay
|
|
addListener(object : Player.Listener {
|
|
override fun onPlaybackStateChanged(state: Int) {
|
|
if (state == Player.STATE_ENDED) {
|
|
onVideoFinished()
|
|
}
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
// Очистка ресурсов при выходе
|
|
DisposableEffect(Unit) {
|
|
onDispose {
|
|
exoPlayer.release()
|
|
}
|
|
}
|
|
|
|
AndroidView(
|
|
factory = {
|
|
PlayerView(it).apply {
|
|
player = exoPlayer
|
|
this.useController = useController
|
|
// Для сторис используем заполнение экрана
|
|
resizeMode = AspectRatioFrameLayout.RESIZE_MODE_ZOOM
|
|
}
|
|
},
|
|
modifier = modifier
|
|
)
|
|
}
|