diff --git a/app/build.gradle.kts b/app/build.gradle.kts index b355d840c41..68df90b408b 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -216,7 +216,8 @@ dependencies { implementation(libs.coil) implementation(platform(libs.network.okhttp.bom)) - implementation("com.squareup.okhttp3:logging-interceptor") + implementation(libs.network.okhttp.logging) + implementation(libs.serialization.json) implementation(libs.dagger) kapt(libs.dagger.compiler) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index ff849d62851..0be42b9bdd2 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -104,6 +104,8 @@ squareup_seismic = "com.squareup:seismic:1.0.3" # network network_okhttp_bom = "com.squareup.okhttp3:okhttp-bom:4.11.0" +network_okhttp_logging = { module = "com.squareup.okhttp3:logging-interceptor" } +network_okhttp = { module = "com.squareup.okhttp3:okhttp" } network_retrofit = "com.squareup.retrofit2:retrofit:2.9.0" network_retrofit_converter_serialization = "com.jakewharton.retrofit:retrofit2-kotlinx-serialization-converter:1.0.0" diff --git a/libraries/network/build.gradle.kts b/libraries/network/build.gradle.kts index 29724e8e46a..e133f94ba1d 100644 --- a/libraries/network/build.gradle.kts +++ b/libraries/network/build.gradle.kts @@ -31,9 +31,8 @@ dependencies { implementation(projects.libraries.core) implementation(projects.libraries.di) implementation(platform(libs.network.okhttp.bom)) - implementation("com.squareup.okhttp3:okhttp") - implementation("com.squareup.okhttp3:logging-interceptor") - + implementation(libs.network.okhttp) + implementation(libs.network.okhttp.logging) implementation(libs.network.retrofit) implementation(libs.network.retrofit.converter.serialization) implementation(libs.serialization.json) diff --git a/libraries/network/src/main/kotlin/io/element/android/libraries/network/NetworkModule.kt b/libraries/network/src/main/kotlin/io/element/android/libraries/network/NetworkModule.kt index 07a039e248c..52c04e6717e 100644 --- a/libraries/network/src/main/kotlin/io/element/android/libraries/network/NetworkModule.kt +++ b/libraries/network/src/main/kotlin/io/element/android/libraries/network/NetworkModule.kt @@ -23,41 +23,36 @@ import io.element.android.libraries.core.meta.BuildMeta import io.element.android.libraries.di.AppScope import io.element.android.libraries.di.SingleIn import io.element.android.libraries.network.interceptors.FormattedJsonHttpLogger +import kotlinx.serialization.json.Json import okhttp3.OkHttpClient -import okhttp3.Protocol import okhttp3.logging.HttpLoggingInterceptor import java.util.concurrent.TimeUnit @Module @ContributesTo(AppScope::class) object NetworkModule { - @Provides - @JvmStatic - fun providesHttpLoggingInterceptor(buildMeta: BuildMeta): HttpLoggingInterceptor { - val loggingLevel = if (buildMeta.isDebuggable) { - HttpLoggingInterceptor.Level.BODY - } else { - HttpLoggingInterceptor.Level.BASIC - } - val logger = FormattedJsonHttpLogger(loggingLevel) - val interceptor = HttpLoggingInterceptor(logger) - interceptor.level = loggingLevel - return interceptor - } + @SingleIn(AppScope::class) + fun providesOkHttpClient( + buildMeta: BuildMeta, + ): OkHttpClient = OkHttpClient.Builder().apply { + connectTimeout(30, TimeUnit.SECONDS) + readTimeout(60, TimeUnit.SECONDS) + writeTimeout(60, TimeUnit.SECONDS) + if (buildMeta.isDebuggable) addInterceptor(providesHttpLoggingInterceptor()) + }.build() @Provides @SingleIn(AppScope::class) - fun providesOkHttpClient( - httpLoggingInterceptor: HttpLoggingInterceptor, - ): OkHttpClient { - return OkHttpClient.Builder() - // workaround for #4669 - .protocols(listOf(Protocol.HTTP_1_1)) - .connectTimeout(30, TimeUnit.SECONDS) - .readTimeout(60, TimeUnit.SECONDS) - .writeTimeout(60, TimeUnit.SECONDS) - .addInterceptor(httpLoggingInterceptor) - .build() + fun providesJson(): Json = Json { + ignoreUnknownKeys = true } } + +private fun providesHttpLoggingInterceptor(): HttpLoggingInterceptor { + val loggingLevel = HttpLoggingInterceptor.Level.BODY + val logger = FormattedJsonHttpLogger(loggingLevel) + val interceptor = HttpLoggingInterceptor(logger) + interceptor.level = loggingLevel + return interceptor +} diff --git a/libraries/network/src/main/kotlin/io/element/android/libraries/network/RetrofitFactory.kt b/libraries/network/src/main/kotlin/io/element/android/libraries/network/RetrofitFactory.kt index 86531d36803..3873101c97c 100644 --- a/libraries/network/src/main/kotlin/io/element/android/libraries/network/RetrofitFactory.kt +++ b/libraries/network/src/main/kotlin/io/element/android/libraries/network/RetrofitFactory.kt @@ -17,23 +17,21 @@ package io.element.android.libraries.network import com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory -import dagger.Lazy import io.element.android.libraries.core.uri.ensureTrailingSlash import kotlinx.serialization.json.Json import okhttp3.MediaType.Companion.toMediaType import okhttp3.OkHttpClient import retrofit2.Retrofit import javax.inject.Inject +import javax.inject.Provider class RetrofitFactory @Inject constructor( - private val okHttpClient: Lazy, + private val okHttpClient: Provider, + private val json: Provider, ) { - fun create(baseUrl: String): Retrofit { - val contentType = "application/json".toMediaType() - return Retrofit.Builder() - .baseUrl(baseUrl.ensureTrailingSlash()) - .addConverterFactory(Json.asConverterFactory(contentType)) - .callFactory { request -> okHttpClient.get().newCall(request) } - .build() - } + fun create(baseUrl: String): Retrofit = Retrofit.Builder() + .baseUrl(baseUrl.ensureTrailingSlash()) + .addConverterFactory(json.get().asConverterFactory("application/json".toMediaType())) + .callFactory(okHttpClient.get()) + .build() }