Skip to content

Commit 648b2f9

Browse files
committed
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.
1 parent 217d159 commit 648b2f9

2 files changed

Lines changed: 14 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: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import coil3.disk.DiskCache
2323
import coil3.gif.AnimatedImageDecoder
2424
import coil3.gif.GifDecoder
2525
import coil3.memory.MemoryCache
26+
import coil3.network.NetworkFetcher
2627
import coil3.video.VideoFrameDecoder
2728
import okio.Path.Companion.toOkioPath
2829
import org.amshove.kluent.internal.assertEquals
@@ -103,6 +104,17 @@ internal class StreamImageLoaderFactoryTest {
103104
assertTrue(hasVideoDecoder)
104105
}
105106

107+
@Test
108+
fun `newImageLoader registers network fetcher for HTTP URLs`() {
109+
val sut = StreamImageLoaderFactory()
110+
111+
val imageLoader = sut.newImageLoader(context)
112+
113+
val hasNetworkFetcher = imageLoader.components.fetcherFactories
114+
.any { (factory, _) -> factory is NetworkFetcher.Factory }
115+
assertTrue(hasNetworkFetcher)
116+
}
117+
106118
@Test
107119
fun `newImageLoader applies custom builder lambda`() {
108120
var customApplied = false

0 commit comments

Comments
 (0)