Merge pull request #7020 from bxdxnn/misc/svg-support

Add full SVG support
This commit is contained in:
Benoit Marty
2026-07-08 10:57:12 +02:00
committed by GitHub
11 changed files with 181 additions and 10 deletions
@@ -26,6 +26,7 @@ dependencies {
implementation(projects.libraries.designsystem)
implementation(libs.coil.compose)
implementation(libs.coil.gif)
implementation(libs.coil.svg)
implementation(libs.coil.network.okhttp)
testCommonDependencies(libs, true)
@@ -13,6 +13,7 @@ import coil3.decode.ImageSource
import coil3.fetch.FetchResult
import coil3.fetch.Fetcher
import coil3.fetch.SourceFetchResult
import io.element.android.libraries.matrix.api.exception.isNetworkError
import io.element.android.libraries.matrix.api.media.MatrixMediaLoader
import io.element.android.libraries.matrix.api.media.MediaSource
import io.element.android.libraries.matrix.api.media.toFile
@@ -34,7 +35,18 @@ internal class CoilMediaFetcher(
}
return when (val kind = mediaData.kind) {
is MediaRequestData.Kind.Content -> fetchContent(mediaSource)
is MediaRequestData.Kind.Thumbnail -> fetchThumbnail(mediaSource, kind)
is MediaRequestData.Kind.Thumbnail -> {
fetchThumbnail(mediaSource, kind).fold(
onSuccess = { it },
onFailure = { error ->
if (error.isNetworkError()) {
null
} else {
fetchContent(mediaSource)
}
}
)
}
is MediaRequestData.Kind.File -> fetchFile(mediaSource, kind)
}
}
@@ -74,7 +86,7 @@ internal class CoilMediaFetcher(
}.getOrNull()
}
private suspend fun fetchThumbnail(mediaSource: MediaSource, kind: MediaRequestData.Kind.Thumbnail): FetchResult? {
private suspend fun fetchThumbnail(mediaSource: MediaSource, kind: MediaRequestData.Kind.Thumbnail): Result<FetchResult> {
return mediaLoader.loadMediaThumbnail(
source = mediaSource,
width = kind.width,
@@ -83,7 +95,7 @@ internal class CoilMediaFetcher(
byteArray.asSourceResult()
}.onFailure {
Timber.e(it)
}.getOrNull()
}
}
private fun ByteArray.asSourceResult(): SourceFetchResult {
@@ -14,6 +14,7 @@ import coil3.ImageLoader
import coil3.gif.AnimatedImageDecoder
import coil3.gif.GifDecoder
import coil3.network.okhttp.OkHttpNetworkFetcherFactory
import coil3.svg.SvgDecoder
import dev.zacsweers.metro.AppScope
import dev.zacsweers.metro.ContributesBinding
import io.element.android.libraries.di.annotations.ApplicationContext
@@ -49,6 +50,8 @@ class DefaultImageLoaderFactory(
return ImageLoader.Builder(context)
.components {
add(okHttpNetworkFetcherFactory)
// Add svg support
add(SvgDecoder.Factory())
// Add gif support
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
add(AnimatedImageDecoder.Factory())