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" /> - +