Refactor: refactor network observer

This commit is contained in:
kr328 2021-11-14 20:33:25 +08:00
parent 48a9ab313e
commit 73550164a8
2 changed files with 18 additions and 34 deletions

View File

@ -1,5 +1,6 @@
package com.github.kr328.clash.service package com.github.kr328.clash.service
import android.annotation.TargetApi
import android.app.PendingIntent import android.app.PendingIntent
import android.content.Intent import android.content.Intent
import android.net.ProxyInfo import android.net.ProxyInfo
@ -62,7 +63,7 @@ class TunService : VpnService(), CoroutineScope by CoroutineScope(Dispatchers.De
true true
} }
network.onEvent { e -> network.onEvent { e ->
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) { if (Build.VERSION.SDK_INT in 22..28) @TargetApi(22) {
setUnderlyingNetworks(e.network?.let { arrayOf(it) }) setUnderlyingNetworks(e.network?.let { arrayOf(it) })
} }
@ -182,12 +183,12 @@ class TunService : VpnService(), CoroutineScope by CoroutineScope(Dispatchers.De
) )
// Metered // Metered
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { if (Build.VERSION.SDK_INT >= 29) {
setMetered(false) setMetered(false)
} }
// System Proxy // System Proxy
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q && store.systemProxy) { if (Build.VERSION.SDK_INT >= 29 && store.systemProxy) {
listenHttp()?.let { listenHttp()?.let {
setHttpProxy( setHttpProxy(
ProxyInfo.buildDirectProxy( ProxyInfo.buildDirectProxy(

View File

@ -1,6 +1,5 @@
package com.github.kr328.clash.service.clash.module package com.github.kr328.clash.service.clash.module
import android.annotation.TargetApi
import android.app.Service import android.app.Service
import android.net.* import android.net.*
import android.os.Build import android.os.Build
@ -10,9 +9,7 @@ import com.github.kr328.clash.core.Clash
import com.github.kr328.clash.service.util.resolveDns import com.github.kr328.clash.service.util.resolveDns
import kotlinx.coroutines.NonCancellable import kotlinx.coroutines.NonCancellable
import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.delay
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import java.util.concurrent.TimeUnit
class NetworkObserveModule(service: Service) : class NetworkObserveModule(service: Service) :
Module<NetworkObserveModule.NetworkChanged>(service) { Module<NetworkObserveModule.NetworkChanged>(service) {
@ -21,8 +18,19 @@ class NetworkObserveModule(service: Service) :
private val connectivity = service.getSystemService<ConnectivityManager>()!! private val connectivity = service.getSystemService<ConnectivityManager>()!!
private val networks: Channel<Network?> = Channel(Channel.CONFLATED) private val networks: Channel<Network?> = Channel(Channel.CONFLATED)
private val request = NetworkRequest.Builder().apply { private val request = NetworkRequest.Builder().apply {
addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
addTransportType(NetworkCapabilities.TRANSPORT_BLUETOOTH)
addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
addTransportType(NetworkCapabilities.TRANSPORT_ETHERNET)
addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN)
addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED) addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)
if (Build.VERSION.SDK_INT >= 26)
addTransportType(NetworkCapabilities.TRANSPORT_WIFI_AWARE)
if (Build.VERSION.SDK_INT >= 27)
addTransportType(NetworkCapabilities.TRANSPORT_LOWPAN)
if (Build.VERSION.SDK_INT >= 31)
addTransportType(NetworkCapabilities.TRANSPORT_USB)
if (Build.VERSION.SDK_INT == 23) { // workarounds for OEM bugs if (Build.VERSION.SDK_INT == 23) { // workarounds for OEM bugs
removeCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED) removeCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)
removeCapability(NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL) removeCapability(NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL)
@ -30,49 +38,24 @@ class NetworkObserveModule(service: Service) :
}.build() }.build()
private val callback = object : ConnectivityManager.NetworkCallback() { private val callback = object : ConnectivityManager.NetworkCallback() {
private var internet: Boolean = false
private var network: Network? = null private var network: Network? = null
override fun onAvailable(network: Network) { override fun onAvailable(network: Network) {
this.network = network this.network = network
networks.trySend(network) if (this.network != network)
}
override fun onCapabilitiesChanged(
network: Network,
networkCapabilities: NetworkCapabilities
) {
val internet = networkCapabilities
.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
if (this.network == network && this.internet != internet) {
this.internet = internet
networks.trySend(network) networks.trySend(network)
}
}
override fun onLost(network: Network) {
if (this.network == network) {
networks.trySend(null)
}
} }
override fun onLinkPropertiesChanged(network: Network, linkProperties: LinkProperties) { override fun onLinkPropertiesChanged(network: Network, linkProperties: LinkProperties) {
if (this.network == network) { if (this.network == network)
networks.trySend(network) networks.trySend(network)
}
} }
} }
override suspend fun run() { override suspend fun run() {
try { try {
if (Build.VERSION.SDK_INT in 24..27) @TargetApi(24) { connectivity.registerNetworkCallback(request, callback)
connectivity.registerDefaultNetworkCallback(callback)
} else {
connectivity.requestNetwork(request, callback)
}
} catch (e: Exception) { } catch (e: Exception) {
Log.w("Observe network changed: $e", e) Log.w("Observe network changed: $e", e)