Use trimmed video start for thumbnail generation.

This commit is contained in:
Cody Henthorne
2026-05-08 12:56:10 -04:00
committed by Michelle Tang
parent 5e4865be73
commit d1e2fc0423
11 changed files with 44 additions and 19 deletions
@@ -29,12 +29,12 @@ object SignalGlideDependencies {
val application: Application
get() = _application
fun getUriInputStreamFactory(uri: Uri): InputStreamFactory = _provider.getUriInputStreamFactory(uri)
fun getUriInputStreamFactory(uri: Uri, thumbnailTimeUs: Long = 0): InputStreamFactory = _provider.getUriInputStreamFactory(uri, thumbnailTimeUs)
interface Provider {
/**
* A factory which can create an [java.io.InputStream] from a given [Uri]
* A factory which can create an [java.io.InputStream] from a given [Uri]. For videos, [thumbnailTimeUs] specifies the frame time to extract.
*/
fun getUriInputStreamFactory(uri: Uri): InputStreamFactory
fun getUriInputStreamFactory(uri: Uri, thumbnailTimeUs: Long = 0): InputStreamFactory
}
}
@@ -17,7 +17,8 @@ import java.io.InputStream
interface InputStreamFactory {
companion object {
@JvmStatic
fun build(uri: Uri): InputStreamFactory = SignalGlideDependencies.getUriInputStreamFactory(uri)
@JvmOverloads
fun build(uri: Uri, thumbnailTimeUs: Long = 0): InputStreamFactory = SignalGlideDependencies.getUriInputStreamFactory(uri, thumbnailTimeUs)
@JvmStatic
fun build(file: File): InputStreamFactory = FileInputStreamFactory(file)
@@ -9,8 +9,9 @@ import android.net.Uri
import com.bumptech.glide.load.Key
import java.security.MessageDigest
data class DecryptableUri(val uri: Uri) : Key {
data class DecryptableUri @JvmOverloads constructor(val uri: Uri, val thumbnailTimeUs: Long = 0) : Key {
override fun updateDiskCacheKey(messageDigest: MessageDigest) {
messageDigest.update(uri.toString().toByteArray())
messageDigest.update(thumbnailTimeUs.toString().toByteArray())
}
}
@@ -22,7 +22,7 @@ class DecryptableUriStreamFetcher(
override fun loadData(priority: Priority, callback: DataFetcher.DataCallback<in InputStreamFactory>) {
try {
callback.onDataReady(InputStreamFactory.build(decryptableUri.uri))
callback.onDataReady(InputStreamFactory.build(decryptableUri.uri, decryptableUri.thumbnailTimeUs))
} catch (e: Exception) {
callback.onLoadFailed(e)
}