mirror of
https://github.com/MatsuriDayo/NekoBoxForAndroid.git
synced 2025-12-20 07:00:05 +08:00
improve selector traffic count
This commit is contained in:
parent
958361eca1
commit
8a5a8c75ab
@ -153,8 +153,8 @@ class BaseService {
|
|||||||
val tag = data.proxy!!.config.profileTagMap[ent?.id] ?: ""
|
val tag = data.proxy!!.config.profileTagMap[ent?.id] ?: ""
|
||||||
if (tag.isNotBlank() && ent != null) {
|
if (tag.isNotBlank() && ent != null) {
|
||||||
val success = data.proxy!!.box.selectOutbound(tag)
|
val success = data.proxy!!.box.selectOutbound(tag)
|
||||||
Logs.d("selectOutbound $tag $success")
|
if (success) runOnDefaultDispatcher {
|
||||||
runOnDefaultDispatcher {
|
data.proxy!!.looper?.selectMain(ent.id)
|
||||||
data.binder.broadcast {
|
data.binder.broadcast {
|
||||||
it.stateChanged(-1, ent.displayName(), null)
|
it.stateChanged(-1, ent.displayName(), null)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -15,7 +15,7 @@ class ProxyInstance(profile: ProxyEntity, var service: BaseService.Interface? =
|
|||||||
var notTmp = true
|
var notTmp = true
|
||||||
|
|
||||||
// for TrafficLooper
|
// for TrafficLooper
|
||||||
private var looper: TrafficLooper? = null
|
var looper: TrafficLooper? = null
|
||||||
|
|
||||||
override fun buildConfig() {
|
override fun buildConfig() {
|
||||||
super.buildConfig()
|
super.buildConfig()
|
||||||
|
|||||||
@ -5,6 +5,7 @@ import io.nekohasekai.sagernet.aidl.TrafficData
|
|||||||
import io.nekohasekai.sagernet.bg.BaseService
|
import io.nekohasekai.sagernet.bg.BaseService
|
||||||
import io.nekohasekai.sagernet.database.DataStore
|
import io.nekohasekai.sagernet.database.DataStore
|
||||||
import io.nekohasekai.sagernet.database.ProfileManager
|
import io.nekohasekai.sagernet.database.ProfileManager
|
||||||
|
import io.nekohasekai.sagernet.fmt.TAG_BYPASS
|
||||||
import io.nekohasekai.sagernet.fmt.TAG_PROXY
|
import io.nekohasekai.sagernet.fmt.TAG_PROXY
|
||||||
import io.nekohasekai.sagernet.ktx.Logs
|
import io.nekohasekai.sagernet.ktx.Logs
|
||||||
import kotlinx.coroutines.*
|
import kotlinx.coroutines.*
|
||||||
@ -49,6 +50,19 @@ class TrafficLooper
|
|||||||
job = sc.launch { loop() }
|
job = sc.launch { loop() }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var selectorNowId = -1L
|
||||||
|
var selectorNowFakeTag = ""
|
||||||
|
|
||||||
|
fun selectMain(id: Long) {
|
||||||
|
Logs.d("select traffic count $TAG_PROXY to $id, old id is $selectorNowId")
|
||||||
|
val oldData = items[selectorNowId]
|
||||||
|
val data = items[id] ?: return
|
||||||
|
oldData?.tag = selectorNowFakeTag
|
||||||
|
selectorNowFakeTag = data.tag
|
||||||
|
data.tag = TAG_PROXY
|
||||||
|
selectorNowId = id
|
||||||
|
}
|
||||||
|
|
||||||
private suspend fun loop() {
|
private suspend fun loop() {
|
||||||
val delayMs = DataStore.speedInterval
|
val delayMs = DataStore.speedInterval
|
||||||
val showDirectSpeed = DataStore.showDirectSpeed
|
val showDirectSpeed = DataStore.showDirectSpeed
|
||||||
@ -72,32 +86,32 @@ class TrafficLooper
|
|||||||
itemBypass = TrafficUpdater.TrafficLooperData(tag = "bypass")
|
itemBypass = TrafficUpdater.TrafficLooperData(tag = "bypass")
|
||||||
items[-1] = itemBypass
|
items[-1] = itemBypass
|
||||||
//
|
//
|
||||||
val tags = hashSetOf("bypass")
|
val tags = hashSetOf(TAG_PROXY, TAG_BYPASS)
|
||||||
proxy.config.trafficMap.forEach { (tag, ents) ->
|
proxy.config.trafficMap.forEach { (tag, ents) ->
|
||||||
|
tags.add(tag)
|
||||||
for (ent in ents) {
|
for (ent in ents) {
|
||||||
val item = TrafficUpdater.TrafficLooperData(
|
val item = TrafficUpdater.TrafficLooperData(
|
||||||
tag = tag,
|
tag = tag,
|
||||||
rx = ent.rx,
|
rx = ent.rx,
|
||||||
tx = ent.tx,
|
tx = ent.tx,
|
||||||
)
|
)
|
||||||
if (proxy.config.selectorGroupId < 0L && ent.id == proxy.config.mainEntId) {
|
if (tag == TAG_PROXY && itemMain == null) {
|
||||||
itemMain = item
|
itemMain = item
|
||||||
itemMainBase = TrafficUpdater.TrafficLooperData(
|
itemMainBase = TrafficUpdater.TrafficLooperData(
|
||||||
tag = tag,
|
tag = tag,
|
||||||
rx = ent.rx,
|
rx = ent.rx,
|
||||||
tx = ent.tx,
|
tx = ent.tx,
|
||||||
)
|
)
|
||||||
Logs.d("traffic count $tag to main")
|
Logs.d("traffic count $tag to main to ${ent.id}")
|
||||||
}
|
}
|
||||||
items[ent.id] = item
|
items[ent.id] = item
|
||||||
tags.add(tag)
|
|
||||||
Logs.d("traffic count $tag to ${ent.id}")
|
Logs.d("traffic count $tag to ${ent.id}")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (proxy.config.selectorGroupId >= 0L) {
|
if (proxy.config.selectorGroupId >= 0L) {
|
||||||
itemMain = TrafficUpdater.TrafficLooperData(tag = TAG_PROXY)
|
itemMain = TrafficUpdater.TrafficLooperData(tag = TAG_PROXY)
|
||||||
itemMainBase = TrafficUpdater.TrafficLooperData(tag = TAG_PROXY)
|
itemMainBase = TrafficUpdater.TrafficLooperData(tag = TAG_PROXY)
|
||||||
tags.add(TAG_PROXY)
|
selectMain(proxy.config.mainEntId)
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
trafficUpdater = TrafficUpdater(
|
trafficUpdater = TrafficUpdater(
|
||||||
|
|||||||
@ -5,7 +5,6 @@ import io.nekohasekai.sagernet.Key
|
|||||||
import io.nekohasekai.sagernet.bg.VpnService
|
import io.nekohasekai.sagernet.bg.VpnService
|
||||||
import io.nekohasekai.sagernet.database.DataStore
|
import io.nekohasekai.sagernet.database.DataStore
|
||||||
import io.nekohasekai.sagernet.database.ProxyEntity
|
import io.nekohasekai.sagernet.database.ProxyEntity
|
||||||
import io.nekohasekai.sagernet.database.ProxyEntity.Companion.TYPE_CHAIN
|
|
||||||
import io.nekohasekai.sagernet.database.ProxyEntity.Companion.TYPE_CONFIG
|
import io.nekohasekai.sagernet.database.ProxyEntity.Companion.TYPE_CONFIG
|
||||||
import io.nekohasekai.sagernet.database.SagerDatabase
|
import io.nekohasekai.sagernet.database.SagerDatabase
|
||||||
import io.nekohasekai.sagernet.fmt.ConfigBuildResult.IndexEntity
|
import io.nekohasekai.sagernet.fmt.ConfigBuildResult.IndexEntity
|
||||||
@ -96,7 +95,7 @@ fun buildConfig(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val trafficMap = HashMap<String, MutableList<ProxyEntity>>()
|
val trafficMap = HashMap<String, List<ProxyEntity>>()
|
||||||
val tagMap = HashMap<Long, String>()
|
val tagMap = HashMap<Long, String>()
|
||||||
val globalOutbounds = ArrayList<Long>()
|
val globalOutbounds = ArrayList<Long>()
|
||||||
val group = SagerDatabase.groupDao.getById(proxy.groupId)
|
val group = SagerDatabase.groupDao.getById(proxy.groupId)
|
||||||
@ -270,6 +269,11 @@ fun buildConfig(
|
|||||||
chainId: Long, entity: ProxyEntity
|
chainId: Long, entity: ProxyEntity
|
||||||
): String {
|
): String {
|
||||||
val profileList = entity.resolveChain()
|
val profileList = entity.resolveChain()
|
||||||
|
val chainTrafficSet = HashSet<ProxyEntity>().apply {
|
||||||
|
plusAssign(profileList)
|
||||||
|
add(entity)
|
||||||
|
}
|
||||||
|
|
||||||
var currentOutbound = mutableMapOf<String, Any>()
|
var currentOutbound = mutableMapOf<String, Any>()
|
||||||
lateinit var pastOutbound: MutableMap<String, Any>
|
lateinit var pastOutbound: MutableMap<String, Any>
|
||||||
lateinit var pastInboundTag: String
|
lateinit var pastInboundTag: String
|
||||||
@ -342,11 +346,6 @@ fun buildConfig(
|
|||||||
globalOutbounds.add(proxyEntity.id)
|
globalOutbounds.add(proxyEntity.id)
|
||||||
}
|
}
|
||||||
|
|
||||||
// include g-xx & chain ent
|
|
||||||
val mapList = mutableListOf(proxyEntity)
|
|
||||||
if (index == 0 && entity.type == TYPE_CHAIN) mapList.add(proxy) // chain ent
|
|
||||||
trafficMap[tagOut] = mapList
|
|
||||||
|
|
||||||
// Chain outbound
|
// Chain outbound
|
||||||
if (proxyEntity.needExternal()) {
|
if (proxyEntity.needExternal()) {
|
||||||
val localPort = mkPort()
|
val localPort = mkPort()
|
||||||
@ -465,6 +464,7 @@ fun buildConfig(
|
|||||||
pastEntity = proxyEntity
|
pastEntity = proxyEntity
|
||||||
}
|
}
|
||||||
|
|
||||||
|
trafficMap[chainTagOut] = chainTrafficSet.toList()
|
||||||
return chainTagOut
|
return chainTagOut
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user