From de1c8bcfcc410d484bdd32f08716586907b9f316 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Mon, 19 Jan 2026 19:43:09 +0800 Subject: [PATCH] Refactor VPN mode checks and TUN config logic Centralizes VPN mode detection in SettingsManager with a new isVpnMode() method and updates all usages to reference it. Refactors TUN configuration logic in V2rayConfigManager for clarity and correctness, ensuring proper config and routing rules are applied based on VPN and HEV TUN settings. --- .../com/v2ray/ang/handler/SettingsManager.kt | 10 ++++ .../v2ray/ang/handler/V2RayServiceManager.kt | 2 +- .../v2ray/ang/handler/V2rayConfigManager.kt | 54 ++++++++++--------- .../java/com/v2ray/ang/ui/MainActivity.kt | 3 +- 4 files changed, 43 insertions(+), 26 deletions(-) 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 bc5e9ca9..7e610d88 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 @@ -10,6 +10,7 @@ import com.v2ray.ang.AppConfig.ANG_PACKAGE import com.v2ray.ang.AppConfig.GEOIP_PRIVATE import com.v2ray.ang.AppConfig.GEOSITE_PRIVATE import com.v2ray.ang.AppConfig.TAG_DIRECT +import com.v2ray.ang.AppConfig.VPN import com.v2ray.ang.dto.EConfigType import com.v2ray.ang.dto.Language import com.v2ray.ang.dto.ProfileItem @@ -386,6 +387,15 @@ object SettingsManager { return MmkvManager.decodeSettingsBool(AppConfig.PREF_USE_HEV_TUNNEL, true) } + /** + * Check if VPN mode is enabled. + * @return True if VPN mode is enabled, false otherwise. + */ + fun isVpnMode(): Boolean { + val mode = MmkvManager.decodeSettingsString(AppConfig.PREF_MODE) + return mode == null || mode == VPN + } + /** * Ensure default settings are present in MMKV. */ 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 60d99f74..e7641349 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 @@ -108,7 +108,7 @@ object V2RayServiceManager { } else { context.toast(R.string.toast_services_start) } - val intent = if ((MmkvManager.decodeSettingsString(AppConfig.PREF_MODE) ?: AppConfig.VPN) == AppConfig.VPN) { + val intent = if (SettingsManager.isVpnMode()) { Intent(context.applicationContext, V2RayVpnService::class.java) } else { Intent(context.applicationContext, V2RayProxyOnlyService::class.java) 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 a2902a64..12eab95f 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 @@ -91,7 +91,7 @@ object V2rayConfigManager { private fun getV2rayCustomConfig(context: Context, guid: String, config: ProfileItem): ConfigResult { val raw = MmkvManager.decodeServerRaw(guid) ?: return ConfigResult(false) val result = ConfigResult(true, guid, raw) - if (SettingsManager.isUsingHevTun()) { + if (!needTun()) { return result } @@ -334,18 +334,18 @@ object V2rayConfigManager { */ private fun initV2rayConfig(context: Context): V2rayConfig? { var assets = "" - if (SettingsManager.isUsingHevTun()) { - assets = initConfigCache ?: Utils.readTextFromAssets(context, "v2ray_config.json") - if (TextUtils.isEmpty(assets)) { - return null - } - initConfigCache = assets - } else { + if (needTun()) { assets = initConfigCacheWithTun ?: Utils.readTextFromAssets(context, "v2ray_config_with_tun.json") if (TextUtils.isEmpty(assets)) { return null } initConfigCacheWithTun = assets + } else { + assets = initConfigCache ?: Utils.readTextFromAssets(context, "v2ray_config.json") + if (TextUtils.isEmpty(assets)) { + return null + } + initConfigCache = assets } val config = JsonUtil.fromJson(assets, V2rayConfig::class.java) return config @@ -357,6 +357,10 @@ object V2rayConfigManager { //region some sub function + private fun needTun(): Boolean { + return SettingsManager.isVpnMode() && !SettingsManager.isUsingHevTun() + } + /** * Configures the inbound settings for V2ray. * @@ -395,7 +399,7 @@ object V2rayConfigManager { v2rayConfig.inbounds.add(inbound2) } - if (!SettingsManager.isUsingHevTun()) { + if (needTun()) { val inboundTun = v2rayConfig.inbounds.firstOrNull { e -> e.tag == "tun" } inboundTun?.settings?.mtu = SettingsManager.getVpnMtu() inboundTun?.sniffing = inbound1.sniffing @@ -520,23 +524,25 @@ object V2rayConfigManager { ) } - if (SettingsManager.isUsingHevTun()) { - //hev-socks5-tunnel dns routing - v2rayConfig.routing.rules.add( - 0, RulesBean( - inboundTag = arrayListOf("socks"), - outboundTag = "dns-out", - port = "53", + if(SettingsManager.isVpnMode()) { + if (SettingsManager.isUsingHevTun()) { + //hev-socks5-tunnel dns routing + v2rayConfig.routing.rules.add( + 0, RulesBean( + inboundTag = arrayListOf("socks"), + outboundTag = "dns-out", + port = "53", + ) ) - ) - } else { - v2rayConfig.routing.rules.add( - 0, RulesBean( - inboundTag = arrayListOf("tun"), - outboundTag = "dns-out", - port = "53", + } else { + v2rayConfig.routing.rules.add( + 0, RulesBean( + inboundTag = arrayListOf("tun"), + outboundTag = "dns-out", + port = "53", + ) ) - ) + } } // DNS outbound diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/MainActivity.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/MainActivity.kt index b4679fef..4d769069 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/MainActivity.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/MainActivity.kt @@ -34,6 +34,7 @@ import com.v2ray.ang.extension.toastError import com.v2ray.ang.handler.AngConfigManager import com.v2ray.ang.handler.MmkvManager import com.v2ray.ang.handler.SettingsChangeManager +import com.v2ray.ang.handler.SettingsManager import com.v2ray.ang.handler.V2RayServiceManager import com.v2ray.ang.util.Utils import com.v2ray.ang.viewmodel.MainViewModel @@ -188,7 +189,7 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList if (mainViewModel.isRunning.value == true) { V2RayServiceManager.stopVService(this) - } else if ((MmkvManager.decodeSettingsString(AppConfig.PREF_MODE) ?: VPN) == VPN) { + } else if (SettingsManager.isVpnMode()) { val intent = VpnService.prepare(this) if (intent == null) { startV2Ray()