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 55b351b5..b49077cd 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/AppConfig.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/AppConfig.kt @@ -58,10 +58,12 @@ object AppConfig { const val PREF_PREFER_IPV6 = "pref_prefer_ipv6" const val PREF_PROXY_SHARING = "pref_proxy_sharing_enabled" const val PREF_ALLOW_INSECURE = "pref_allow_insecure" + const val PREF_ENABLE_LOCAL_PROXY = "pref_enable_local_proxy" const val PREF_SOCKS_PORT = "pref_socks_port" const val PREF_DYNAMIC_SOCKS_PORT = "pref_dynamic_socks_port" const val PREF_SOCKS_USERNAME = "pref_socks_username" const val PREF_SOCKS_PASSWORD = "pref_socks_password" + const val PREF_SOCKS_ENABLE_UDP = "pref_socks_enable_udp" const val PREF_REMOTE_DNS = "pref_remote_dns" const val PREF_DOMESTIC_DNS = "pref_domestic_dns" const val PREF_DNS_HOSTS = "pref_dns_hosts" 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 a2db386f..4b5e00b0 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 @@ -384,6 +384,12 @@ object V2rayConfigManager { */ private fun getInbounds(v2rayConfig: V2rayConfig): Boolean { try { + val vpn = SettingsManager.isVpnMode() + val useHev = SettingsManager.isUsingHevTun() + val forcedByHev = vpn && useHev + + val enableLocalProxy = forcedByHev || MmkvManager.decodeSettingsBool(AppConfig.PREF_ENABLE_LOCAL_PROXY, true) + val socksPort = SettingsManager.getSocksPort() val socksUsername = SettingsManager.getSocksUsername() val socksPassword = SettingsManager.getSocksPassword() @@ -396,6 +402,7 @@ object V2rayConfigManager { inbound1.listen = AppConfig.LOOPBACK } inbound1.port = socksPort + inbound1.settings?.udp = MmkvManager.decodeSettingsBool(AppConfig.PREF_SOCKS_ENABLE_UDP, true) if (socksUsername != null && socksPassword != null) { inbound1.settings?.auth = "password" inbound1.settings?.accounts = listOf( @@ -431,6 +438,10 @@ object V2rayConfigManager { v2rayConfig.inbounds.add(inbound2) } + if (!enableLocalProxy) { + v2rayConfig.inbounds.removeIf { it.protocol == "socks" || it.protocol == "http" } + } + if (needTun()) { val inboundTun = v2rayConfig.inbounds.firstOrNull { e -> e.tag == "tun" } inboundTun?.settings?.mtu = SettingsManager.getVpnMtu() diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/SettingsActivity.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/SettingsActivity.kt index 8d883bfe..c4ffa645 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/SettingsActivity.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/SettingsActivity.kt @@ -51,13 +51,19 @@ class SettingsActivity : BaseActivity() { private val autoUpdateCheck by lazy { findPreference(AppConfig.SUBSCRIPTION_AUTO_UPDATE) } private val autoUpdateInterval by lazy { findPreference(AppConfig.SUBSCRIPTION_AUTO_UPDATE_INTERVAL) } private val mode by lazy { findPreference(AppConfig.PREF_MODE) } - private val socksPort by lazy { findPreference(AppConfig.PREF_SOCKS_PORT) } - private val dynamicSocksPort by lazy { findPreference(AppConfig.PREF_DYNAMIC_SOCKS_PORT) } private val hevTunLogLevel by lazy { findPreference(AppConfig.PREF_HEV_TUNNEL_LOGLEVEL) } private val hevTunRwTimeout by lazy { findPreference(AppConfig.PREF_HEV_TUNNEL_RW_TIMEOUT) } private val useHevTun by lazy { findPreference(AppConfig.PREF_USE_HEV_TUNNEL) } + private val enableLocalProxy by lazy { findPreference(AppConfig.PREF_ENABLE_LOCAL_PROXY) } + private val socksPort by lazy { findPreference(AppConfig.PREF_SOCKS_PORT) } + private val dynamicSocksPort by lazy { findPreference(AppConfig.PREF_DYNAMIC_SOCKS_PORT) } + private val socksUsername by lazy { findPreference(AppConfig.PREF_SOCKS_USERNAME) } + private val socksPassword by lazy { findPreference(AppConfig.PREF_SOCKS_PASSWORD) } + private val socksEnableUdp by lazy { findPreference(AppConfig.PREF_SOCKS_ENABLE_UDP) } + private val proxySharing by lazy { findPreference(AppConfig.PREF_PROXY_SHARING) } + override fun onCreatePreferences(bundle: Bundle?, s: String?) { // Use MMKV as the storage backend for all Preferences // This prevents inconsistencies between SharedPreferences and MMKV @@ -115,6 +121,11 @@ class SettingsActivity : BaseActivity() { true } + enableLocalProxy?.setOnPreferenceChangeListener { _, newValue -> + updateEnableLocalProxy(newValue as Boolean) + true + } + dynamicSocksPort?.setOnPreferenceChangeListener { _, newValue -> updateDynamicSocksPort(newValue as Boolean) true @@ -174,6 +185,9 @@ class SettingsActivity : BaseActivity() { // Initialize mode-dependent UI states updateMode(MmkvManager.decodeSettingsString(AppConfig.PREF_MODE, VPN)) + // Initialize local proxy state + updateEnableLocalProxy(MmkvManager.decodeSettingsBool(AppConfig.PREF_ENABLE_LOCAL_PROXY, true)) + // Initialize mux-dependent UI states updateMux(MmkvManager.decodeSettingsBool(AppConfig.PREF_MUX_ENABLED, false)) @@ -276,12 +290,44 @@ class SettingsActivity : BaseActivity() { } private fun updateDynamicSocksPort(enabled: Boolean) { - socksPort?.isEnabled = !enabled + socksPort?.isEnabled = (enableLocalProxy?.isChecked == true) && !enabled + } + + private fun updateEnableLocalProxy(enabled: Boolean) { + val dynamic = MmkvManager.decodeSettingsBool(AppConfig.PREF_DYNAMIC_SOCKS_PORT, false) + socksPort?.isEnabled = enabled && !dynamic + dynamicSocksPort?.isEnabled = enabled + socksUsername?.isEnabled = enabled + socksPassword?.isEnabled = enabled + socksEnableUdp?.isEnabled = enabled + proxySharing?.isEnabled = enabled + + if (!enabled) { + if (appendHttpProxy?.isChecked == true) { + appendHttpProxy?.isChecked = false + MmkvManager.encodeSettings(AppConfig.PREF_APPEND_HTTP_PROXY, false) + } + appendHttpProxy?.isEnabled = false + } else { + val vpn = MmkvManager.decodeSettingsString(AppConfig.PREF_MODE) == VPN + appendHttpProxy?.isEnabled = vpn + } } private fun updateHevTunSettings(enabled: Boolean) { hevTunLogLevel?.isEnabled = enabled hevTunRwTimeout?.isEnabled = enabled + + if (enabled) { + if (enableLocalProxy?.isChecked == false) { + enableLocalProxy?.isChecked = true + MmkvManager.encodeSettings(AppConfig.PREF_ENABLE_LOCAL_PROXY, true) + } + enableLocalProxy?.isEnabled = false + } else { + enableLocalProxy?.isEnabled = true + } + updateEnableLocalProxy(enableLocalProxy?.isChecked == true) } } diff --git a/V2rayNG/app/src/main/res/values-ar/strings.xml b/V2rayNG/app/src/main/res/values-ar/strings.xml index 989243f0..bdab62cc 100644 --- a/V2rayNG/app/src/main/res/values-ar/strings.xml +++ b/V2rayNG/app/src/main/res/values-ar/strings.xml @@ -223,6 +223,10 @@ عند TLS، الافتراضي هو السماح غير الآمن منفذ بروكسي Local + تفعيل الوكيل المحلي + When disabled, no SOCKS proxy is available, so subscription updates and similar actions cannot use the proxy + SOCKS5 UDP + مصادقة socks5 ليست آمنة تمامًا عند استخدام UDP منفذ بروكسي Local Enable dynamic local proxy port Generate a random local proxy port each time the inbound is created diff --git a/V2rayNG/app/src/main/res/values-bn/strings.xml b/V2rayNG/app/src/main/res/values-bn/strings.xml index 6efc80f9..03a7da93 100644 --- a/V2rayNG/app/src/main/res/values-bn/strings.xml +++ b/V2rayNG/app/src/main/res/values-bn/strings.xml @@ -223,6 +223,10 @@ যখন TLS, ডিফল্টভাবে allowInsecure Local প্রক্সি পোর্ট + লোকাল প্রক্সি সক্ষম করুন + When disabled, no SOCKS proxy is available, so subscription updates and similar actions cannot use the proxy + SOCKS5 UDP + UDP ব্যবহার করার সময় socks5 প্রমাণীকরণ সম্পূর্ণরূপে নিরাপদ নয় Local প্রক্সি পোর্ট Enable dynamic local proxy port Generate a random local proxy port each time the inbound is created 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 a92f7709..4ccb4349 100644 --- a/V2rayNG/app/src/main/res/values-bqi-rIR/strings.xml +++ b/V2rayNG/app/src/main/res/values-bqi-rIR/strings.xml @@ -223,6 +223,10 @@ مجال و کار بوردن TLS ب تۉر پؽش فرز، موجوز نا ٱمن فعال هڌ. پورت پروکسی مهلی + فعال‌سازی پروکسی محلی + When disabled, no SOCKS proxy is available, so subscription updates and similar actions cannot use the proxy + SOCKS5 UDP + احراز هویت socks5 هنگام استفاده از UDP کاملاً ایمن نیست پورت پروکسی مهلی Enable dynamic local proxy port Generate a random local proxy port each time the inbound is created diff --git a/V2rayNG/app/src/main/res/values-fa/strings.xml b/V2rayNG/app/src/main/res/values-fa/strings.xml index d7f2d009..60450338 100644 --- a/V2rayNG/app/src/main/res/values-fa/strings.xml +++ b/V2rayNG/app/src/main/res/values-fa/strings.xml @@ -221,6 +221,10 @@ هنگام استفاده از TLS، به طور پیش‌ فرض مجوز ناامن فعال است. پورت پروکسی محلی + فعال‌سازی پروکسی محلی + When disabled, no SOCKS proxy is available, so subscription updates and similar actions cannot use the proxy + SOCKS5 UDP + احراز هویت socks5 هنگام استفاده از UDP کاملاً ایمن نیست پورت پروکسی محلی Enable dynamic local proxy port Generate a random local proxy port each time the inbound is created diff --git a/V2rayNG/app/src/main/res/values-ru/strings.xml b/V2rayNG/app/src/main/res/values-ru/strings.xml index 10539a92..009dbad5 100644 --- a/V2rayNG/app/src/main/res/values-ru/strings.xml +++ b/V2rayNG/app/src/main/res/values-ru/strings.xml @@ -225,6 +225,10 @@ Для TLS по умолчанию разрешены небезопасные соединения Порт локального прокси + Включить локальный прокси + When disabled, no SOCKS proxy is available, so subscription updates and similar actions cannot use the proxy + SOCKS5 UDP + Аутентификация socks5 не полностью безопасна при использовании UDP Порт локального прокси Динамически менять порт локального прокси Использовать случайный порт локального прокси при каждом создании соединения diff --git a/V2rayNG/app/src/main/res/values-vi/strings.xml b/V2rayNG/app/src/main/res/values-vi/strings.xml index b2da9945..c15d7689 100644 --- a/V2rayNG/app/src/main/res/values-vi/strings.xml +++ b/V2rayNG/app/src/main/res/values-vi/strings.xml @@ -223,6 +223,10 @@ Khi nhập những cấu hình có bảo mật TLS, mặc định sẽ không xác minh chứng chỉ. Cổng Proxy Local + Bật proxy cục bộ + When disabled, no SOCKS proxy is available, so subscription updates and similar actions cannot use the proxy + SOCKS5 UDP + Xác thực socks5 không hoàn toàn an toàn khi sử dụng UDP Cổng Proxy Local Enable dynamic local proxy port Generate a random local proxy port each time the inbound is created 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 b4d03189..35fd1704 100644 --- a/V2rayNG/app/src/main/res/values-zh-rCN/strings.xml +++ b/V2rayNG/app/src/main/res/values-zh-rCN/strings.xml @@ -220,6 +220,10 @@ 传输层安全选 tls 时,默认跳过证书验证 (allowInsecure) 本地代理端口 + 启用本地代理 + 不开启时没有 socks 代理,无法通过代理更新订阅等 + SOCKS5 UDP + 使用 UDP 时,socks5 认证并不完全安全 本地代理端口 启用动态本地代理端口 每次生成 inbound 时随机生成一个本地代理端口 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 b990e1ad..67d87c10 100644 --- a/V2rayNG/app/src/main/res/values-zh-rTW/strings.xml +++ b/V2rayNG/app/src/main/res/values-zh-rTW/strings.xml @@ -221,6 +221,10 @@ 傳輸層安全選 tls 時,預設跳過憑證驗證 (allowInsecure) 本地代理埠 + 啟用本地代理 + 未開啟時沒有 socks 代理,無法透過代理更新訂閱等 + SOCKS5 UDP + 使用 UDP 時,socks5 認證並不完全安全 本地代理埠 啟用動態本地代理埠 每次產生 inbound 時隨機產生一個本地代理埠 diff --git a/V2rayNG/app/src/main/res/values/strings.xml b/V2rayNG/app/src/main/res/values/strings.xml index 635ff0e2..f11b19c7 100644 --- a/V2rayNG/app/src/main/res/values/strings.xml +++ b/V2rayNG/app/src/main/res/values/strings.xml @@ -227,6 +227,10 @@ When TLS is selected, allow insecure connections by default Local proxy port + Enable local proxy + When disabled, no SOCKS proxy is available, so subscription updates and similar actions cannot use the proxy + SOCKS5 UDP + SOCKS5 authentication is not fully secure when using UDP. Local proxy port Enable dynamic local proxy port Generate a random local proxy port each time the inbound is created diff --git a/V2rayNG/app/src/main/res/xml/pref_settings.xml b/V2rayNG/app/src/main/res/xml/pref_settings.xml index d83fd336..19a086b1 100644 --- a/V2rayNG/app/src/main/res/xml/pref_settings.xml +++ b/V2rayNG/app/src/main/res/xml/pref_settings.xml @@ -146,15 +146,20 @@ + android:key="pref_allow_insecure" + android:title="@string/title_pref_allow_insecure" /> + + + android:key="pref_proxy_sharing_enabled" + android:summary="@string/summary_pref_proxy_sharing_enabled" + android:title="@string/title_pref_proxy_sharing_enabled" /> + +