Skip to content

Commit 6d5d6c1

Browse files
authored
Register the OkHttp network fetcher explicitly in the default image loader (#6384)
* Register the OkHttp network fetcher explicitly to survive R8 full-mode. Coil 3 auto-registers OkHttpNetworkFetcherFactory via ServiceLoader, which R8 can strip in release builds, leaving HTTP image loading without a fetcher and rendering only placeholders. Adding it directly to the component registry removes the ServiceLoader dependency for the default SDK path. * Test explicit network fetcher registration in StreamImageLoaderFactory
1 parent 217d159 commit 6d5d6c1

2 files changed

Lines changed: 15 additions & 0 deletions

File tree

stream-chat-android-ui-common/src/main/kotlin/io/getstream/chat/android/ui/common/images/StreamImageLoaderFactory.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import coil3.gif.AnimatedImageDecoder
2525
import coil3.gif.GifDecoder
2626
import coil3.intercept.Interceptor
2727
import coil3.memory.MemoryCache
28+
import coil3.network.okhttp.OkHttpNetworkFetcherFactory
2829
import coil3.request.allowHardware
2930
import coil3.request.crossfade
3031
import coil3.video.VideoFrameDecoder
@@ -82,6 +83,7 @@ public class StreamImageLoaderFactory(
8283
}
8384
.components {
8485
interceptors.forEach { add(it) }
86+
add(OkHttpNetworkFetcherFactory())
8587
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
8688
add(AnimatedImageDecoder.Factory(enforceMinimumFrameDelay = true))
8789
} else {

stream-chat-android-ui-common/src/test/kotlin/io/getstream/chat/android/ui/common/images/StreamImageLoaderFactoryTest.kt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ import coil3.disk.DiskCache
2323
import coil3.gif.AnimatedImageDecoder
2424
import coil3.gif.GifDecoder
2525
import coil3.memory.MemoryCache
26+
import coil3.network.NetworkFetcher
27+
import coil3.serviceLoaderEnabled
2628
import coil3.video.VideoFrameDecoder
2729
import okio.Path.Companion.toOkioPath
2830
import org.amshove.kluent.internal.assertEquals
@@ -103,6 +105,17 @@ internal class StreamImageLoaderFactoryTest {
103105
assertTrue(hasVideoDecoder)
104106
}
105107

108+
@Test
109+
fun `newImageLoader registers network fetcher explicitly without relying on ServiceLoader`() {
110+
val sut = StreamImageLoaderFactory(builder = { serviceLoaderEnabled(false) })
111+
112+
val imageLoader = sut.newImageLoader(context)
113+
114+
val hasNetworkFetcher = imageLoader.components.fetcherFactories
115+
.any { (factory, _) -> factory is NetworkFetcher.Factory }
116+
assertTrue(hasNetworkFetcher)
117+
}
118+
106119
@Test
107120
fun `newImageLoader applies custom builder lambda`() {
108121
var customApplied = false

0 commit comments

Comments
 (0)