From d8332d6b90a6c7910237020b068f3d8f68b42f59 Mon Sep 17 00:00:00 2001 From: Harsh Shandilya Date: Sat, 6 Aug 2022 00:58:57 +0530 Subject: [PATCH] android: fix most untagged OkHttp sockets --- .../claw/android/injection/OkHttpModule.kt | 16 ++++++ .../network/DelegatingSocketFactory.kt | 51 +++++++++++++++++++ 2 files changed, 67 insertions(+) create mode 100644 android/src/main/kotlin/dev/msfjarvis/claw/android/network/DelegatingSocketFactory.kt diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/injection/OkHttpModule.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/injection/OkHttpModule.kt index e3b6ea9c..54a65f9f 100644 --- a/android/src/main/kotlin/dev/msfjarvis/claw/android/injection/OkHttpModule.kt +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/injection/OkHttpModule.kt @@ -1,12 +1,16 @@ package dev.msfjarvis.claw.android.injection import android.content.Context +import android.net.TrafficStats import dagger.Module import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.components.SingletonComponent import dagger.multibindings.IntoSet +import dev.msfjarvis.claw.android.network.DelegatingSocketFactory +import java.net.Socket +import javax.net.SocketFactory import okhttp3.Cache import okhttp3.Interceptor import okhttp3.OkHttpClient @@ -20,15 +24,27 @@ object OkHttpModule { return Cache(context.cacheDir, 10 * 1024 * 1024) } + @Provides + fun provideSocketFactory(): SocketFactory { + return object : DelegatingSocketFactory(getDefault()) { + override fun configureSocket(socket: Socket): Socket { + TrafficStats.setThreadStatsTag(0x000090000) + 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() } diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/network/DelegatingSocketFactory.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/network/DelegatingSocketFactory.kt new file mode 100644 index 00000000..55c1d974 --- /dev/null +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/network/DelegatingSocketFactory.kt @@ -0,0 +1,51 @@ +package dev.msfjarvis.claw.android.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 + } +}