TP-85813 | Make getMedia3SimpleCache() nullable (#574)

This commit is contained in:
Soumya Ranjan Patra
2024-09-25 14:55:59 +05:30
committed by GitHub
parent 57b088c4cf
commit 60c9b5bd3d
2 changed files with 98 additions and 88 deletions

View File

@@ -62,5 +62,5 @@ interface IUiTronDependencyProvider {
fun getShape(shape: UiTronShape?): Shape?
fun getMedia3SimpleCache(): SimpleCache
fun getMedia3SimpleCache(): SimpleCache? = null
}

View File

@@ -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 =