From 2a6edd98be59995216c81e70f6b13f02cc861252 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Tue, 19 May 2026 09:48:49 +0800 Subject: [PATCH] Add SOCKS4/5 and map-based parser lookup https://github.com/2dust/v2rayNG/issues/5649 --- .../src/main/java/com/v2ray/ang/AppConfig.kt | 2 ++ .../com/v2ray/ang/handler/AngConfigManager.kt | 34 +++++++++---------- 2 files changed, 19 insertions(+), 17 deletions(-) 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 e974cc6e..3cd4c097 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/AppConfig.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/AppConfig.kt @@ -180,6 +180,8 @@ object AppConfig { const val CUSTOM = "" const val SHADOWSOCKS = "ss://" const val SOCKS = "socks://" + const val SOCKS4 = "socks4://" + const val SOCKS5 = "socks5://" const val HTTP = "http://" const val VLESS = "vless://" const val TROJAN = "trojan://" diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/handler/AngConfigManager.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/handler/AngConfigManager.kt index d087a86f..e9d58677 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/handler/AngConfigManager.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/handler/AngConfigManager.kt @@ -4,7 +4,6 @@ import android.content.Context import android.graphics.Bitmap import android.text.TextUtils import com.v2ray.ang.AppConfig -import com.v2ray.ang.AppConfig.HY2 import com.v2ray.ang.R import com.v2ray.ang.core.CoreConfigManager import com.v2ray.ang.dto.entities.ProfileItem @@ -31,6 +30,21 @@ import java.net.URI object AngConfigManager { + // Parser mapping for different config types (lazy initialized) + private val configFmtParsers: Map ProfileItem?> by lazy { + mapOf( + EConfigType.VMESS.protocolScheme to VmessFmt::parse, + EConfigType.SHADOWSOCKS.protocolScheme to ShadowsocksFmt::parse, + EConfigType.SOCKS.protocolScheme to SocksFmt::parse, + AppConfig.SOCKS4 to SocksFmt::parse, + AppConfig.SOCKS5 to SocksFmt::parse, + EConfigType.TROJAN.protocolScheme to TrojanFmt::parse, + EConfigType.VLESS.protocolScheme to VlessFmt::parse, + EConfigType.WIREGUARD.protocolScheme to WireguardFmt::parse, + EConfigType.HYSTERIA2.protocolScheme to Hysteria2Fmt::parse, + AppConfig.HY2 to Hysteria2Fmt::parse + ) + } /** * Shares the configuration to the clipboard. @@ -453,22 +467,8 @@ object AngConfigManager { return null } - val config = if (str.startsWith(EConfigType.VMESS.protocolScheme)) { - VmessFmt.parse(str) - } else if (str.startsWith(EConfigType.SHADOWSOCKS.protocolScheme)) { - ShadowsocksFmt.parse(str) - } else if (str.startsWith(EConfigType.SOCKS.protocolScheme)) { - SocksFmt.parse(str) - } else if (str.startsWith(EConfigType.TROJAN.protocolScheme)) { - TrojanFmt.parse(str) - } else if (str.startsWith(EConfigType.VLESS.protocolScheme)) { - VlessFmt.parse(str) - } else if (str.startsWith(EConfigType.WIREGUARD.protocolScheme)) { - WireguardFmt.parse(str) - } else if (str.startsWith(EConfigType.HYSTERIA2.protocolScheme) || str.startsWith(HY2)) { - Hysteria2Fmt.parse(str) - } else { - null + val config = configFmtParsers.firstNotNullOfOrNull { (scheme, parser) -> + if (str.startsWith(scheme)) parser(str) else null } if (config == null) {