Skip to content

Commit b85d149

Browse files
authored
Merge pull request #1190 from android/mlykotom/coil-async-init
Coil asynchronous initialization
2 parents 3ff5d48 + d9aaec0 commit b85d149

File tree

7 files changed

+50
-37
lines changed

7 files changed

+50
-37
lines changed

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,14 @@ import com.google.samples.apps.nowinandroid.sync.initializers.Sync
2323
import com.google.samples.apps.nowinandroid.util.ProfileVerifierLogger
2424
import dagger.hilt.android.HiltAndroidApp
2525
import javax.inject.Inject
26-
import javax.inject.Provider
2726

2827
/**
2928
* [Application] class for NiA
3029
*/
3130
@HiltAndroidApp
3231
class NiaApplication : Application(), ImageLoaderFactory {
3332
@Inject
34-
lateinit var imageLoader: Provider<ImageLoader>
33+
lateinit var imageLoader: dagger.Lazy<ImageLoader>
3534

3635
@Inject
3736
lateinit var profileVerifierLogger: ProfileVerifierLogger

build-logic/convention/src/main/kotlin/AndroidFeatureConventionPlugin.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ class AndroidFeatureConventionPlugin : Plugin<Project> {
4444
add("implementation", libs.findLibrary("androidx.hilt.navigation.compose").get())
4545
add("implementation", libs.findLibrary("androidx.lifecycle.runtimeCompose").get())
4646
add("implementation", libs.findLibrary("androidx.lifecycle.viewModelCompose").get())
47+
48+
add("implementation", libs.findLibrary("androidx.tracing.ktx").get())
4749
}
4850
}
4951
}

build-logic/convention/src/main/kotlin/AndroidLibraryConventionPlugin.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import com.google.samples.apps.nowinandroid.configureGradleManagedDevices
2121
import com.google.samples.apps.nowinandroid.configureKotlinAndroid
2222
import com.google.samples.apps.nowinandroid.configurePrintApksTask
2323
import com.google.samples.apps.nowinandroid.disableUnnecessaryAndroidTests
24+
import com.google.samples.apps.nowinandroid.libs
2425
import org.gradle.api.Plugin
2526
import org.gradle.api.Project
2627
import org.gradle.kotlin.dsl.configure
@@ -51,6 +52,8 @@ class AndroidLibraryConventionPlugin : Plugin<Project> {
5152
}
5253
dependencies {
5354
add("testImplementation", kotlin("test"))
55+
56+
add("implementation", libs.findLibrary("androidx.tracing.ktx").get())
5457
}
5558
}
5659
}

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

Lines changed: 28 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package com.google.samples.apps.nowinandroid.core.network.di
1818

1919
import android.content.Context
20+
import androidx.tracing.trace
2021
import coil.ImageLoader
2122
import coil.decode.SvgDecoder
2223
import coil.util.DebugLogger
@@ -51,16 +52,18 @@ internal object NetworkModule {
5152

5253
@Provides
5354
@Singleton
54-
fun okHttpCallFactory(): Call.Factory = OkHttpClient.Builder()
55-
.addInterceptor(
56-
HttpLoggingInterceptor()
57-
.apply {
58-
if (BuildConfig.DEBUG) {
59-
setLevel(HttpLoggingInterceptor.Level.BODY)
60-
}
61-
},
62-
)
63-
.build()
55+
fun okHttpCallFactory(): Call.Factory = trace("NiaOkHttpClient") {
56+
OkHttpClient.Builder()
57+
.addInterceptor(
58+
HttpLoggingInterceptor()
59+
.apply {
60+
if (BuildConfig.DEBUG) {
61+
setLevel(HttpLoggingInterceptor.Level.BODY)
62+
}
63+
},
64+
)
65+
.build()
66+
}
6467

6568
/**
6669
* Since we're displaying SVGs in the app, Coil needs an ImageLoader which supports this
@@ -72,20 +75,21 @@ internal object NetworkModule {
7275
@Provides
7376
@Singleton
7477
fun imageLoader(
75-
okHttpCallFactory: Call.Factory,
78+
// We specifically request dagger.Lazy here, so that it's not instantiated from Dagger.
79+
okHttpCallFactory: dagger.Lazy<Call.Factory>,
7680
@ApplicationContext application: Context,
77-
): ImageLoader = ImageLoader.Builder(application)
78-
.callFactory(okHttpCallFactory)
79-
.components {
80-
add(SvgDecoder.Factory())
81-
}
82-
// Assume most content images are versioned urls
83-
// but some problematic images are fetching each time
84-
.respectCacheHeaders(false)
85-
.apply {
86-
if (BuildConfig.DEBUG) {
87-
logger(DebugLogger())
81+
): ImageLoader = trace("NiaImageLoader") {
82+
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)
88+
.apply {
89+
if (BuildConfig.DEBUG) {
90+
logger(DebugLogger())
91+
}
8892
}
89-
}
90-
.build()
93+
.build()
94+
}
9195
}

core/network/src/main/kotlin/com/google/samples/apps/nowinandroid/core/network/retrofit/RetrofitNiaNetwork.kt

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package com.google.samples.apps.nowinandroid.core.network.retrofit
1818

19+
import androidx.tracing.trace
1920
import com.google.samples.apps.nowinandroid.core.network.BuildConfig
2021
import com.google.samples.apps.nowinandroid.core.network.NiaNetworkDataSource
2122
import com.google.samples.apps.nowinandroid.core.network.model.NetworkChangeList
@@ -73,17 +74,21 @@ private data class NetworkResponse<T>(
7374
@Singleton
7475
internal class RetrofitNiaNetwork @Inject constructor(
7576
networkJson: Json,
76-
okhttpCallFactory: Call.Factory,
77+
okhttpCallFactory: dagger.Lazy<Call.Factory>,
7778
) : NiaNetworkDataSource {
7879

79-
private val networkApi = Retrofit.Builder()
80-
.baseUrl(NIA_BASE_URL)
81-
.callFactory(okhttpCallFactory)
82-
.addConverterFactory(
83-
networkJson.asConverterFactory("application/json".toMediaType()),
84-
)
85-
.build()
86-
.create(RetrofitNiaNetworkApi::class.java)
80+
private val networkApi = trace("RetrofitNiaNetwork") {
81+
Retrofit.Builder()
82+
.baseUrl(NIA_BASE_URL)
83+
// We use callFactory lambda here with dagger.Lazy<Call.Factory>
84+
// to prevent initializing OkHttp on the main thread.
85+
.callFactory { okhttpCallFactory.get().newCall(it) }
86+
.addConverterFactory(
87+
networkJson.asConverterFactory("application/json".toMediaType()),
88+
)
89+
.build()
90+
.create(RetrofitNiaNetworkApi::class.java)
91+
}
8792

8893
override suspend fun getTopics(ids: List<String>?): List<NetworkTopic> =
8994
networkApi.getTopics(ids = ids).data

feature/foryou/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/foryou/ForYouScreen.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ import androidx.compose.ui.tooling.preview.PreviewParameter
8181
import androidx.compose.ui.unit.dp
8282
import androidx.compose.ui.unit.max
8383
import androidx.compose.ui.unit.sp
84-
import androidx.compose.ui.util.trace
84+
import androidx.tracing.trace
8585
import androidx.hilt.navigation.compose.hiltViewModel
8686
import androidx.lifecycle.compose.collectAsStateWithLifecycle
8787
import com.google.accompanist.permissions.ExperimentalPermissionsApi

gradle/libs.versions.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ androidxTestCore = "1.5.0"
2424
androidxTestExt = "1.1.5"
2525
androidxTestRules = "1.5.0"
2626
androidxTestRunner = "1.5.2"
27-
androidxTracing = "1.1.0"
27+
androidxTracing = "1.3.0-alpha02"
2828
androidxUiAutomator = "2.2.0"
2929
androidxWindowManager = "1.2.0"
3030
androidxWork = "2.9.0"

0 commit comments

Comments
 (0)