diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/core/CoreOutboundBuilder.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/core/CoreOutboundBuilder.kt
index 213a090fa5..66f685c5ec 100644
--- a/V2rayNG/app/src/main/java/com/v2ray/ang/core/CoreOutboundBuilder.kt
+++ b/V2rayNG/app/src/main/java/com/v2ray/ang/core/CoreOutboundBuilder.kt
@@ -566,6 +566,7 @@ object CoreOutboundBuilder {
serverName = sni.nullIfBlank(),
fingerprint = profileItem.fingerPrint.nullIfBlank(),
alpn = profileItem.alpn?.split(",")?.map { it.trim() }?.filter { it.isNotEmpty() }.takeIf { !it.isNullOrEmpty() },
+ cipherSuites = profileItem.cipherSuites.nullIfBlank(),
echConfigList = profileItem.echConfigList.nullIfBlank(),
verifyPeerCertByName = profileItem.verifyPeerCertByName.nullIfBlank(),
pinnedPeerCertSha256 = profileItem.pinnedCA256.nullIfBlank(),
diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/dto/entities/ProfileItem.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/dto/entities/ProfileItem.kt
index 9a4a87d6c8..6352e8419e 100644
--- a/V2rayNG/app/src/main/java/com/v2ray/ang/dto/entities/ProfileItem.kt
+++ b/V2rayNG/app/src/main/java/com/v2ray/ang/dto/entities/ProfileItem.kt
@@ -40,6 +40,7 @@ data class ProfileItem(
var sni: String? = null,
var alpn: String? = null,
var fingerPrint: String? = null,
+ var cipherSuites: String? = null,
var insecure: Boolean? = null,
var echConfigList: String? = null,
var verifyPeerCertByName: String? = null,
diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/ServerActivity.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/ServerActivity.kt
index a8dd86723a..f1ecc7f43a 100644
--- a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/ServerActivity.kt
+++ b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/ServerActivity.kt
@@ -121,6 +121,8 @@ class ServerActivity : BaseActivity() {
private val et_path: EditText? by lazy { findViewById(R.id.et_path) }
private val sp_stream_alpn: Spinner? by lazy { findViewById(R.id.sp_stream_alpn) } //uTLS
private val container_alpn: LinearLayout? by lazy { findViewById(R.id.lay_stream_alpn) }
+ private val et_cipher_suites: EditText? by lazy { findViewById(R.id.et_cipher_suites) }
+ private val container_cipher_suites: LinearLayout? by lazy { findViewById(R.id.lay_cipher_suites) }
private val et_public_key: EditText? by lazy { findViewById(R.id.et_public_key) }
private val et_preshared_key: EditText? by lazy { findViewById(R.id.et_preshared_key) }
private val container_public_key: LinearLayout? by lazy { findViewById(R.id.lay_public_key) }
@@ -298,6 +300,7 @@ class ServerActivity : BaseActivity() {
container_sni,
container_fingerprint,
container_alpn,
+ container_cipher_suites,
container_allow_insecure,
container_public_key,
container_short_id,
@@ -315,6 +318,7 @@ class ServerActivity : BaseActivity() {
container_sni,
container_fingerprint,
container_alpn,
+ container_cipher_suites,
container_allow_insecure,
container_ech_config_list,
container_verify_peer_cert_by_name,
@@ -336,6 +340,7 @@ class ServerActivity : BaseActivity() {
).forEach { it?.visibility = View.VISIBLE }
listOf(
container_alpn,
+ container_cipher_suites,
container_allow_insecure,
container_ech_config_list,
container_verify_peer_cert_by_name,
@@ -424,6 +429,7 @@ class ServerActivity : BaseActivity() {
if (allowinsecure >= 0) {
sp_allow_insecure?.setSelection(allowinsecure)
}
+ et_cipher_suites?.text = Utils.getEditable(config.cipherSuites)
et_ech_config_list?.text = Utils.getEditable(config.echConfigList)
et_verify_peer_cert_by_name?.text = Utils.getEditable(config.verifyPeerCertByName)
et_pinned_ca256?.text = Utils.getEditable(config.pinnedCA256)
@@ -628,6 +634,7 @@ class ServerActivity : BaseActivity() {
val shortId = et_short_id?.text?.toString()
val spiderX = et_spider_x?.text?.toString()
val mldsa65Verify = et_mldsa65_verify?.text?.toString()
+ val cipherSuites = et_cipher_suites?.text?.toString()
val echConfigList = et_ech_config_list?.text?.toString()
val verifyPeerCertByName = et_verify_peer_cert_by_name?.text?.toString()
val pinnedCA256 = et_pinned_ca256?.text?.toString()
@@ -644,6 +651,7 @@ class ServerActivity : BaseActivity() {
config.sni = sniField
config.fingerPrint = uTlsItems[utlsIndex]
config.alpn = alpns[alpnIndex]
+ config.cipherSuites = cipherSuites
config.publicKey = publicKey
config.shortId = shortId
config.spiderX = spiderX
diff --git a/V2rayNG/app/src/main/res/layout/layout_tls.xml b/V2rayNG/app/src/main/res/layout/layout_tls.xml
index 76f23645a5..4f6ba44610 100644
--- a/V2rayNG/app/src/main/res/layout/layout_tls.xml
+++ b/V2rayNG/app/src/main/res/layout/layout_tls.xml
@@ -92,6 +92,27 @@
android:layout_marginTop="@dimen/padding_spacing_dp8"
android:layout_marginBottom="@dimen/padding_spacing_dp8"
android:entries="@array/streamsecurity_alpn"
+ android:nextFocusDown="@+id/et_cipher_suites" />
+
+
+
+
+
+
+
+
diff --git a/V2rayNG/app/src/main/res/values/arrays.xml b/V2rayNG/app/src/main/res/values/arrays.xml
index 6fb75c98c2..3ee85e70eb 100644
--- a/V2rayNG/app/src/main/res/values/arrays.xml
+++ b/V2rayNG/app/src/main/res/values/arrays.xml
@@ -82,6 +82,7 @@
- qq
- random
- randomized
+ - unsafe
diff --git a/V2rayNG/app/src/main/res/values/strings.xml b/V2rayNG/app/src/main/res/values/strings.xml
index 419e5b6a7f..b586824660 100644
--- a/V2rayNG/app/src/main/res/values/strings.xml
+++ b/V2rayNG/app/src/main/res/values/strings.xml
@@ -71,6 +71,7 @@
TLS
Fingerprint
Alpn
+ Cipher Suites
allowInsecure
SNI
address