diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/AppConfig.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/AppConfig.kt
index d72bf027..598c3b85 100644
--- a/V2rayNG/app/src/main/java/com/v2ray/ang/AppConfig.kt
+++ b/V2rayNG/app/src/main/java/com/v2ray/ang/AppConfig.kt
@@ -97,6 +97,7 @@ object AppConfig {
const val TAG_FRAGMENT = "fragment"
const val TAG_DNS = "dns-module"
const val TAG_DOMESTIC_DNS = "domestic-dns"
+ const val TAG_BALANCER = "proxy-round"
/** Network-related constants. */
const val UPLINK = "uplink"
diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/handler/V2rayConfigManager.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/handler/V2rayConfigManager.kt
index 12eab95f..e97b6c56 100644
--- a/V2rayNG/app/src/main/java/com/v2ray/ang/handler/V2rayConfigManager.kt
+++ b/V2rayNG/app/src/main/java/com/v2ray/ang/handler/V2rayConfigManager.kt
@@ -840,65 +840,93 @@ object V2rayConfigManager {
* Configures load balancing settings for the V2ray configuration.
*
* @param v2rayConfig The V2ray configuration object to be modified with balancing settings
+ * @param config The profile item containing policy group settings
*/
private fun getBalance(v2rayConfig: V2rayConfig, config: ProfileItem) {
try {
v2rayConfig.routing.rules.forEach { rule ->
if (rule.outboundTag == "proxy") {
rule.outboundTag = null
- rule.balancerTag = "proxy-round"
+ rule.balancerTag = AppConfig.TAG_BALANCER
}
}
- if (config.policyGroupType == "0") {
- val balancer = V2rayConfig.RoutingBean.BalancerBean(
- tag = "proxy-round",
- selector = listOf("proxy-"),
- strategy = V2rayConfig.RoutingBean.StrategyObject(
- type = "leastPing"
+ val lstSelector = listOf("proxy-")
+ when (config.policyGroupType) {
+ // Least Ping goto else
+ "1" -> {
+ // Least Load
+ val balancer = V2rayConfig.RoutingBean.BalancerBean(
+ tag = AppConfig.TAG_BALANCER,
+ selector = lstSelector,
+ strategy = V2rayConfig.RoutingBean.StrategyObject(
+ type = "leastLoad"
+ )
)
- )
- v2rayConfig.routing.balancers = listOf(balancer)
- v2rayConfig.observatory = V2rayConfig.ObservatoryObject(
- subjectSelector = listOf("proxy-"),
- probeUrl = MmkvManager.decodeSettingsString(AppConfig.PREF_DELAY_TEST_URL) ?: AppConfig.DELAY_TEST_URL,
- probeInterval = "3m",
- enableConcurrency = true
- )
- } else {
- val balancer = V2rayConfig.RoutingBean.BalancerBean(
- tag = "proxy-round",
- selector = listOf("proxy-"),
- strategy = V2rayConfig.RoutingBean.StrategyObject(
- type = "leastLoad"
+ v2rayConfig.routing.balancers = listOf(balancer)
+ v2rayConfig.burstObservatory = V2rayConfig.BurstObservatoryObject(
+ subjectSelector = lstSelector,
+ pingConfig = V2rayConfig.BurstObservatoryObject.PingConfigObject(
+ destination = MmkvManager.decodeSettingsString(AppConfig.PREF_DELAY_TEST_URL) ?: AppConfig.DELAY_TEST_URL,
+ interval = "5m",
+ sampling = 2,
+ timeout = "30s"
+ )
)
- )
- v2rayConfig.routing.balancers = listOf(balancer)
- v2rayConfig.burstObservatory = V2rayConfig.BurstObservatoryObject(
- subjectSelector = listOf("proxy-"),
- pingConfig = V2rayConfig.BurstObservatoryObject.PingConfigObject(
- destination = MmkvManager.decodeSettingsString(AppConfig.PREF_DELAY_TEST_URL) ?: AppConfig.DELAY_TEST_URL,
- interval = "5m",
- sampling = 2,
- timeout = "30s"
+ }
+ "2" -> {
+ // Random
+ val balancer = V2rayConfig.RoutingBean.BalancerBean(
+ tag = AppConfig.TAG_BALANCER,
+ selector = lstSelector,
+ strategy = V2rayConfig.RoutingBean.StrategyObject(
+ type = "random"
+ )
)
- )
+ v2rayConfig.routing.balancers = listOf(balancer)
+ }
+ "3" -> {
+ // Round Robin
+ val balancer = V2rayConfig.RoutingBean.BalancerBean(
+ tag = AppConfig.TAG_BALANCER,
+ selector = lstSelector,
+ strategy = V2rayConfig.RoutingBean.StrategyObject(
+ type = "roundRobin"
+ )
+ )
+ v2rayConfig.routing.balancers = listOf(balancer)
+ }
+ else -> {
+ // Default: Least Ping
+ val balancer = V2rayConfig.RoutingBean.BalancerBean(
+ tag = AppConfig.TAG_BALANCER,
+ selector = lstSelector,
+ strategy = V2rayConfig.RoutingBean.StrategyObject(
+ type = "leastPing"
+ )
+ )
+ v2rayConfig.routing.balancers = listOf(balancer)
+ v2rayConfig.observatory = V2rayConfig.ObservatoryObject(
+ subjectSelector = lstSelector,
+ probeUrl = MmkvManager.decodeSettingsString(AppConfig.PREF_DELAY_TEST_URL) ?: AppConfig.DELAY_TEST_URL,
+ probeInterval = "3m",
+ enableConcurrency = true
+ )
+ }
}
if (v2rayConfig.routing.domainStrategy == "IPIfNonMatch") {
v2rayConfig.routing.rules.add(
RulesBean(
ip = arrayListOf("0.0.0.0/0", "::/0"),
- balancerTag = "proxy-round",
- type = "field"
+ balancerTag = AppConfig.TAG_BALANCER,
)
)
} else {
v2rayConfig.routing.rules.add(
RulesBean(
network = "tcp,udp",
- balancerTag = "proxy-round",
- type = "field"
+ balancerTag = AppConfig.TAG_BALANCER,
)
)
}
diff --git a/V2rayNG/app/src/main/res/values-ar/strings.xml b/V2rayNG/app/src/main/res/values-ar/strings.xml
index 8f5eb205..19886afe 100644
--- a/V2rayNG/app/src/main/res/values-ar/strings.xml
+++ b/V2rayNG/app/src/main/res/values-ar/strings.xml
@@ -399,6 +399,8 @@
- Least Ping
- Least Load
+ - Random
+ - Round Robin
diff --git a/V2rayNG/app/src/main/res/values-bn/strings.xml b/V2rayNG/app/src/main/res/values-bn/strings.xml
index 84c70d48..c1a4e5bd 100644
--- a/V2rayNG/app/src/main/res/values-bn/strings.xml
+++ b/V2rayNG/app/src/main/res/values-bn/strings.xml
@@ -405,6 +405,8 @@
- Least Ping
- Least Load
+ - Random
+ - Round Robin
diff --git a/V2rayNG/app/src/main/res/values-bqi-rIR/strings.xml b/V2rayNG/app/src/main/res/values-bqi-rIR/strings.xml
index e4339af0..125ed7e1 100644
--- a/V2rayNG/app/src/main/res/values-bqi-rIR/strings.xml
+++ b/V2rayNG/app/src/main/res/values-bqi-rIR/strings.xml
@@ -415,6 +415,8 @@
- کم ترین پینگ
- کم ترین بار(لود)
+ - تصادفی
+ - گردشی
diff --git a/V2rayNG/app/src/main/res/values-fa/strings.xml b/V2rayNG/app/src/main/res/values-fa/strings.xml
index 7fa6f4f7..78907e13 100644
--- a/V2rayNG/app/src/main/res/values-fa/strings.xml
+++ b/V2rayNG/app/src/main/res/values-fa/strings.xml
@@ -414,6 +414,8 @@
- کمترین پینگ
- کمترین بار(لود)
+ - تصادفی
+ - گردشی
diff --git a/V2rayNG/app/src/main/res/values-ru/strings.xml b/V2rayNG/app/src/main/res/values-ru/strings.xml
index 2b43dce1..0c71cccc 100644
--- a/V2rayNG/app/src/main/res/values-ru/strings.xml
+++ b/V2rayNG/app/src/main/res/values-ru/strings.xml
@@ -414,6 +414,8 @@
- Наименьшая задержка
- Наименьшая нагрузка
+ - Случайный
+ - По очереди
diff --git a/V2rayNG/app/src/main/res/values-vi/strings.xml b/V2rayNG/app/src/main/res/values-vi/strings.xml
index e9447676..23288c23 100644
--- a/V2rayNG/app/src/main/res/values-vi/strings.xml
+++ b/V2rayNG/app/src/main/res/values-vi/strings.xml
@@ -401,6 +401,8 @@
- Least Ping
- Least Load
+ - Random
+ - Round Robin
diff --git a/V2rayNG/app/src/main/res/values-zh-rCN/strings.xml b/V2rayNG/app/src/main/res/values-zh-rCN/strings.xml
index f10f9db1..c9e2dbc5 100644
--- a/V2rayNG/app/src/main/res/values-zh-rCN/strings.xml
+++ b/V2rayNG/app/src/main/res/values-zh-rCN/strings.xml
@@ -406,6 +406,8 @@
- 最低延迟
- 最稳定
+ - 随机选择
+ - 轮询
diff --git a/V2rayNG/app/src/main/res/values-zh-rTW/strings.xml b/V2rayNG/app/src/main/res/values-zh-rTW/strings.xml
index 21793d10..09e67bef 100644
--- a/V2rayNG/app/src/main/res/values-zh-rTW/strings.xml
+++ b/V2rayNG/app/src/main/res/values-zh-rTW/strings.xml
@@ -406,6 +406,8 @@
- 最低延遲
- 最少卡頓
+ - 隨機選擇
+ - 輪詢
diff --git a/V2rayNG/app/src/main/res/values/strings.xml b/V2rayNG/app/src/main/res/values/strings.xml
index 4537d8d1..7e380bcd 100644
--- a/V2rayNG/app/src/main/res/values/strings.xml
+++ b/V2rayNG/app/src/main/res/values/strings.xml
@@ -419,6 +419,8 @@
- Least Ping
- Least Load
+ - Random
+ - Round Robin