diff --git a/V2rayNG/app/src/main/assets/v2ray_config.json b/V2rayNG/app/src/main/assets/v2ray_config.json
index 4f8c3d7e..4f2d637b 100644
--- a/V2rayNG/app/src/main/assets/v2ray_config.json
+++ b/V2rayNG/app/src/main/assets/v2ray_config.json
@@ -33,14 +33,6 @@
"tls"
]
}
- },
- {
- "tag": "http",
- "port": 10809,
- "protocol": "http",
- "settings": {
- "userLevel": 8
- }
}
],
"outbounds": [{
diff --git a/V2rayNG/app/src/main/assets/v2ray_config_with_tun.json b/V2rayNG/app/src/main/assets/v2ray_config_with_tun.json
index c3ad3e3d..837bff85 100644
--- a/V2rayNG/app/src/main/assets/v2ray_config_with_tun.json
+++ b/V2rayNG/app/src/main/assets/v2ray_config_with_tun.json
@@ -35,23 +35,15 @@
}
},
{
- "tag": "http",
- "port": 10809,
- "protocol": "http",
+ "tag": "tun",
+ "port": 0,
+ "protocol": "tun",
"settings": {
+ "name": "xray0",
+ "MTU": 1500,
"userLevel": 8
}
- },
- {
- "tag": "tun",
- "port": 0,
- "protocol": "tun",
- "settings": {
- "name": "xray0",
- "MTU": 1500,
- "userLevel": 8
- }
- }
+ }
],
"outbounds": [{
"tag": "proxy",
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 cd2b3f3d..92072e16 100644
--- a/V2rayNG/app/src/main/java/com/v2ray/ang/AppConfig.kt
+++ b/V2rayNG/app/src/main/java/com/v2ray/ang/AppConfig.kt
@@ -63,7 +63,7 @@ object AppConfig {
const val PREF_IS_BOOTED = "pref_is_booted"
const val PREF_CHECK_UPDATE_PRE_RELEASE = "pref_check_update_pre_release"
const val PREF_GEO_FILES_SOURCES = "pref_geo_files_sources"
- const val PREF_TUN = "pref_tun"
+ const val PREF_USE_HEV_TUNNEL = "pref_use_hev_tunnel_v2"
const val PREF_HEV_TUNNEL_LOGLEVEL = "pref_hev_tunnel_loglevel"
const val PREF_HEV_TUNNEL_RW_TIMEOUT = "pref_hev_tunnel_rw_timeout_v2"
const val PREF_AUTO_REMOVE_INVALID_AFTER_TEST = "pref_auto_remove_invalid_after_test"
@@ -175,8 +175,6 @@ object AppConfig {
/** Give a good name to this, IDK*/
const val VPN = "VPN"
const val VPN_MTU = 1500
- const val TUN_hevsocks5 = "hev-socks5-tunnel"
- const val TUN_xray = "xray-core"
/** hev-sock5-tunnel read-write-timeout value */
const val HEVTUN_RW_TIMEOUT = "300,60"
diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/dto/V2rayConfig.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/dto/V2rayConfig.kt
index 1a598d31..c1659a9c 100644
--- a/V2rayNG/app/src/main/java/com/v2ray/ang/dto/V2rayConfig.kt
+++ b/V2rayNG/app/src/main/java/com/v2ray/ang/dto/V2rayConfig.kt
@@ -34,19 +34,19 @@ data class V2rayConfig(
var port: Int,
var protocol: String,
var listen: String? = null,
- val settings: Any? = null,
+ var settings: InSettingsBean? = null,
val sniffing: SniffingBean? = null,
val streamSettings: Any? = null,
val allocate: Any? = null
) {
data class InSettingsBean(
- val auth: String? = null,
- val udp: Boolean? = null,
- val userLevel: Int? = null,
- val address: String? = null,
- val port: Int? = null,
- val network: String? = null
+ var auth: String? = null,
+ var udp: Boolean? = null,
+ var userLevel: Int? = null,
+ var name: String? = null,
+ @SerializedName("MTU")
+ var mtu: Int? = null
)
data class SniffingBean(
diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/handler/SettingsManager.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/handler/SettingsManager.kt
index 7c2cf359..bc5e9ca9 100644
--- a/V2rayNG/app/src/main/java/com/v2ray/ang/handler/SettingsManager.kt
+++ b/V2rayNG/app/src/main/java/com/v2ray/ang/handler/SettingsManager.kt
@@ -378,6 +378,14 @@ object SettingsManager {
return Utils.parseInt(MmkvManager.decodeSettingsString(AppConfig.PREF_VPN_MTU), AppConfig.VPN_MTU)
}
+ /**
+ * Check if HEV TUN is being used.
+ * @return True if HEV TUN is used, false otherwise.
+ */
+ fun isUsingHevTun(): Boolean {
+ return MmkvManager.decodeSettingsBool(AppConfig.PREF_USE_HEV_TUNNEL, true)
+ }
+
/**
* Ensure default settings are present in MMKV.
*/
@@ -397,7 +405,6 @@ object SettingsManager {
ensureDefaultValue(AppConfig.PREF_MUX_XUDP_CONCURRENCY, "8")
ensureDefaultValue(AppConfig.PREF_FRAGMENT_LENGTH, "50-100")
ensureDefaultValue(AppConfig.PREF_FRAGMENT_INTERVAL, "10-20")
- ensureDefaultValue(AppConfig.PREF_TUN, AppConfig.TUN_hevsocks5)
}
private fun ensureDefaultValue(key: String, default: String) {
diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/handler/V2RayServiceManager.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/handler/V2RayServiceManager.kt
index 2d84b293..43e90d4f 100644
--- a/V2rayNG/app/src/main/java/com/v2ray/ang/handler/V2RayServiceManager.kt
+++ b/V2rayNG/app/src/main/java/com/v2ray/ang/handler/V2RayServiceManager.kt
@@ -149,7 +149,7 @@ object V2RayServiceManager {
currentConfig = config
var tunFd = vpnInterface?.fd ?: 0
- if ((MmkvManager.decodeSettingsString(AppConfig.PREF_TUN) ?: AppConfig.TUN_hevsocks5) != AppConfig.TUN_xray) {
+ if (SettingsManager.isUsingHevTun()) {
tunFd = 0
}
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 12d897e9..5597089b 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
@@ -307,7 +307,7 @@ object V2rayConfigManager {
*/
private fun initV2rayConfig(context: Context): V2rayConfig? {
var assets = ""
- if ((MmkvManager.decodeSettingsString(AppConfig.PREF_TUN) ?: AppConfig.TUN_hevsocks5) != AppConfig.TUN_xray) {
+ if (SettingsManager.isUsingHevTun()) {
assets = initConfigCache ?: Utils.readTextFromAssets(context, "v2ray_config.json")
if (TextUtils.isEmpty(assets)) {
return null
@@ -341,34 +341,37 @@ object V2rayConfigManager {
private fun getInbounds(v2rayConfig: V2rayConfig): Boolean {
try {
val socksPort = SettingsManager.getSocksPort()
+ val inbound1 = v2rayConfig.inbounds[0]
- v2rayConfig.inbounds.forEach { curInbound ->
- if (MmkvManager.decodeSettingsBool(AppConfig.PREF_PROXY_SHARING) != true) {
- //bind all inbounds to localhost if the user requests
- curInbound.listen = AppConfig.LOOPBACK
- }
+ if (MmkvManager.decodeSettingsBool(AppConfig.PREF_PROXY_SHARING) != true) {
+ inbound1.listen = AppConfig.LOOPBACK
}
- v2rayConfig.inbounds[0].port = socksPort
+ inbound1.port = socksPort
val fakedns = MmkvManager.decodeSettingsBool(AppConfig.PREF_FAKE_DNS_ENABLED) == true
val sniffAllTlsAndHttp =
MmkvManager.decodeSettingsBool(AppConfig.PREF_SNIFFING_ENABLED, true) != false
- v2rayConfig.inbounds[0].sniffing?.enabled = fakedns || sniffAllTlsAndHttp
- v2rayConfig.inbounds[0].sniffing?.routeOnly =
+ inbound1.sniffing?.enabled = fakedns || sniffAllTlsAndHttp
+ inbound1.sniffing?.routeOnly =
MmkvManager.decodeSettingsBool(AppConfig.PREF_ROUTE_ONLY_ENABLED, false)
if (!sniffAllTlsAndHttp) {
- v2rayConfig.inbounds[0].sniffing?.destOverride?.clear()
+ inbound1.sniffing?.destOverride?.clear()
}
if (fakedns) {
- v2rayConfig.inbounds[0].sniffing?.destOverride?.add("fakedns")
+ inbound1.sniffing?.destOverride?.add("fakedns")
}
- if (Utils.isXray()) {
- v2rayConfig.inbounds.removeAt(1)
- } else {
- val httpPort = SettingsManager.getHttpPort()
- v2rayConfig.inbounds[1].port = httpPort
+ if (!Utils.isXray()) {
+ val inbound2 = JsonUtil.fromJson(JsonUtil.toJson(inbound1), V2rayConfig.InboundBean::class.java) ?: return false
+ inbound2.tag = EConfigType.HTTP.name.lowercase()
+ inbound2.port = SettingsManager.getHttpPort()
+ inbound2.protocol = EConfigType.HTTP.name.lowercase()
+ v2rayConfig.inbounds.add(inbound2)
}
+ if (!SettingsManager.isUsingHevTun()) {
+ val inboundTun = v2rayConfig.inbounds.firstOrNull { e -> e.tag == "tun" }
+ inboundTun?.settings?.mtu = SettingsManager.getVpnMtu()
+ }
} catch (e: Exception) {
Log.e(AppConfig.TAG, "Failed to configure inbounds", e)
return false
@@ -489,7 +492,7 @@ object V2rayConfigManager {
)
}
- if (MmkvManager.decodeSettingsString(AppConfig.PREF_TUN, AppConfig.TUN_hevsocks5) == AppConfig.TUN_hevsocks5) {
+ if (SettingsManager.isUsingHevTun()) {
//hev-socks5-tunnel dns routing
v2rayConfig.routing.rules.add(
0, RulesBean(
diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/service/V2RayVpnService.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/service/V2RayVpnService.kt
index aa540f17..0a3f509a 100644
--- a/V2rayNG/app/src/main/java/com/v2ray/ang/service/V2RayVpnService.kt
+++ b/V2rayNG/app/src/main/java/com/v2ray/ang/service/V2RayVpnService.kt
@@ -297,7 +297,7 @@ class V2RayVpnService : VpnService(), ServiceControl {
* Starts the tun2socks process with the appropriate parameters.
*/
private fun runTun2socks() {
- if (MmkvManager.decodeSettingsString(AppConfig.PREF_TUN, AppConfig.TUN_hevsocks5) == AppConfig.TUN_hevsocks5) {
+ if (SettingsManager.isUsingHevTun()) {
tun2SocksService = TProxyService(
context = applicationContext,
vpnInterface = mInterface,
diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/viewmodel/SettingsViewModel.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/viewmodel/SettingsViewModel.kt
deleted file mode 100644
index 78a09b0b..00000000
--- a/V2rayNG/app/src/main/java/com/v2ray/ang/viewmodel/SettingsViewModel.kt
+++ /dev/null
@@ -1,108 +0,0 @@
-package com.v2ray.ang.viewmodel
-
-import android.app.Application
-import android.content.SharedPreferences
-import android.util.Log
-import androidx.lifecycle.AndroidViewModel
-import androidx.preference.PreferenceManager
-import com.v2ray.ang.AppConfig
-import com.v2ray.ang.handler.MmkvManager
-import com.v2ray.ang.handler.SettingsChangeManager
-import com.v2ray.ang.handler.SettingsManager
-
-class SettingsViewModel(application: Application) : AndroidViewModel(application),
- SharedPreferences.OnSharedPreferenceChangeListener {
-
- /**
- * Starts listening for preference changes.
- */
- fun startListenPreferenceChange() {
- PreferenceManager.getDefaultSharedPreferences(getApplication())
- .registerOnSharedPreferenceChangeListener(this)
- }
-
- /**
- * Called when the ViewModel is cleared.
- */
- override fun onCleared() {
- PreferenceManager.getDefaultSharedPreferences(getApplication())
- .unregisterOnSharedPreferenceChangeListener(this)
- Log.i(AppConfig.TAG, "Settings ViewModel is cleared")
- super.onCleared()
- }
-
- /**
- * Called when a shared preference is changed.
- * @param sharedPreferences The shared preferences.
- * @param key The key of the changed preference.
- */
- override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String?) {
- Log.i(AppConfig.TAG, "Observe settings changed: $key")
- when (key) {
- AppConfig.PREF_MODE,
- AppConfig.PREF_VPN_DNS,
- AppConfig.PREF_VPN_BYPASS_LAN,
- AppConfig.PREF_VPN_INTERFACE_ADDRESS_CONFIG_INDEX,
- AppConfig.PREF_VPN_MTU,
- AppConfig.PREF_REMOTE_DNS,
- AppConfig.PREF_DOMESTIC_DNS,
- AppConfig.PREF_DNS_HOSTS,
- AppConfig.PREF_DELAY_TEST_URL,
- AppConfig.PREF_IP_API_URL,
- AppConfig.PREF_LOCAL_DNS_PORT,
- AppConfig.PREF_SOCKS_PORT,
- AppConfig.PREF_LOGLEVEL,
- AppConfig.PREF_OUTBOUND_DOMAIN_RESOLVE_METHOD,
- AppConfig.PREF_LANGUAGE,
- AppConfig.PREF_UI_MODE_NIGHT,
- AppConfig.PREF_ROUTING_DOMAIN_STRATEGY,
- AppConfig.SUBSCRIPTION_AUTO_UPDATE_INTERVAL,
- AppConfig.PREF_FRAGMENT_PACKETS,
- AppConfig.PREF_FRAGMENT_LENGTH,
- AppConfig.PREF_FRAGMENT_INTERVAL,
- AppConfig.PREF_MUX_XUDP_QUIC,
- AppConfig.PREF_HEV_TUNNEL_LOGLEVEL,
- AppConfig.PREF_HEV_TUNNEL_RW_TIMEOUT,
- AppConfig.PREF_TUN,
- -> {
- MmkvManager.encodeSettings(key, sharedPreferences.getString(key, ""))
- }
-
- AppConfig.PREF_ROUTE_ONLY_ENABLED,
- AppConfig.PREF_IS_BOOTED,
- AppConfig.PREF_SPEED_ENABLED,
- AppConfig.PREF_PROXY_SHARING,
- AppConfig.PREF_LOCAL_DNS_ENABLED,
- AppConfig.PREF_FAKE_DNS_ENABLED,
- AppConfig.PREF_APPEND_HTTP_PROXY,
- AppConfig.PREF_ALLOW_INSECURE,
- AppConfig.PREF_PREFER_IPV6,
-// AppConfig.PREF_PER_APP_PROXY,
- AppConfig.PREF_BYPASS_APPS,
- AppConfig.PREF_CONFIRM_REMOVE,
- AppConfig.PREF_START_SCAN_IMMEDIATE,
- AppConfig.PREF_DOUBLE_COLUMN_DISPLAY,
- AppConfig.SUBSCRIPTION_AUTO_UPDATE,
- AppConfig.PREF_FRAGMENT_ENABLED,
- AppConfig.PREF_MUX_ENABLED,
- -> {
- MmkvManager.encodeSettings(key, sharedPreferences.getBoolean(key, false))
- }
-
- AppConfig.PREF_SNIFFING_ENABLED,
- -> {
- MmkvManager.encodeSettings(key, sharedPreferences.getBoolean(key, true))
- }
-
- AppConfig.PREF_MUX_CONCURRENCY,
- AppConfig.PREF_MUX_XUDP_CONCURRENCY,
- -> {
- MmkvManager.encodeSettings(key, sharedPreferences.getString(key, "8"))
- }
- }
- if (key == AppConfig.PREF_UI_MODE_NIGHT) {
- SettingsManager.setNightMode()
- }
- SettingsChangeManager.makeRestartService()
- }
-}
diff --git a/V2rayNG/app/src/main/res/values-ar/strings.xml b/V2rayNG/app/src/main/res/values-ar/strings.xml
index 8f9d9820..596c83c5 100644
--- a/V2rayNG/app/src/main/res/values-ar/strings.xml
+++ b/V2rayNG/app/src/main/res/values-ar/strings.xml
@@ -257,7 +257,8 @@
اللغة
إعدادات واجهة المستخدم
إعدادات وضع واجهة المستخدم ليلاً
- TUN Interface
+ Enable Hev TUN Feature
+ When enabled, TUN will use hev-socks5-tunnel; otherwise, it will use xray-core.
Hev Tun Log Level
Hev Tun read/write timeout (seconds) (tcp,udp default 300,60)
diff --git a/V2rayNG/app/src/main/res/values-bn/strings.xml b/V2rayNG/app/src/main/res/values-bn/strings.xml
index f488852c..67a30909 100644
--- a/V2rayNG/app/src/main/res/values-bn/strings.xml
+++ b/V2rayNG/app/src/main/res/values-bn/strings.xml
@@ -257,7 +257,8 @@
ভাষা
ইউআই সেটিংস
ইউআই মোড সেটিংস
- TUN Interface
+ Enable Hev TUN Feature
+ When enabled, TUN will use hev-socks5-tunnel; otherwise, it will use xray-core.
Hev Tun Log Level
Hev Tun read/write timeout (seconds) (tcp,udp default 300,60)
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 7e7f3285..0261d677 100644
--- a/V2rayNG/app/src/main/res/values-bqi-rIR/strings.xml
+++ b/V2rayNG/app/src/main/res/values-bqi-rIR/strings.xml
@@ -257,7 +257,8 @@
زووݩ
سامووا رابت منتوری
سامووا هالت رابت منتوری
- TUN Interface
+ Enable Hev TUN Feature
+ When enabled, TUN will use hev-socks5-tunnel; otherwise, it will use xray-core.
Hev Tun سئت گوزارشا
زمووݩ مندیر بیڌن خوندن/هؽل کردن Hev Tun (سانیه) (پؽش فرز tcp,udp 300،60)
diff --git a/V2rayNG/app/src/main/res/values-fa/strings.xml b/V2rayNG/app/src/main/res/values-fa/strings.xml
index 74c76334..87e499e3 100644
--- a/V2rayNG/app/src/main/res/values-fa/strings.xml
+++ b/V2rayNG/app/src/main/res/values-fa/strings.xml
@@ -254,7 +254,8 @@
زبان
تنظیمات رابط کاربری
تنظیمات حالت رابط کاربری
- TUN واسط
+ Enable Hev TUN Feature
+ When enabled, TUN will use hev-socks5-tunnel; otherwise, it will use xray-core.
سطح گزارشات Hev Tun
زمان انتظار خواندن/نوشتن Hev Tun (ثانیه) (پیشفرض tcp,udp 300،60)
diff --git a/V2rayNG/app/src/main/res/values-ru/strings.xml b/V2rayNG/app/src/main/res/values-ru/strings.xml
index 5efba6f9..027907b1 100644
--- a/V2rayNG/app/src/main/res/values-ru/strings.xml
+++ b/V2rayNG/app/src/main/res/values-ru/strings.xml
@@ -256,7 +256,8 @@
Язык
Настройки интерфейса
Тема интерфейса
- TUN интерфейса
+ Enable Hev TUN Feature
+ When enabled, TUN will use hev-socks5-tunnel; otherwise, it will use xray-core.
Подробность журнала HevTun
Ожидание чтения/записи HevTun (секунд, по умолчанию TCP,UDP 300,60)
diff --git a/V2rayNG/app/src/main/res/values-vi/strings.xml b/V2rayNG/app/src/main/res/values-vi/strings.xml
index 765f8de8..202de764 100644
--- a/V2rayNG/app/src/main/res/values-vi/strings.xml
+++ b/V2rayNG/app/src/main/res/values-vi/strings.xml
@@ -257,7 +257,8 @@
Ngôn ngữ
Cài đặt UI
Cài đặt chế độ UI
- TUN Interface
+ Enable Hev TUN Feature
+ When enabled, TUN will use hev-socks5-tunnel; otherwise, it will use xray-core.
Hev Tun Log Level
Hev Tun read/write timeout (seconds) (tcp,udp default 300,60)
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 7b64bc54..0bf82ed3 100644
--- a/V2rayNG/app/src/main/res/values-zh-rCN/strings.xml
+++ b/V2rayNG/app/src/main/res/values-zh-rCN/strings.xml
@@ -254,7 +254,8 @@
语言
用户界面设置
界面颜色设置
- TUN 接口
+ 启用 Hev TUN 功能
+ 选择启用后 TUN 将使用 hev-socks5-tunnel 否则使用 xray-core
HevTun 日志级别
HevTun 读写超时(秒) (tcp,udp 默认 300,60)
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 a0ab6f5d..efa7effb 100644
--- a/V2rayNG/app/src/main/res/values-zh-rTW/strings.xml
+++ b/V2rayNG/app/src/main/res/values-zh-rTW/strings.xml
@@ -255,7 +255,8 @@
語言
介面顏色設定
介面顯示模式
- TUN 介面
+ 啟用 Hev TUN 功能
+ 選擇啟用後 TUN 將使用 hev-socks5-tunnel 否則使用 xray-core
HevTun 日誌級別
HevTun 讀寫逾時(秒) (tcp,udp 預設 300,60)
diff --git a/V2rayNG/app/src/main/res/values/arrays.xml b/V2rayNG/app/src/main/res/values/arrays.xml
index 2ff0aa5c..e4ceda63 100644
--- a/V2rayNG/app/src/main/res/values/arrays.xml
+++ b/V2rayNG/app/src/main/res/values/arrays.xml
@@ -118,11 +118,6 @@
- Proxy only
-
- - hev-socks5-tunnel
- - xray-core
-
-
- error
- warn
diff --git a/V2rayNG/app/src/main/res/values/strings.xml b/V2rayNG/app/src/main/res/values/strings.xml
index 5b07eaa2..a3b906cb 100644
--- a/V2rayNG/app/src/main/res/values/strings.xml
+++ b/V2rayNG/app/src/main/res/values/strings.xml
@@ -260,7 +260,8 @@
Language
UI settings
UI mode settings
- TUN Interface
+ Enable Hev TUN Feature
+ When enabled, TUN will use hev-socks5-tunnel; otherwise, it will use xray-core.
Hev Tun Log Level
Hev Tun read/write timeout (seconds) (tcp,udp default 300,60)
diff --git a/V2rayNG/app/src/main/res/xml/pref_settings.xml b/V2rayNG/app/src/main/res/xml/pref_settings.xml
index 7ecdfa5f..a79a29f1 100644
--- a/V2rayNG/app/src/main/res/xml/pref_settings.xml
+++ b/V2rayNG/app/src/main/res/xml/pref_settings.xml
@@ -100,13 +100,11 @@
android:summary="1500"
android:title="@string/title_pref_vpn_mtu" />
-
+