From 01c060caa184c3d4ca4e3cb34bce949ad00f66dc Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Fri, 10 Feb 2023 14:30:39 -0500 Subject: [PATCH] Caching videos to reduce initialization delay. --- .../com/vitorpamplona/amethyst/VideoCache.kt | 41 +++++++++++++++++++ .../amethyst/ui/components/VideoView.kt | 12 ++++-- 2 files changed, 49 insertions(+), 4 deletions(-) create mode 100644 app/src/main/java/com/vitorpamplona/amethyst/VideoCache.kt diff --git a/app/src/main/java/com/vitorpamplona/amethyst/VideoCache.kt b/app/src/main/java/com/vitorpamplona/amethyst/VideoCache.kt new file mode 100644 index 000000000..fc341428f --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/VideoCache.kt @@ -0,0 +1,41 @@ +package com.vitorpamplona.amethyst + +import android.content.Context +import com.google.android.exoplayer2.database.StandaloneDatabaseProvider +import com.google.android.exoplayer2.upstream.DefaultHttpDataSource +import com.google.android.exoplayer2.upstream.cache.CacheDataSource +import com.google.android.exoplayer2.upstream.cache.LeastRecentlyUsedCacheEvictor +import com.google.android.exoplayer2.upstream.cache.SimpleCache + +object VideoCache { + + var exoPlayerCacheSize: Long = 90 * 1024 * 1024 // 90MB + + var leastRecentlyUsedCacheEvictor = LeastRecentlyUsedCacheEvictor(exoPlayerCacheSize) + + lateinit var exoDatabaseProvider: StandaloneDatabaseProvider + lateinit var simpleCache: SimpleCache + + lateinit var cacheDataSourceFactory: CacheDataSource.Factory + + fun get(context: Context): CacheDataSource.Factory { + if (!this::simpleCache.isInitialized) { + exoDatabaseProvider = StandaloneDatabaseProvider(context) + + simpleCache = SimpleCache( + context.cacheDir, + leastRecentlyUsedCacheEvictor, + exoDatabaseProvider + ) + + cacheDataSourceFactory = CacheDataSource.Factory() + .setCache(simpleCache) + .setUpstreamDataSourceFactory( + DefaultHttpDataSource.Factory().setAllowCrossProtocolRedirects(true) + ) + .setFlags(CacheDataSource.FLAG_IGNORE_CACHE_ON_ERROR) + } + + return cacheDataSourceFactory + } +} \ No newline at end of file diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/VideoView.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/VideoView.kt index 4197a7890..9d6b9faa9 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/VideoView.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/VideoView.kt @@ -13,8 +13,12 @@ import com.google.android.exoplayer2.C import com.google.android.exoplayer2.ExoPlayer import com.google.android.exoplayer2.MediaItem import com.google.android.exoplayer2.Player +import com.google.android.exoplayer2.source.ProgressiveMediaSource import com.google.android.exoplayer2.ui.AspectRatioFrameLayout import com.google.android.exoplayer2.ui.StyledPlayerView +import com.google.android.exoplayer2.upstream.DefaultHttpDataSource +import com.google.android.exoplayer2.upstream.cache.CacheDataSource +import com.vitorpamplona.amethyst.VideoCache @Composable fun VideoView(videoUri: String) { @@ -28,17 +32,17 @@ fun VideoView(videoUri: String) { } DisposableEffect(exoPlayer) { - exoPlayer.setMediaItem(MediaItem.fromUri(videoUri)) + exoPlayer.setMediaSource( + ProgressiveMediaSource.Factory(VideoCache.get(context.applicationContext)).createMediaSource(MediaItem.fromUri(videoUri)) + ) exoPlayer.prepare() - onDispose { exoPlayer.release() } } AndroidView( - modifier = Modifier - .fillMaxWidth(), + modifier = Modifier.fillMaxWidth(), factory = { StyledPlayerView(context).apply { player = exoPlayer