mirror of
https://github.com/MetaCubeX/ClashMetaForAndroid.git
synced 2025-02-19 16:23:14 +03:00
Refactor: refactor network observer
This commit is contained in:
parent
48a9ab313e
commit
73550164a8
@ -1,5 +1,6 @@
|
||||
package com.github.kr328.clash.service
|
||||
|
||||
import android.annotation.TargetApi
|
||||
import android.app.PendingIntent
|
||||
import android.content.Intent
|
||||
import android.net.ProxyInfo
|
||||
@ -62,7 +63,7 @@ class TunService : VpnService(), CoroutineScope by CoroutineScope(Dispatchers.De
|
||||
true
|
||||
}
|
||||
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) })
|
||||
}
|
||||
|
||||
@ -182,12 +183,12 @@ class TunService : VpnService(), CoroutineScope by CoroutineScope(Dispatchers.De
|
||||
)
|
||||
|
||||
// Metered
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
|
||||
if (Build.VERSION.SDK_INT >= 29) {
|
||||
setMetered(false)
|
||||
}
|
||||
|
||||
// System Proxy
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q && store.systemProxy) {
|
||||
if (Build.VERSION.SDK_INT >= 29 && store.systemProxy) {
|
||||
listenHttp()?.let {
|
||||
setHttpProxy(
|
||||
ProxyInfo.buildDirectProxy(
|
||||
|
@ -1,6 +1,5 @@
|
||||
package com.github.kr328.clash.service.clash.module
|
||||
|
||||
import android.annotation.TargetApi
|
||||
import android.app.Service
|
||||
import android.net.*
|
||||
import android.os.Build
|
||||
@ -10,9 +9,7 @@ import com.github.kr328.clash.core.Clash
|
||||
import com.github.kr328.clash.service.util.resolveDns
|
||||
import kotlinx.coroutines.NonCancellable
|
||||
import kotlinx.coroutines.channels.Channel
|
||||
import kotlinx.coroutines.delay
|
||||
import kotlinx.coroutines.withContext
|
||||
import java.util.concurrent.TimeUnit
|
||||
|
||||
class NetworkObserveModule(service: Service) :
|
||||
Module<NetworkObserveModule.NetworkChanged>(service) {
|
||||
@ -21,8 +18,19 @@ class NetworkObserveModule(service: Service) :
|
||||
private val connectivity = service.getSystemService<ConnectivityManager>()!!
|
||||
private val networks: Channel<Network?> = Channel(Channel.CONFLATED)
|
||||
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_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
|
||||
removeCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)
|
||||
removeCapability(NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL)
|
||||
@ -30,49 +38,24 @@ class NetworkObserveModule(service: Service) :
|
||||
}.build()
|
||||
|
||||
private val callback = object : ConnectivityManager.NetworkCallback() {
|
||||
private var internet: Boolean = false
|
||||
private var network: Network? = null
|
||||
|
||||
override fun onAvailable(network: Network) {
|
||||
this.network = network
|
||||
|
||||
networks.trySend(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
|
||||
|
||||
if (this.network != network)
|
||||
networks.trySend(network)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onLost(network: Network) {
|
||||
if (this.network == network) {
|
||||
networks.trySend(null)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onLinkPropertiesChanged(network: Network, linkProperties: LinkProperties) {
|
||||
if (this.network == network) {
|
||||
if (this.network == network)
|
||||
networks.trySend(network)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override suspend fun run() {
|
||||
try {
|
||||
if (Build.VERSION.SDK_INT in 24..27) @TargetApi(24) {
|
||||
connectivity.registerDefaultNetworkCallback(callback)
|
||||
} else {
|
||||
connectivity.requestNetwork(request, callback)
|
||||
}
|
||||
connectivity.registerNetworkCallback(request, callback)
|
||||
} catch (e: Exception) {
|
||||
Log.w("Observe network changed: $e", e)
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user