TP-85813 | Make getMedia3SimpleCache() nullable (#574)
This commit is contained in:
committed by
GitHub
parent
57b088c4cf
commit
60c9b5bd3d
@@ -62,5 +62,5 @@ interface IUiTronDependencyProvider {
|
||||
|
||||
fun getShape(shape: UiTronShape?): Shape?
|
||||
|
||||
fun getMedia3SimpleCache(): SimpleCache
|
||||
fun getMedia3SimpleCache(): SimpleCache? = null
|
||||
}
|
||||
|
||||
@@ -31,6 +31,7 @@ import androidx.media3.datasource.DefaultHttpDataSource
|
||||
import androidx.media3.datasource.FileDataSource
|
||||
import androidx.media3.datasource.cache.CacheDataSink
|
||||
import androidx.media3.datasource.cache.CacheDataSource
|
||||
import androidx.media3.datasource.cache.SimpleCache
|
||||
import androidx.media3.exoplayer.ExoPlayer
|
||||
import androidx.media3.exoplayer.source.MediaSource
|
||||
import androidx.media3.exoplayer.source.ProgressiveMediaSource
|
||||
@@ -64,98 +65,104 @@ class VideoRenderer(private val uiTronRenderer: UiTronRenderer) : Renderer<Video
|
||||
uiTronViewModel: UiTronViewModel,
|
||||
modifier: Modifier?
|
||||
) {
|
||||
super.Render(property, uiTronData, uiTronViewModel, modifier)
|
||||
val videoData = uiTronData as? VideoData
|
||||
UiTronSdkManager.getDependencyProvider().getMedia3SimpleCache()?.let { downloadCache ->
|
||||
super.Render(property, uiTronData, uiTronViewModel, modifier)
|
||||
val videoData = uiTronData as? VideoData
|
||||
|
||||
if (property.visible.orTrue()) {
|
||||
val viewModifier =
|
||||
(modifier ?: Modifier)
|
||||
.setTag(property)
|
||||
.layoutId(property.layoutId.orEmpty())
|
||||
.customOffset(property.offset)
|
||||
.setWidth(property.width)
|
||||
.setHeight(property.height)
|
||||
.setWidthRange(property.widthRange)
|
||||
.setHeightRange(property.heightRange)
|
||||
.setPadding(property.margin)
|
||||
.setBackground(
|
||||
property.backgroundColor,
|
||||
property.shape,
|
||||
property.backGroundBrushData
|
||||
)
|
||||
.clip(property.clipShape)
|
||||
.setPadding(property.padding)
|
||||
.customClickable(
|
||||
{ uiTronViewModel.handleActions(uiTronData?.onClick) },
|
||||
actions = uiTronData?.onClick?.actions,
|
||||
property = property
|
||||
)
|
||||
.customCombinedClick(property, uiTronData) { uiTronViewModel.handleActions(it) }
|
||||
.graphicsLayer { alpha = property.alpha ?: 1.0f }
|
||||
.setBlur(property.blurData)
|
||||
|
||||
val localContext = LocalContext.current
|
||||
|
||||
val mediaUrl = remember(videoData?.videoUrl) { videoData?.videoUrl.orEmpty() }
|
||||
|
||||
val placeholderVisibility = remember { mutableStateOf(true) }
|
||||
|
||||
exoPlayer =
|
||||
remember(mediaUrl) {
|
||||
ExoPlayer.Builder(localContext).build().apply {
|
||||
setMediaSource(getProgressiveMediaSource(localContext, mediaUrl))
|
||||
repeatMode = ExoPlayer.REPEAT_MODE_ALL
|
||||
volume = 0f
|
||||
prepare()
|
||||
addListener(
|
||||
object : Player.Listener {
|
||||
override fun onPlaybackStateChanged(playbackState: Int) {
|
||||
super.onPlaybackStateChanged(playbackState)
|
||||
if (playbackState == STATE_READY) {
|
||||
play()
|
||||
}
|
||||
}
|
||||
|
||||
override fun onRenderedFirstFrame() {
|
||||
super.onRenderedFirstFrame()
|
||||
if (placeholderVisibility.value) {
|
||||
placeholderVisibility.value = false
|
||||
}
|
||||
}
|
||||
}
|
||||
if (property.visible.orTrue()) {
|
||||
val viewModifier =
|
||||
(modifier ?: Modifier)
|
||||
.setTag(property)
|
||||
.layoutId(property.layoutId.orEmpty())
|
||||
.customOffset(property.offset)
|
||||
.setWidth(property.width)
|
||||
.setHeight(property.height)
|
||||
.setWidthRange(property.widthRange)
|
||||
.setHeightRange(property.heightRange)
|
||||
.setPadding(property.margin)
|
||||
.setBackground(
|
||||
property.backgroundColor,
|
||||
property.shape,
|
||||
property.backGroundBrushData
|
||||
)
|
||||
.clip(property.clipShape)
|
||||
.setPadding(property.padding)
|
||||
.customClickable(
|
||||
{ uiTronViewModel.handleActions(uiTronData?.onClick) },
|
||||
actions = uiTronData?.onClick?.actions,
|
||||
property = property
|
||||
)
|
||||
.customCombinedClick(property, uiTronData) {
|
||||
uiTronViewModel.handleActions(it)
|
||||
}
|
||||
.graphicsLayer { alpha = property.alpha ?: 1.0f }
|
||||
.setBlur(property.blurData)
|
||||
|
||||
val localContext = LocalContext.current
|
||||
|
||||
val mediaUrl = remember(videoData?.videoUrl) { videoData?.videoUrl.orEmpty() }
|
||||
|
||||
val placeholderVisibility = remember { mutableStateOf(true) }
|
||||
|
||||
exoPlayer =
|
||||
remember(mediaUrl) {
|
||||
ExoPlayer.Builder(localContext).build().apply {
|
||||
setMediaSource(
|
||||
getProgressiveMediaSource(localContext, mediaUrl, downloadCache)
|
||||
)
|
||||
repeatMode = ExoPlayer.REPEAT_MODE_ALL
|
||||
volume = 0f
|
||||
prepare()
|
||||
addListener(
|
||||
object : Player.Listener {
|
||||
override fun onPlaybackStateChanged(playbackState: Int) {
|
||||
super.onPlaybackStateChanged(playbackState)
|
||||
if (playbackState == STATE_READY) {
|
||||
play()
|
||||
}
|
||||
}
|
||||
|
||||
override fun onRenderedFirstFrame() {
|
||||
super.onRenderedFirstFrame()
|
||||
if (placeholderVisibility.value) {
|
||||
placeholderVisibility.value = false
|
||||
}
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
val playerView =
|
||||
remember(exoPlayer) {
|
||||
PlayerView(localContext).apply {
|
||||
useController = false
|
||||
player = exoPlayer
|
||||
resizeMode = RESIZE_MODE_ZOOM
|
||||
}
|
||||
}
|
||||
|
||||
Box {
|
||||
AndroidView(modifier = viewModifier, factory = { playerView })
|
||||
if (placeholderVisibility.value) {
|
||||
property.placeHolderView?.let {
|
||||
UiTronRenderer(
|
||||
it.data,
|
||||
uiTronViewModel,
|
||||
uiTronRenderer.customUiTronRenderer,
|
||||
)
|
||||
.Render(
|
||||
composeViews = it.parentComposeView.orEmpty(),
|
||||
modifier = viewModifier
|
||||
)
|
||||
} ?: run { Box(viewModifier.background(Color.White)) }
|
||||
}
|
||||
}
|
||||
|
||||
val playerView =
|
||||
remember(exoPlayer) {
|
||||
PlayerView(localContext).apply {
|
||||
useController = false
|
||||
player = exoPlayer
|
||||
resizeMode = RESIZE_MODE_ZOOM
|
||||
}
|
||||
}
|
||||
val lifecycleOwner = rememberUpdatedState(LocalLifecycleOwner.current)
|
||||
|
||||
Box {
|
||||
AndroidView(modifier = viewModifier, factory = { playerView })
|
||||
if (placeholderVisibility.value) {
|
||||
property.placeHolderView?.let {
|
||||
UiTronRenderer(
|
||||
it.data,
|
||||
uiTronViewModel,
|
||||
uiTronRenderer.customUiTronRenderer,
|
||||
)
|
||||
.Render(
|
||||
composeViews = it.parentComposeView.orEmpty(),
|
||||
modifier = viewModifier
|
||||
)
|
||||
} ?: run { Box(viewModifier.background(Color.White)) }
|
||||
}
|
||||
DisposableEffect(lifecycleOwner.value) { onDispose { releasePlayer() } }
|
||||
}
|
||||
|
||||
val lifecycleOwner = rememberUpdatedState(LocalLifecycleOwner.current)
|
||||
|
||||
DisposableEffect(lifecycleOwner.value) { onDispose { releasePlayer() } }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -170,8 +177,11 @@ class VideoRenderer(private val uiTronRenderer: UiTronRenderer) : Renderer<Video
|
||||
}
|
||||
|
||||
companion object {
|
||||
private fun getProgressiveMediaSource(context: Context, mediaUrl: String): MediaSource {
|
||||
val downloadCache = UiTronSdkManager.getDependencyProvider().getMedia3SimpleCache()
|
||||
private fun getProgressiveMediaSource(
|
||||
context: Context,
|
||||
mediaUrl: String,
|
||||
downloadCache: SimpleCache
|
||||
): MediaSource {
|
||||
val cacheSink = CacheDataSink.Factory().setCache(downloadCache)
|
||||
val downstreamFactory = FileDataSource.Factory()
|
||||
val upstreamFactory =
|
||||
|
||||
Reference in New Issue
Block a user