Skip to content

Commit d859b3c

Browse files
committed
Migrate from coil2 to coil3
- Use BOM platform dependency. - Remove -kt suffix from dependency name has they serve no real purpose. - Add `coil-network` artifact to configure `CallFactory`. - Although "First party Decoder" `SvgDecoder` is now automatically added to each new ImageLoader through a service loader, keeping it in code prevents us from removing the dependency that would appear unused otherwise. - Replace explicit `respectCacheHeaders(false)` with `CacheStrategy::DEFAULT` which does not respect cache-control headers. - Migrate `ImageLoaderFactory` to `SingletonImageLoader.Factory` - Inline TOML dependencies (see android#1856) docs: https://coil-kt.github.io/coil/upgrading_to_coil3/
1 parent 689ef92 commit d859b3c

File tree

11 files changed

+123
-56
lines changed

11 files changed

+123
-56
lines changed

app-nia-catalog/dependencies/releaseRuntimeClasspath.txt

Lines changed: 40 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ androidx.activity:activity:1.9.3
44
androidx.annotation:annotation-experimental:1.4.1
55
androidx.annotation:annotation-jvm:1.9.1
66
androidx.annotation:annotation:1.9.1
7-
androidx.appcompat:appcompat-resources:1.6.1
7+
androidx.appcompat:appcompat-resources:1.7.0
88
androidx.arch.core:core-common:2.2.0
99
androidx.arch.core:core-runtime:2.2.0
1010
androidx.autofill:autofill:1.0.0
@@ -52,8 +52,8 @@ androidx.compose.ui:ui-util:1.8.0-beta02
5252
androidx.compose.ui:ui:1.8.0-beta02
5353
androidx.compose:compose-bom-alpha:2025.02.00
5454
androidx.concurrent:concurrent-futures:1.1.0
55-
androidx.core:core-ktx:1.13.1
56-
androidx.core:core:1.13.1
55+
androidx.core:core-ktx:1.15.0
56+
androidx.core:core:1.15.0
5757
androidx.customview:customview-poolingcontainer:1.0.0
5858
androidx.customview:customview:1.0.0
5959
androidx.emoji2:emoji2:1.4.0
@@ -82,7 +82,7 @@ androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.7
8282
androidx.lifecycle:lifecycle-viewmodel:2.8.7
8383
androidx.loader:loader:1.0.0
8484
androidx.metrics:metrics-performance:1.0.0-beta01
85-
androidx.profileinstaller:profileinstaller:1.4.0
85+
androidx.profileinstaller:profileinstaller:1.4.1
8686
androidx.savedstate:savedstate-ktx:1.2.1
8787
androidx.savedstate:savedstate:1.2.1
8888
androidx.startup:startup-runtime:1.1.1
@@ -96,30 +96,52 @@ androidx.window.extensions.core:core:1.0.0
9696
androidx.window:window-core-android:1.3.0
9797
androidx.window:window-core:1.3.0
9898
androidx.window:window:1.3.0
99-
com.google.accompanist:accompanist-drawablepainter:0.32.0
99+
com.google.accompanist:accompanist-drawablepainter:0.36.0
100100
com.google.code.findbugs:jsr305:3.0.2
101101
com.google.dagger:dagger-lint-aar:2.56
102102
com.google.dagger:dagger:2.56
103103
com.google.dagger:hilt-android:2.56
104104
com.google.dagger:hilt-core:2.56
105105
com.google.guava:listenablefuture:1.0
106-
com.squareup.okhttp3:okhttp:4.12.0
107-
com.squareup.okio:okio-jvm:3.9.0
108-
com.squareup.okio:okio:3.9.0
109-
io.coil-kt:coil-base:2.7.0
110-
io.coil-kt:coil-compose-base:2.7.0
111-
io.coil-kt:coil-compose:2.7.0
112-
io.coil-kt:coil:2.7.0
106+
com.squareup.okio:okio-jvm:3.10.2
107+
com.squareup.okio:okio:3.10.2
108+
io.coil-kt.coil3:coil-android:3.1.0
109+
io.coil-kt.coil3:coil-bom:3.1.0
110+
io.coil-kt.coil3:coil-compose-android:3.1.0
111+
io.coil-kt.coil3:coil-compose-core-android:3.1.0
112+
io.coil-kt.coil3:coil-compose-core:3.1.0
113+
io.coil-kt.coil3:coil-compose:3.1.0
114+
io.coil-kt.coil3:coil-core-android:3.1.0
115+
io.coil-kt.coil3:coil-core:3.1.0
116+
io.coil-kt.coil3:coil:3.1.0
113117
jakarta.inject:jakarta.inject-api:2.0.1
114118
javax.inject:javax.inject:1
119+
org.jetbrains.androidx.lifecycle:lifecycle-common:2.8.4
120+
org.jetbrains.androidx.lifecycle:lifecycle-runtime-compose:2.8.4
121+
org.jetbrains.androidx.lifecycle:lifecycle-runtime:2.8.4
122+
org.jetbrains.androidx.lifecycle:lifecycle-viewmodel:2.8.4
123+
org.jetbrains.compose.animation:animation-core:1.7.3
124+
org.jetbrains.compose.animation:animation:1.7.3
125+
org.jetbrains.compose.annotation-internal:annotation:1.7.3
126+
org.jetbrains.compose.collection-internal:collection:1.7.3
127+
org.jetbrains.compose.foundation:foundation-layout:1.7.3
128+
org.jetbrains.compose.foundation:foundation:1.7.3
129+
org.jetbrains.compose.runtime:runtime-saveable:1.7.3
130+
org.jetbrains.compose.runtime:runtime:1.7.3
131+
org.jetbrains.compose.ui:ui-geometry:1.7.3
132+
org.jetbrains.compose.ui:ui-graphics:1.7.3
133+
org.jetbrains.compose.ui:ui-text:1.7.3
134+
org.jetbrains.compose.ui:ui-unit:1.7.3
135+
org.jetbrains.compose.ui:ui-util:1.7.3
136+
org.jetbrains.compose.ui:ui:1.7.3
115137
org.jetbrains.kotlin:kotlin-stdlib-common:2.1.10
116-
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.0
117-
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0
118138
org.jetbrains.kotlin:kotlin-stdlib:2.1.10
119-
org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.1
120-
org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.8.1
121-
org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.8.1
122-
org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.1
139+
org.jetbrains.kotlinx:atomicfu-jvm:0.23.2
140+
org.jetbrains.kotlinx:atomicfu:0.23.2
141+
org.jetbrains.kotlinx:kotlinx-coroutines-android:1.10.1
142+
org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.1
143+
org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.1
144+
org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.1
123145
org.jetbrains.kotlinx:kotlinx-datetime-jvm:0.6.1
124146
org.jetbrains.kotlinx:kotlinx-datetime:0.6.1
125147
org.jetbrains:annotations:23.0.0

app/build.gradle.kts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,8 @@ dependencies {
101101
implementation(libs.androidx.tracing.ktx)
102102
implementation(libs.androidx.window.core)
103103
implementation(libs.kotlinx.coroutines.guava)
104-
implementation(libs.coil.kt)
104+
implementation(platform(libs.coil.bom))
105+
implementation(libs.coil)
105106
implementation(libs.kotlinx.serialization.json)
106107

107108
ksp(libs.hilt.compiler)

app/dependencies/prodReleaseRuntimeClasspath.txt

Lines changed: 40 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ androidx.window:window:1.3.0
147147
androidx.work:work-runtime-ktx:2.10.0
148148
androidx.work:work-runtime:2.10.0
149149
com.caverock:androidsvg-aar:1.4
150-
com.google.accompanist:accompanist-drawablepainter:0.32.0
150+
com.google.accompanist:accompanist-drawablepainter:0.36.0
151151
com.google.accompanist:accompanist-permissions:0.37.0
152152
com.google.android.datatransport:transport-api:3.2.0
153153
com.google.android.datatransport:transport-backend-cct:3.3.0
@@ -200,24 +200,54 @@ com.google.protobuf:protobuf-javalite:4.29.2
200200
com.google.protobuf:protobuf-kotlin-lite:4.29.2
201201
com.squareup.okhttp3:logging-interceptor:4.12.0
202202
com.squareup.okhttp3:okhttp:4.12.0
203-
com.squareup.okio:okio-jvm:3.9.0
204-
com.squareup.okio:okio:3.9.0
203+
com.squareup.okio:okio-jvm:3.10.2
204+
com.squareup.okio:okio:3.10.2
205205
com.squareup.retrofit2:converter-kotlinx-serialization:2.11.0
206206
com.squareup.retrofit2:retrofit:2.11.0
207-
io.coil-kt:coil-base:2.7.0
208-
io.coil-kt:coil-compose-base:2.7.0
209-
io.coil-kt:coil-compose:2.7.0
210-
io.coil-kt:coil-svg:2.7.0
211-
io.coil-kt:coil:2.7.0
207+
io.coil-kt.coil3:coil-android:3.1.0
208+
io.coil-kt.coil3:coil-bom:3.1.0
209+
io.coil-kt.coil3:coil-compose-android:3.1.0
210+
io.coil-kt.coil3:coil-compose-core-android:3.1.0
211+
io.coil-kt.coil3:coil-compose-core:3.1.0
212+
io.coil-kt.coil3:coil-compose:3.1.0
213+
io.coil-kt.coil3:coil-core-android:3.1.0
214+
io.coil-kt.coil3:coil-core:3.1.0
215+
io.coil-kt.coil3:coil-network-core-android:3.1.0
216+
io.coil-kt.coil3:coil-network-core:3.1.0
217+
io.coil-kt.coil3:coil-network-okhttp-jvm:3.1.0
218+
io.coil-kt.coil3:coil-network-okhttp:3.1.0
219+
io.coil-kt.coil3:coil-svg-android:3.1.0
220+
io.coil-kt.coil3:coil-svg:3.1.0
221+
io.coil-kt.coil3:coil:3.1.0
212222
jakarta.inject:jakarta.inject-api:2.0.1
213223
javax.inject:javax.inject:1
214224
org.checkerframework:checker-qual:3.12.0
225+
org.jetbrains.androidx.lifecycle:lifecycle-common:2.8.4
226+
org.jetbrains.androidx.lifecycle:lifecycle-runtime-compose:2.8.4
227+
org.jetbrains.androidx.lifecycle:lifecycle-runtime:2.8.4
228+
org.jetbrains.androidx.lifecycle:lifecycle-viewmodel:2.8.4
229+
org.jetbrains.compose.animation:animation-core:1.7.3
230+
org.jetbrains.compose.animation:animation:1.7.3
231+
org.jetbrains.compose.annotation-internal:annotation:1.7.3
232+
org.jetbrains.compose.collection-internal:collection:1.7.3
233+
org.jetbrains.compose.foundation:foundation-layout:1.7.3
234+
org.jetbrains.compose.foundation:foundation:1.7.3
235+
org.jetbrains.compose.runtime:runtime-saveable:1.7.3
236+
org.jetbrains.compose.runtime:runtime:1.7.3
237+
org.jetbrains.compose.ui:ui-geometry:1.7.3
238+
org.jetbrains.compose.ui:ui-graphics:1.7.3
239+
org.jetbrains.compose.ui:ui-text:1.7.3
240+
org.jetbrains.compose.ui:ui-unit:1.7.3
241+
org.jetbrains.compose.ui:ui-util:1.7.3
242+
org.jetbrains.compose.ui:ui:1.7.3
215243
org.jetbrains.kotlin:kotlin-android-extensions-runtime:1.9.22
216244
org.jetbrains.kotlin:kotlin-parcelize-runtime:1.9.22
217245
org.jetbrains.kotlin:kotlin-stdlib-common:2.1.10
218-
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.0
219-
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0
246+
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.22
247+
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.22
220248
org.jetbrains.kotlin:kotlin-stdlib:2.1.10
249+
org.jetbrains.kotlinx:atomicfu-jvm:0.23.2
250+
org.jetbrains.kotlinx:atomicfu:0.23.2
221251
org.jetbrains.kotlinx:kotlinx-coroutines-android:1.10.1
222252
org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.1
223253
org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.1

app/src/main/kotlin/com/google/samples/apps/nowinandroid/NiaApplication.kt

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,9 @@ import android.app.Application
2020
import android.content.pm.ApplicationInfo
2121
import android.os.StrictMode
2222
import android.os.StrictMode.ThreadPolicy.Builder
23-
import coil.ImageLoader
24-
import coil.ImageLoaderFactory
23+
import coil3.ImageLoader
24+
import coil3.PlatformContext
25+
import coil3.SingletonImageLoader
2526
import com.google.samples.apps.nowinandroid.sync.initializers.Sync
2627
import com.google.samples.apps.nowinandroid.util.ProfileVerifierLogger
2728
import dagger.hilt.android.HiltAndroidApp
@@ -31,7 +32,7 @@ import javax.inject.Inject
3132
* [Application] class for NiA
3233
*/
3334
@HiltAndroidApp
34-
class NiaApplication : Application(), ImageLoaderFactory {
35+
class NiaApplication : Application(), SingletonImageLoader.Factory {
3536
@Inject
3637
lateinit var imageLoader: dagger.Lazy<ImageLoader>
3738

@@ -48,7 +49,7 @@ class NiaApplication : Application(), ImageLoaderFactory {
4849
profileVerifierLogger()
4950
}
5051

51-
override fun newImageLoader(): ImageLoader = imageLoader.get()
52+
override fun newImageLoader(context: PlatformContext): ImageLoader = imageLoader.get()
5253

5354
/**
5455
* Return true if the application is debuggable.

core/designsystem/build.gradle.kts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@ dependencies {
3636
api(libs.androidx.compose.runtime)
3737
api(libs.androidx.compose.ui.util)
3838

39-
implementation(libs.coil.kt.compose)
39+
implementation(platform(libs.coil.bom))
40+
implementation(libs.coil.compose)
4041

4142
testImplementation(libs.androidx.compose.ui.test)
4243
testImplementation(libs.androidx.compose.ui.testManifest)

core/designsystem/src/main/kotlin/com/google/samples/apps/nowinandroid/core/designsystem/component/DynamicAsyncImage.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,10 @@ import androidx.compose.ui.layout.ContentScale
3535
import androidx.compose.ui.platform.LocalInspectionMode
3636
import androidx.compose.ui.res.painterResource
3737
import androidx.compose.ui.unit.dp
38-
import coil.compose.AsyncImage
39-
import coil.compose.AsyncImagePainter.State.Error
40-
import coil.compose.AsyncImagePainter.State.Loading
41-
import coil.compose.rememberAsyncImagePainter
38+
import coil3.compose.AsyncImage
39+
import coil3.compose.AsyncImagePainter.State.Error
40+
import coil3.compose.AsyncImagePainter.State.Loading
41+
import coil3.compose.rememberAsyncImagePainter
4242
import com.google.samples.apps.nowinandroid.core.designsystem.R
4343
import com.google.samples.apps.nowinandroid.core.designsystem.theme.LocalTintTheme
4444

core/network/build.gradle.kts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,9 @@ dependencies {
4343
api(projects.core.common)
4444
api(projects.core.model)
4545

46-
implementation(libs.coil.kt)
47-
implementation(libs.coil.kt.svg)
46+
implementation(platform(libs.coil.bom))
47+
implementation(libs.coil.network)
48+
implementation(libs.coil.svg)
4849
implementation(libs.kotlinx.serialization.json)
4950
implementation(libs.okhttp.logging)
5051
implementation(libs.retrofit.core)

core/network/src/main/kotlin/com/google/samples/apps/nowinandroid/core/network/di/NetworkModule.kt

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,12 @@ package com.google.samples.apps.nowinandroid.core.network.di
1818

1919
import android.content.Context
2020
import androidx.tracing.trace
21-
import coil.ImageLoader
22-
import coil.decode.SvgDecoder
23-
import coil.util.DebugLogger
21+
import coil3.ImageLoader
22+
import coil3.annotation.ExperimentalCoilApi
23+
import coil3.network.CacheStrategy
24+
import coil3.network.okhttp.OkHttpNetworkFetcherFactory
25+
import coil3.svg.SvgDecoder
26+
import coil3.util.DebugLogger
2427
import com.google.samples.apps.nowinandroid.core.network.BuildConfig
2528
import com.google.samples.apps.nowinandroid.core.network.demo.DemoAssetManager
2629
import dagger.Module
@@ -80,11 +83,18 @@ internal object NetworkModule {
8083
@ApplicationContext application: Context,
8184
): ImageLoader = trace("NiaImageLoader") {
8285
ImageLoader.Builder(application)
83-
.callFactory { okHttpCallFactory.get() }
84-
.components { add(SvgDecoder.Factory()) }
85-
// Assume most content images are versioned urls
86-
// but some problematic images are fetching each time
87-
.respectCacheHeaders(false)
86+
.components {
87+
add(
88+
@OptIn(ExperimentalCoilApi::class)
89+
OkHttpNetworkFetcherFactory(
90+
callFactory = okHttpCallFactory::get,
91+
// Assume most content images are versioned urls
92+
// but some problematic images are fetching each time
93+
cacheStrategy = CacheStrategy::DEFAULT,
94+
),
95+
)
96+
add(SvgDecoder.Factory())
97+
}
8898
.apply {
8999
if (BuildConfig.DEBUG) {
90100
logger(DebugLogger())

core/ui/build.gradle.kts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ dependencies {
3030
api(projects.core.model)
3131

3232
implementation(libs.androidx.browser)
33-
implementation(libs.coil.kt)
34-
implementation(libs.coil.kt.compose)
33+
implementation(platform(libs.coil.bom))
34+
implementation(libs.coil.compose)
3535

3636
androidTestImplementation(libs.bundles.androidx.compose.ui.test)
3737
androidTestImplementation(projects.core.testing)

core/ui/src/main/kotlin/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCard.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,8 @@ import androidx.compose.ui.semantics.semantics
6464
import androidx.compose.ui.tooling.preview.Preview
6565
import androidx.compose.ui.tooling.preview.PreviewParameter
6666
import androidx.compose.ui.unit.dp
67-
import coil.compose.AsyncImagePainter
68-
import coil.compose.rememberAsyncImagePainter
67+
import coil3.compose.AsyncImagePainter
68+
import coil3.compose.rememberAsyncImagePainter
6969
import com.google.samples.apps.nowinandroid.core.designsystem.R.drawable
7070
import com.google.samples.apps.nowinandroid.core.designsystem.component.NiaIconToggleButton
7171
import com.google.samples.apps.nowinandroid.core.designsystem.component.NiaTopicTag

0 commit comments

Comments
 (0)