diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/fmt/FmtBase.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/fmt/FmtBase.kt index 97357cb4..e657fa47 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/fmt/FmtBase.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/fmt/FmtBase.kt @@ -3,7 +3,7 @@ package com.v2ray.ang.fmt import com.v2ray.ang.AppConfig import com.v2ray.ang.dto.NetworkType import com.v2ray.ang.dto.ProfileItem -import com.v2ray.ang.extension.isNotNullEmpty +import com.v2ray.ang.extension.nullIfBlank import com.v2ray.ang.handler.MmkvManager import com.v2ray.ang.util.HttpUtil import com.v2ray.ang.util.Utils @@ -100,16 +100,16 @@ open class FmtBase { fun getQueryDic(config: ProfileItem): HashMap { val dicQuery = HashMap() dicQuery["security"] = config.security?.ifEmpty { "none" }.orEmpty() - config.sni.let { if (it.isNotNullEmpty()) dicQuery["sni"] = it.orEmpty() } - config.alpn.let { if (it.isNotNullEmpty()) dicQuery["alpn"] = it.orEmpty() } - config.echConfigList.let { if (it.isNotNullEmpty()) dicQuery["ech"] = it.orEmpty() } - config.pinnedCA256.let { if (it.isNotNullEmpty()) dicQuery["pcs"] = it.orEmpty() } - config.fingerPrint.let { if (it.isNotNullEmpty()) dicQuery["fp"] = it.orEmpty() } - config.publicKey.let { if (it.isNotNullEmpty()) dicQuery["pbk"] = it.orEmpty() } - config.shortId.let { if (it.isNotNullEmpty()) dicQuery["sid"] = it.orEmpty() } - config.spiderX.let { if (it.isNotNullEmpty()) dicQuery["spx"] = it.orEmpty() } - config.mldsa65Verify.let { if (it.isNotNullEmpty()) dicQuery["pqv"] = it.orEmpty() } - config.flow.let { if (it.isNotNullEmpty()) dicQuery["flow"] = it.orEmpty() } + config.sni?.nullIfBlank()?.let { dicQuery["sni"] = it } + config.alpn?.nullIfBlank()?.let { dicQuery["alpn"] = it } + config.echConfigList?.nullIfBlank()?.let { dicQuery["ech"] = it } + config.pinnedCA256?.nullIfBlank()?.let { dicQuery["pcs"] = it } + config.fingerPrint?.nullIfBlank()?.let { dicQuery["fp"] = it } + config.publicKey?.nullIfBlank()?.let { dicQuery["pbk"] = it } + config.shortId?.nullIfBlank()?.let { dicQuery["sid"] = it } + config.spiderX?.nullIfBlank()?.let { dicQuery["spx"] = it } + config.mldsa65Verify?.nullIfBlank()?.let { dicQuery["pqv"] = it } + config.flow?.nullIfBlank()?.let { dicQuery["flow"] = it } // Add two keys for compatibility: "insecure" and "allowInsecure" if (config.security == AppConfig.TLS) { val insecureFlag = if (config.insecure == true) "1" else "0" @@ -123,42 +123,42 @@ open class FmtBase { when (networkType) { NetworkType.TCP -> { dicQuery["headerType"] = config.headerType?.ifEmpty { "none" }.orEmpty() - config.host.let { if (it.isNotNullEmpty()) dicQuery["host"] = it.orEmpty() } + config.host?.nullIfBlank()?.let { dicQuery["host"] = it } } NetworkType.KCP -> { dicQuery["headerType"] = config.headerType?.ifEmpty { "none" }.orEmpty() - config.seed.let { if (it.isNotNullEmpty()) dicQuery["seed"] = it.orEmpty() } + config.seed?.nullIfBlank()?.let { dicQuery["seed"] = it } } NetworkType.WS, NetworkType.HTTP_UPGRADE -> { - config.host.let { if (it.isNotNullEmpty()) dicQuery["host"] = it.orEmpty() } - config.path.let { if (it.isNotNullEmpty()) dicQuery["path"] = it.orEmpty() } + config.host?.nullIfBlank()?.let { dicQuery["host"] = it } + config.path?.nullIfBlank()?.let { dicQuery["path"] = it } } NetworkType.XHTTP -> { - config.host.let { if (it.isNotNullEmpty()) dicQuery["host"] = it.orEmpty() } - config.path.let { if (it.isNotNullEmpty()) dicQuery["path"] = it.orEmpty() } - config.xhttpMode.let { if (it.isNotNullEmpty()) dicQuery["mode"] = it.orEmpty() } - config.xhttpExtra.let { if (it.isNotNullEmpty()) dicQuery["extra"] = it.orEmpty() } + config.host?.nullIfBlank()?.let { dicQuery["host"] = it } + config.path?.nullIfBlank()?.let { dicQuery["path"] = it } + config.xhttpMode?.nullIfBlank()?.let { dicQuery["mode"] = it } + config.xhttpExtra?.nullIfBlank()?.let { dicQuery["extra"] = it } } NetworkType.HTTP, NetworkType.H2 -> { dicQuery["type"] = "http" - config.host.let { if (it.isNotNullEmpty()) dicQuery["host"] = it.orEmpty() } - config.path.let { if (it.isNotNullEmpty()) dicQuery["path"] = it.orEmpty() } + config.host?.nullIfBlank()?.let { dicQuery["host"] = it } + config.path?.nullIfBlank()?.let { dicQuery["path"] = it } } // NetworkType.QUIC -> { // dicQuery["headerType"] = config.headerType?.ifEmpty { "none" }.orEmpty() -// config.quicSecurity.let { if (it.isNotNullEmpty()) dicQuery["quicSecurity"] = it.orEmpty() } -// config.quicKey.let { if (it.isNotNullEmpty()) dicQuery["key"] = it.orEmpty() } +// config.quicSecurity?.nullIfBlank()?.let { dicQuery["quicSecurity"] = it } +// config.quicKey?.nullIfBlank()?.let { dicQuery["key"] = it } // } NetworkType.GRPC -> { - config.mode.let { if (it.isNotNullEmpty()) dicQuery["mode"] = it.orEmpty() } - config.authority.let { if (it.isNotNullEmpty()) dicQuery["authority"] = it.orEmpty() } - config.serviceName.let { if (it.isNotNullEmpty()) dicQuery["serviceName"] = it.orEmpty() } + config.mode?.nullIfBlank()?.let { dicQuery["mode"] = it } + config.authority?.nullIfBlank()?.let { dicQuery["authority"] = it } + config.serviceName?.nullIfBlank()?.let { dicQuery["serviceName"] = it } } else -> {} diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/fmt/Hysteria2Fmt.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/fmt/Hysteria2Fmt.kt index 29efd8de..49aea271 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/fmt/Hysteria2Fmt.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/fmt/Hysteria2Fmt.kt @@ -9,6 +9,7 @@ import com.v2ray.ang.dto.V2rayConfig.OutboundBean.StreamSettingsBean import com.v2ray.ang.dto.V2rayConfig.OutboundBean.StreamSettingsBean.UdpMasksBean.UdpMasksSettingsBean import com.v2ray.ang.extension.idnHost import com.v2ray.ang.extension.isNotNullEmpty +import com.v2ray.ang.extension.nullIfBlank import com.v2ray.ang.handler.MmkvManager import com.v2ray.ang.handler.V2rayConfigManager import com.v2ray.ang.util.Utils @@ -61,8 +62,8 @@ object Hysteria2Fmt : FmtBase() { val dicQuery = HashMap() config.security.let { if (it != null) dicQuery["security"] = it } - config.sni.let { if (it.isNotNullEmpty()) dicQuery["sni"] = it.orEmpty() } - config.alpn.let { if (it.isNotNullEmpty()) dicQuery["alpn"] = it.orEmpty() } + config.sni?.nullIfBlank()?.let { dicQuery["sni"] = it } + config.alpn?.nullIfBlank()?.let { dicQuery["alpn"] = it } config.insecure.let { dicQuery["insecure"] = if (it == true) "1" else "0" } if (config.obfsPassword.isNotNullEmpty()) { diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/fmt/VmessFmt.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/fmt/VmessFmt.kt index 2b358688..f6cfe7ff 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/fmt/VmessFmt.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/fmt/VmessFmt.kt @@ -10,6 +10,7 @@ import com.v2ray.ang.dto.V2rayConfig.OutboundBean import com.v2ray.ang.dto.VmessQRCode import com.v2ray.ang.extension.idnHost import com.v2ray.ang.extension.isNotNullEmpty +import com.v2ray.ang.extension.nullIfBlank import com.v2ray.ang.handler.MmkvManager import com.v2ray.ang.handler.V2rayConfigManager import com.v2ray.ang.util.JsonUtil @@ -132,8 +133,8 @@ object VmessFmt : FmtBase() { else -> {} } - config.host.let { if (it.isNotNullEmpty()) vmessQRCode.host = it.orEmpty() } - config.path.let { if (it.isNotNullEmpty()) vmessQRCode.path = it.orEmpty() } + config.host?.nullIfBlank()?.let { vmessQRCode.host = it } + config.path?.nullIfBlank()?.let { vmessQRCode.path = it } vmessQRCode.tls = config.security.orEmpty() vmessQRCode.sni = config.sni.orEmpty() diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/fmt/WireguardFmt.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/fmt/WireguardFmt.kt index b22d8cd3..5da31409 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/fmt/WireguardFmt.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/fmt/WireguardFmt.kt @@ -6,6 +6,7 @@ import com.v2ray.ang.dto.EConfigType import com.v2ray.ang.dto.ProfileItem import com.v2ray.ang.dto.V2rayConfig.OutboundBean import com.v2ray.ang.extension.idnHost +import com.v2ray.ang.extension.nullIfBlank import com.v2ray.ang.extension.removeWhiteSpace import com.v2ray.ang.handler.V2rayConfigManager import com.v2ray.ang.util.Utils @@ -32,7 +33,7 @@ object WireguardFmt : FmtBase() { config.secretKey = uri.userInfo.orEmpty() config.localAddress = queryParam["address"] ?: WIREGUARD_LOCAL_ADDRESS_V4 config.publicKey = queryParam["publickey"].orEmpty() - config.preSharedKey = queryParam["presharedkey"]?.takeIf { it.isNotEmpty() } + config.preSharedKey = queryParam["presharedkey"]?.nullIfBlank() config.mtu = Utils.parseInt(queryParam["mtu"] ?: AppConfig.WIREGUARD_LOCAL_MTU) config.reserved = queryParam["reserved"] ?: "0,0,0" @@ -84,7 +85,7 @@ object WireguardFmt : FmtBase() { config.localAddress = interfaceParams["address"] ?: WIREGUARD_LOCAL_ADDRESS_V4 config.mtu = Utils.parseInt(interfaceParams["mtu"] ?: AppConfig.WIREGUARD_LOCAL_MTU) config.publicKey = peerParams["publickey"].orEmpty() - config.preSharedKey = peerParams["presharedkey"]?.takeIf { it.isNotEmpty() } + config.preSharedKey = peerParams["presharedkey"]?.nullIfBlank() val endpoint = peerParams["endpoint"].orEmpty() val endpointParts = endpoint.split(":", limit = 2) if (endpointParts.size == 2) { @@ -113,7 +114,7 @@ object WireguardFmt : FmtBase() { wireguard.address = (profileItem.localAddress ?: WIREGUARD_LOCAL_ADDRESS_V4).split(",") wireguard.peers?.firstOrNull()?.let { peer -> peer.publicKey = profileItem.publicKey.orEmpty() - peer.preSharedKey = profileItem.preSharedKey?.takeIf { it.isNotEmpty() } + peer.preSharedKey = profileItem.preSharedKey?.nullIfBlank() peer.endpoint = Utils.getIpv6Address(profileItem.server) + ":${profileItem.serverPort}" } wireguard.mtu = profileItem.mtu 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 6ec3eac7..e8196717 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 @@ -1297,29 +1297,21 @@ object V2rayConfigManager { } else { profileItem.sni } - val fingerprint = profileItem.fingerPrint - val alpns = profileItem.alpn - val echConfigList = profileItem.echConfigList - val echForceQuery = profileItem.echForceQuery - val publicKey = profileItem.publicKey - val shortId = profileItem.shortId - val spiderX = profileItem.spiderX - val mldsa65Verify = profileItem.mldsa65Verify - streamSettings.security = if (streamSecurity.isEmpty()) null else streamSecurity + streamSettings.security = streamSecurity.nullIfBlank() if (streamSettings.security == null) return val tlsSetting = StreamSettingsBean.TlsSettingsBean( allowInsecure = allowInsecure, - serverName = if (sni.isNullOrEmpty()) null else sni, - fingerprint = if (fingerprint.isNullOrEmpty()) null else fingerprint, - alpn = if (alpns.isNullOrEmpty()) null else alpns.split(",").map { it.trim() }.filter { it.isNotEmpty() }, - echConfigList = if (echConfigList.isNullOrEmpty()) null else echConfigList, - echForceQuery = if (echForceQuery.isNullOrEmpty()) null else echForceQuery, - pinnedPeerCertSha256 = profileItem.pinnedCA256?.nullIfBlank(), - publicKey = if (publicKey.isNullOrEmpty()) null else publicKey, - shortId = if (shortId.isNullOrEmpty()) null else shortId, - spiderX = if (spiderX.isNullOrEmpty()) null else spiderX, - mldsa65Verify = if (mldsa65Verify.isNullOrEmpty()) null else mldsa65Verify, + serverName = sni.nullIfBlank(), + fingerprint = profileItem.fingerPrint.nullIfBlank(), + alpn = profileItem.alpn?.split(",")?.map { it.trim() }?.filter { it.isNotEmpty() }.takeIf { !it.isNullOrEmpty() }, + echConfigList = profileItem.echConfigList.nullIfBlank(), + echForceQuery = profileItem.echForceQuery.nullIfBlank(), + pinnedPeerCertSha256 = profileItem.pinnedCA256.nullIfBlank(), + publicKey = profileItem.publicKey.nullIfBlank(), + shortId = profileItem.shortId.nullIfBlank(), + spiderX = profileItem.spiderX.nullIfBlank(), + mldsa65Verify = profileItem.mldsa65Verify.nullIfBlank(), ) if (streamSettings.security == AppConfig.TLS) { streamSettings.tlsSettings = tlsSetting diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/RoutingEditActivity.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/RoutingEditActivity.kt index 42e2d2f2..86cb495b 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/RoutingEditActivity.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/RoutingEditActivity.kt @@ -8,6 +8,7 @@ import androidx.lifecycle.lifecycleScope import com.v2ray.ang.R import com.v2ray.ang.databinding.ActivityRoutingEditBinding import com.v2ray.ang.dto.RulesetItem +import com.v2ray.ang.extension.nullIfBlank import com.v2ray.ang.extension.toast import com.v2ray.ang.extension.toastSuccess import com.v2ray.ang.handler.SettingsManager @@ -62,14 +63,11 @@ class RoutingEditActivity : BaseActivity() { rulesetItem.apply { remarks = binding.etRemarks.text.toString() locked = binding.chkLocked.isChecked - domain = binding.etDomain.text.toString().takeIf { it.isNotEmpty() } - ?.split(",")?.map { it.trim() }?.filter { it.isNotEmpty() } - ip = binding.etIp.text.toString().takeIf { it.isNotEmpty() } - ?.split(",")?.map { it.trim() }?.filter { it.isNotEmpty() } - protocol = binding.etProtocol.text.toString().takeIf { it.isNotEmpty() } - ?.split(",")?.map { it.trim() }?.filter { it.isNotEmpty() } - port = binding.etPort.text.toString().takeIf { it.isNotEmpty() } - network = binding.etNetwork.text.toString().takeIf { it.isNotEmpty() } + domain = binding.etDomain.text.toString().nullIfBlank()?.split(",")?.map { it.trim() }?.filter { it.isNotEmpty() } + ip = binding.etIp.text.toString().nullIfBlank()?.split(",")?.map { it.trim() }?.filter { it.isNotEmpty() } + protocol = binding.etProtocol.text.toString().nullIfBlank()?.split(",")?.map { it.trim() }?.filter { it.isNotEmpty() } + port = binding.etPort.text.toString().nullIfBlank() + network = binding.etNetwork.text.toString().nullIfBlank() outboundTag = outbound_tag[binding.spOutboundTag.selectedItemPosition] }