Commit b9828bfe authored by chenhuaqing's avatar chenhuaqing Committed by hanakeichen

fix test latency

parent 38f8993c
......@@ -34,5 +34,5 @@ class AccVpnService {
}
interface TestLatencyCallback {
fun onLatency(latency: Int)
fun onLatency(latency: Int): Boolean
}
\ No newline at end of file
......@@ -17,8 +17,8 @@ object NetworkAdapter {
var wifiNetwork: Network? = null
var cellularNetwork: Network? = null
var bindNetwork: Network? = null
private var bindNetwork: Network? = null
private val FD_FIELD: Field
val wifiRequest: NetworkRequest = NetworkRequest.Builder()
......
package com.github.shadowsocks.bg
import android.net.Network
import android.os.Build
import com.ccnet.acc.AccVpn
import com.ccnet.acc.NetworkAdapter
import com.github.shadowsocks.Core
......@@ -10,7 +9,6 @@ import com.github.shadowsocks.database.ProfileManager
import com.github.shadowsocks.http.*
import com.github.shadowsocks.preference.DataStore
import com.google.gson.Gson
import com.google.gson.JsonStreamParser
import com.google.gson.reflect.TypeToken
import com.tencent.mmkv.MMKV
import kotlinx.coroutines.*
......@@ -20,8 +18,8 @@ import okhttp3.Request
import okhttp3.RequestBody
import okhttp3.RequestBody.Companion.toRequestBody
import timber.log.Timber
import java.io.File
import java.io.IOException
import java.net.InetAddress
import java.net.InetSocketAddress
import java.net.Socket
import java.security.SecureRandom
......@@ -39,7 +37,7 @@ object AuthManager {
var scheduleAtFixedRate: ScheduledFuture<*>? = null
var scheduleAtFixedRate1: ScheduledFuture<*>? = null
val okHttpClient: OkHttpClient
private val okHttpClient: OkHttpClient
val gson: Gson
val mmkv = MMKV.mmkvWithID("InterProcessKV", MMKV.MULTI_PROCESS_MODE)
......@@ -126,7 +124,7 @@ object AuthManager {
if (data.state != BaseService.State.Connected) {
return
}
NetworkAdapter.initNetworks(Core.deviceStorage)
NetworkAdapter.initNetworks(Core.app)
scheduleAtFixedRate?.cancel(false)
var failedCount: Int = 0
scheduleAtFixedRate = executor.scheduleAtFixedRate({
......@@ -170,16 +168,18 @@ object AuthManager {
val celavg = cellularLatencyList.average().toInt()
if (wifiavg > celavg && wifiavg > 200 && celavg != -1) {
NetworkAdapter.useCellular(Core.deviceStorage)
Timber.d("switch to cellular")
} else if (celavg > wifiavg && wifiavg != -1) {
NetworkAdapter.useWifi(Core.deviceStorage)
Timber.d("switch to wifi")
}
wifiLatencyList.clear()
cellularLatencyList.clear()
}
}
},
20,
20,
1,
1,
TimeUnit.SECONDS
)
}
......@@ -240,9 +240,9 @@ object AuthManager {
var loginAuthToken: String = "1"
val jsonType get() = "application/json; charset=utf-8".toMediaTypeOrNull()
private val jsonType get() = "application/json; charset=utf-8".toMediaTypeOrNull()
inline fun <reified T> postSync(
private inline fun <reified T> postSync(
url: String,
token: String?,
params: Any
......@@ -282,7 +282,61 @@ object AuthManager {
}
return sslContext!!.socketFactory
return AutoSwitchNetworkSocketFactory(sslContext!!.socketFactory)
}
private class AutoSwitchNetworkSocketFactory(private val delegate: SSLSocketFactory) : SSLSocketFactory() {
override fun createSocket(s: Socket?, host: String?, port: Int, autoClose: Boolean): Socket {
val bindNetwork = NetworkAdapter.bindNetwork
val createSocket = delegate.createSocket(s, host, port, autoClose)
bindNetwork?.bindSocket(createSocket)
return createSocket
}
override fun createSocket(host: String?, port: Int): Socket {
val bindNetwork = NetworkAdapter.bindNetwork
return if (bindNetwork != null) {
bindNetwork.socketFactory.createSocket(host, port)
} else {
delegate.createSocket(host, port)
}
}
override fun createSocket(host: String?, port: Int, localHost: InetAddress?, localPort: Int): Socket {
val bindNetwork = NetworkAdapter.bindNetwork
return if (bindNetwork != null) {
bindNetwork.socketFactory.createSocket(host, port, localHost, localPort)
} else {
delegate.createSocket(host, port, localHost, localPort)
}
}
override fun createSocket(host: InetAddress?, port: Int): Socket {
val bindNetwork = NetworkAdapter.bindNetwork
return if (bindNetwork != null) {
bindNetwork.socketFactory.createSocket(host, port)
} else {
delegate.createSocket(host, port)
}
}
override fun createSocket(address: InetAddress?, port: Int, localAddress: InetAddress?, localPort: Int): Socket {
val bindNetwork = NetworkAdapter.bindNetwork
return if (bindNetwork != null) {
bindNetwork.socketFactory.createSocket(address, port, localAddress, localPort)
} else {
delegate.createSocket(address, port, localAddress, localPort)
}
}
override fun getDefaultCipherSuites(): Array<String> {
return delegate.defaultCipherSuites
}
override fun getSupportedCipherSuites(): Array<String> {
return delegate.supportedCipherSuites
}
}
private fun initTrustManager(): X509TrustManager {
......
......@@ -23,6 +23,7 @@ package com.github.shadowsocks.bg
import android.net.LocalSocket
import android.os.SystemClock
import com.ccnet.acc.AccVpnService
import com.ccnet.acc.NetworkAdapter
import com.ccnet.acc.TestLatencyCallback
import com.github.shadowsocks.aidl.TrafficStats
import com.github.shadowsocks.database.ProfileManager
......@@ -72,6 +73,7 @@ class TrafficMonitor(statFile: File?) {
override fun run() {
Timber.d("TrafficMonitor-NativePing prepare test ${DataStore.pingAccHost}:${DataStore.pingAccPort}")
var bindNetwork = NetworkAdapter.bindNetwork
while (running) {
val resultCode = AccVpnService.instance.testLatency(
DataStore.pingProxyServer,
......@@ -80,10 +82,15 @@ class TrafficMonitor(statFile: File?) {
DataStore.pingIntervalSec,
DataStore.pingTimeoutMillis,
object : TestLatencyCallback {
override fun onLatency(latency: Int) {
override fun onLatency(latency: Int): Boolean {
Timber.d("TrafficMonitor-NativeTcpPing test ${current.latency}")
current.latency = latency
dirty = true
val cont = bindNetwork == NetworkAdapter.bindNetwork
if (!cont) {
bindNetwork = NetworkAdapter.bindNetwork
}
return cont
}
}
)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment