refactor(di): migrate OkHttp module to core

This commit is contained in:
Harsh Shandilya 2022-11-13 15:50:10 +05:30
parent b8965902ba
commit 9d41b7e819
No known key found for this signature in database
5 changed files with 13 additions and 15 deletions

View file

@ -13,10 +13,15 @@ plugins {
alias(libs.plugins.anvil)
}
anvil { generateDaggerFactories.set(true) }
android { namespace = "dev.msfjarvis.claw.core" }
dependencies {
api(libs.okhttp.loggingInterceptor)
implementation(projects.diScopes)
implementation(libs.dagger)
implementation(libs.javax.inject)
implementation(libs.napier)
implementation(libs.okhttp.core)
}

View file

@ -0,0 +1,75 @@
/*
* Copyright © 2022 Harsh Shandilya.
* Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at
* https://opensource.org/licenses/MIT.
*/
package dev.msfjarvis.claw.core.injection
import android.content.Context
import android.net.TrafficStats
import com.squareup.anvil.annotations.ContributesTo
import dagger.Binds
import dagger.Module
import dagger.Provides
import dagger.multibindings.IntoSet
import dev.msfjarvis.claw.core.network.DelegatingSocketFactory
import dev.msfjarvis.claw.core.network.NapierLogger
import dev.msfjarvis.claw.core.network.UserAgentInterceptor
import dev.msfjarvis.claw.injection.scopes.AppScope
import java.net.Socket
import javax.net.SocketFactory
import okhttp3.Cache
import okhttp3.Interceptor
import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
@Module
@ContributesTo(AppScope::class)
interface OkHttpModule {
@Binds fun NapierLogger.bindLogger(): HttpLoggingInterceptor.Logger
@Binds @IntoSet fun UserAgentInterceptor.bindUAInterceptor(): Interceptor
companion object {
private const val CACHE_SIZE_MB = 10L * 1024 * 1024
private const val THREAD_STATS_TAG = 0x000090000
@Provides
fun provideCache(context: Context): Cache {
return Cache(context.cacheDir, CACHE_SIZE_MB)
}
@Provides
fun provideSocketFactory(): SocketFactory {
return object : DelegatingSocketFactory(getDefault()) {
override fun configureSocket(socket: Socket): Socket {
TrafficStats.setThreadStatsTag(THREAD_STATS_TAG)
return super.configureSocket(socket)
}
}
}
@Provides
fun provideClient(
cache: Cache,
socketFactory: SocketFactory,
interceptors: Set<@JvmSuppressWildcards Interceptor>,
): OkHttpClient {
return OkHttpClient.Builder()
.apply {
cache(cache)
interceptors.forEach(::addNetworkInterceptor)
socketFactory(socketFactory)
}
.build()
}
@Provides
@IntoSet
fun provideHttpLoggingInterceptor(logger: HttpLoggingInterceptor.Logger): Interceptor {
return HttpLoggingInterceptor(logger).setLevel(HttpLoggingInterceptor.Level.HEADERS)
}
}
}

View file

@ -0,0 +1,57 @@
/*
* Copyright © 2022 Harsh Shandilya.
* Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at
* https://opensource.org/licenses/MIT.
*/
package dev.msfjarvis.claw.core.network
import java.net.InetAddress
import java.net.Socket
import javax.net.SocketFactory
/**
* A [SocketFactory] that delegates calls. Sockets can be configured after creation by overriding
* [configureSocket].
*/
open class DelegatingSocketFactory(private val delegate: SocketFactory) : SocketFactory() {
override fun createSocket(): Socket {
val socket = delegate.createSocket()
return configureSocket(socket)
}
override fun createSocket(host: String, port: Int): Socket {
val socket = delegate.createSocket(host, port)
return configureSocket(socket)
}
override fun createSocket(
host: String,
port: Int,
localAddress: InetAddress,
localPort: Int
): Socket {
val socket = delegate.createSocket(host, port, localAddress, localPort)
return configureSocket(socket)
}
override fun createSocket(host: InetAddress, port: Int): Socket {
val socket = delegate.createSocket(host, port)
return configureSocket(socket)
}
override fun createSocket(
host: InetAddress,
port: Int,
localAddress: InetAddress,
localPort: Int
): Socket {
val socket = delegate.createSocket(host, port, localAddress, localPort)
return configureSocket(socket)
}
open fun configureSocket(socket: Socket): Socket {
// No-op by default.
return socket
}
}

View file

@ -0,0 +1,18 @@
/*
* Copyright © 2022 Harsh Shandilya.
* Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at
* https://opensource.org/licenses/MIT.
*/
package dev.msfjarvis.claw.core.network
import io.github.aakira.napier.Napier
import javax.inject.Inject
import okhttp3.logging.HttpLoggingInterceptor
/** Implementation of [HttpLoggingInterceptor.Logger] backed by [Napier]. */
class NapierLogger @Inject constructor() : HttpLoggingInterceptor.Logger {
override fun log(message: String) {
Napier.d(tag = "LobstersApi") { message }
}
}

View file

@ -0,0 +1,18 @@
/*
* Copyright © 2022 Harsh Shandilya.
* Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at
* https://opensource.org/licenses/MIT.
*/
package dev.msfjarvis.claw.core.network
import javax.inject.Inject
import okhttp3.Interceptor
import okhttp3.Response
/** An OkHttp [Interceptor] that adds a recognizable User-Agent header to all network requests. */
class UserAgentInterceptor @Inject constructor() : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
return chain.proceed(chain.request().newBuilder().header("User-Agent", "Claw-Android").build())
}
}