Network library changes (#542)
- Allows for http2 - Caches a global instance of kotlinx-serialization `Json` and configures it with a bit more leniency. - Moves okhttp's dependency strings to the .toml file - Switches off logging for release builds
This commit is contained in:
parent
b6e45c976f
commit
bbef43751b
5 changed files with 35 additions and 40 deletions
|
|
@ -216,7 +216,8 @@ dependencies {
|
||||||
implementation(libs.coil)
|
implementation(libs.coil)
|
||||||
|
|
||||||
implementation(platform(libs.network.okhttp.bom))
|
implementation(platform(libs.network.okhttp.bom))
|
||||||
implementation("com.squareup.okhttp3:logging-interceptor")
|
implementation(libs.network.okhttp.logging)
|
||||||
|
implementation(libs.serialization.json)
|
||||||
|
|
||||||
implementation(libs.dagger)
|
implementation(libs.dagger)
|
||||||
kapt(libs.dagger.compiler)
|
kapt(libs.dagger.compiler)
|
||||||
|
|
|
||||||
|
|
@ -104,6 +104,8 @@ squareup_seismic = "com.squareup:seismic:1.0.3"
|
||||||
|
|
||||||
# network
|
# network
|
||||||
network_okhttp_bom = "com.squareup.okhttp3:okhttp-bom:4.11.0"
|
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 = "com.squareup.retrofit2:retrofit:2.9.0"
|
||||||
network_retrofit_converter_serialization = "com.jakewharton.retrofit:retrofit2-kotlinx-serialization-converter:1.0.0"
|
network_retrofit_converter_serialization = "com.jakewharton.retrofit:retrofit2-kotlinx-serialization-converter:1.0.0"
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -31,9 +31,8 @@ dependencies {
|
||||||
implementation(projects.libraries.core)
|
implementation(projects.libraries.core)
|
||||||
implementation(projects.libraries.di)
|
implementation(projects.libraries.di)
|
||||||
implementation(platform(libs.network.okhttp.bom))
|
implementation(platform(libs.network.okhttp.bom))
|
||||||
implementation("com.squareup.okhttp3:okhttp")
|
implementation(libs.network.okhttp)
|
||||||
implementation("com.squareup.okhttp3:logging-interceptor")
|
implementation(libs.network.okhttp.logging)
|
||||||
|
|
||||||
implementation(libs.network.retrofit)
|
implementation(libs.network.retrofit)
|
||||||
implementation(libs.network.retrofit.converter.serialization)
|
implementation(libs.network.retrofit.converter.serialization)
|
||||||
implementation(libs.serialization.json)
|
implementation(libs.serialization.json)
|
||||||
|
|
|
||||||
|
|
@ -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.AppScope
|
||||||
import io.element.android.libraries.di.SingleIn
|
import io.element.android.libraries.di.SingleIn
|
||||||
import io.element.android.libraries.network.interceptors.FormattedJsonHttpLogger
|
import io.element.android.libraries.network.interceptors.FormattedJsonHttpLogger
|
||||||
|
import kotlinx.serialization.json.Json
|
||||||
import okhttp3.OkHttpClient
|
import okhttp3.OkHttpClient
|
||||||
import okhttp3.Protocol
|
|
||||||
import okhttp3.logging.HttpLoggingInterceptor
|
import okhttp3.logging.HttpLoggingInterceptor
|
||||||
import java.util.concurrent.TimeUnit
|
import java.util.concurrent.TimeUnit
|
||||||
|
|
||||||
@Module
|
@Module
|
||||||
@ContributesTo(AppScope::class)
|
@ContributesTo(AppScope::class)
|
||||||
object NetworkModule {
|
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
|
|
||||||
}
|
|
||||||
|
|
||||||
@Provides
|
@Provides
|
||||||
@SingleIn(AppScope::class)
|
@SingleIn(AppScope::class)
|
||||||
fun providesOkHttpClient(
|
fun providesOkHttpClient(
|
||||||
httpLoggingInterceptor: HttpLoggingInterceptor,
|
buildMeta: BuildMeta,
|
||||||
): OkHttpClient {
|
): OkHttpClient = OkHttpClient.Builder().apply {
|
||||||
return OkHttpClient.Builder()
|
connectTimeout(30, TimeUnit.SECONDS)
|
||||||
// workaround for #4669
|
readTimeout(60, TimeUnit.SECONDS)
|
||||||
.protocols(listOf(Protocol.HTTP_1_1))
|
writeTimeout(60, TimeUnit.SECONDS)
|
||||||
.connectTimeout(30, TimeUnit.SECONDS)
|
if (buildMeta.isDebuggable) addInterceptor(providesHttpLoggingInterceptor())
|
||||||
.readTimeout(60, TimeUnit.SECONDS)
|
}.build()
|
||||||
.writeTimeout(60, TimeUnit.SECONDS)
|
|
||||||
.addInterceptor(httpLoggingInterceptor)
|
@Provides
|
||||||
.build()
|
@SingleIn(AppScope::class)
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -17,23 +17,21 @@
|
||||||
package io.element.android.libraries.network
|
package io.element.android.libraries.network
|
||||||
|
|
||||||
import com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory
|
import com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory
|
||||||
import dagger.Lazy
|
|
||||||
import io.element.android.libraries.core.uri.ensureTrailingSlash
|
import io.element.android.libraries.core.uri.ensureTrailingSlash
|
||||||
import kotlinx.serialization.json.Json
|
import kotlinx.serialization.json.Json
|
||||||
import okhttp3.MediaType.Companion.toMediaType
|
import okhttp3.MediaType.Companion.toMediaType
|
||||||
import okhttp3.OkHttpClient
|
import okhttp3.OkHttpClient
|
||||||
import retrofit2.Retrofit
|
import retrofit2.Retrofit
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
import javax.inject.Provider
|
||||||
|
|
||||||
class RetrofitFactory @Inject constructor(
|
class RetrofitFactory @Inject constructor(
|
||||||
private val okHttpClient: Lazy<OkHttpClient>,
|
private val okHttpClient: Provider<OkHttpClient>,
|
||||||
|
private val json: Provider<Json>,
|
||||||
) {
|
) {
|
||||||
fun create(baseUrl: String): Retrofit {
|
fun create(baseUrl: String): Retrofit = Retrofit.Builder()
|
||||||
val contentType = "application/json".toMediaType()
|
.baseUrl(baseUrl.ensureTrailingSlash())
|
||||||
return Retrofit.Builder()
|
.addConverterFactory(json.get().asConverterFactory("application/json".toMediaType()))
|
||||||
.baseUrl(baseUrl.ensureTrailingSlash())
|
.callFactory(okHttpClient.get())
|
||||||
.addConverterFactory(Json.asConverterFactory(contentType))
|
.build()
|
||||||
.callFactory { request -> okHttpClient.get().newCall(request) }
|
|
||||||
.build()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue