1784 Commits
Author SHA1 Message Date
2dust aa4b05503a up 2.3.14 2.3.14 2026-10-28 10:40:04 +08:00
Yuriy Tumanov 7179f0838f Use the default port for Hysteria2 links without a port (#6358) 2026-10-28 10:12:18 +08:00
Miheichev Aleksandr Sergeevich 0d1c57000f build(deps): bump OkHttp from 5.5.0 to 5.5.1 (#6351) 2026-10-28 10:11:05 +08:00
Figim 40b8706ccd Update subscription page string in Azerbaijani (#6349)
Edit the translation added yesterday.
2026-10-28 10:10:50 +08:00
Miheichev Aleksandr Sergeevich 0f961c54c8 fix(deps): update hev-socks5-tunnel to 2.19.3 (#6357)
* chore(deps): update hev-socks5-tunnel to 2.19.2

* fix(root): disable jumbo for LAN forwarding

* fix(root): guard IPv6 LAN TSO fallback

* chore(deps): update hev-socks5-tunnel to 2.19.3
2026-10-25 18:49:47 +08:00
2dust 1b78a510f2 Revert "chore(deps): update hev-socks5-tunnel to 2.19.1 (#6328)"
This reverts commit 552cc2425d.
2026-10-24 18:45:21 +08:00
2dust 01b4630fdd up 2.3.13 2.3.13 2026-10-22 10:16:56 +08:00
Miheichev Aleksandr Sergeevich 6214bc19d4 ci: update actions/setup-java to v6.1.0 (#6327) 2026-10-22 10:00:24 +08:00
rasa68andrasa68 b8d13bf52c Show subscription usage info box (traffic, expiry, support link) on subscription groups (#6333)
* Show subscription usage info box on subscription groups

* Float the info box over the server list and make it translucent

---------

Co-authored-by: rasa68 <noreply@example.com>
2026-10-22 09:59:00 +08:00
Miheichev Aleksandr Sergeevich 3165bcf4fe chore(build): update Gradle wrapper to 9.8.2 (#6343) 2026-10-22 09:48:18 +08:00
rasa68andrasa68 eedb287cc9 Redesign subscription group tabs as a floating pill bar with count badges (#6336)
* Redesign subscription group tabs as a floating pill bar with count badges

* Group tabs: dark-mode bar tone, equal-width tabs when they fit, room around selected tab

---------

Co-authored-by: rasa68 <noreply@example.com>
2026-10-22 09:48:09 +08:00
Figim 59ff87606f Fix small symbol in Azerbaijani localization (#6341)
* Fix small symbol

* Fix space
2026-10-22 09:39:52 +08:00
dependabot[bot] 700740a187 Bump actions/setup-java from 6.0.1 to 6.1.0 (#6334)
Bumps [actions/setup-java](https://github.com/actions/setup-java) from 6.0.1 to 6.1.0.
- [Release notes](https://github.com/actions/setup-java/releases)
- [Commits](https://github.com/actions/setup-java/compare/v6.0.1...v6.1.0)

---
updated-dependencies:
- dependency-name: actions/setup-java
  dependency-version: 6.1.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-10-22 09:38:56 +08:00
fanymagnetandfanymagnet bb59a71cb9 fix(subscription): refresh main list after updating subscriptions (#6329)
Updating subscriptions from the subscription screen without auto-test replaced
profile GUIDs but did not request a main list refresh. The main screen kept stale
rows, and editing one opened an empty editor because its payloads had been removed.

Co-authored-by: fanymagnet <>
2026-10-22 09:38:35 +08:00
Miheichev Aleksandr Sergeevich 552cc2425d chore(deps): update hev-socks5-tunnel to 2.19.1 (#6328)
* chore(deps): update hev-socks5-tunnel to 2.19.0

* chore(deps): update hev-socks5-tunnel to 107a508
2026-10-22 09:38:02 +08:00
2dust c8f373bd3f Update AndroidLibXrayLite 2026-10-22 09:36:56 +08:00
2dust 118cf5bc7d up 2.3.12 2.3.12 2026-10-18 16:37:41 +08:00
2dust 58ca4cfe23 Update AndroidLibXrayLite 2026-10-18 16:32:00 +08:00
2dust e1b73f2fa8 up 2.3.11 2.3.11 2026-10-11 15:00:39 +08:00
Miheichev Aleksandr Sergeevich 143ab036bf chore(build): update Gradle wrapper to 9.8.1 and Kotlin to 2.4.21 (#6301)
Gradle 9.8.1 fixes three high-severity advisories that affect Gradle
9.0.0 to 9.8.0 (GHSA-mvvg-497x-hmj8, GHSA-xwqc-3h47-hg64,
GHSA-j5m7-59rp-24f5). Kotlin 2.4.21 is a bug-fix release for 2.4.20;
the app's Kotlin compiler output is byte-identical to the 2.4.20 build.
2026-10-11 14:26:09 +08:00
2dust a258ba8bc1 Update AndroidLibXrayLite 2026-10-11 14:21:26 +08:00
Figimand2dust e1b190d816 Azerbaijani localization support (#6302)
* Azerbaijani localization support

Azerbaijani localization support

* Add Azerbaijani language support in arrays.xml

* Fix

---------

Co-authored-by: 2dust <31833384+2dust@users.noreply.github.com>
2026-10-11 14:17:38 +08:00
Ray 4c9c9afdc9 fix(root): DNAT DNS queries from LAN resolvers to public IP (#6298)
In root mode, DNS (port 53) is marked into the tun and reaches the
core's SOCKS inbound as a UDP relay to the original resolver address
(e.g. 192.168.1.1:53). The core's routing rule
{inboundTag=socks, port=53, outboundTag=dns-out} should intercept it
and resolve via the configured remote DNS (e.g. Cloudflare DoH).

However, when the system DNS server is a private/LAN IP and the user
has a geoip:private → direct routing rule, that rule matches the
destination IP (192.168.1.1) and sends the DNS query straight to the
LAN resolver (ISP DNS) — bypassing dns-out entirely. This causes:
  - DNS poisoning for domains the ISP blocks/poisons
  - CDN mis-resolution (wrong POP)
  - Intermittent 'some sites work, some don't' behavior

Fix: add iptables nat OUTPUT DNAT to rewrite DNS queries destined for
private/LAN CIDRs to the configured remote DNS server (or 1.1.1.1
fallback), mirroring the existing tethered-client DNAT in
buildLanShareSetup. This prevents geoip:private from matching, so
dns-out can resolve via the proxy.

Verified on OnePlus 13R (OxygenOS 16, WildKernel v2.2.0-r4):
  - Before: youtube.com → 185.45.5.35 (fake ISP IP), timeout
  - After DNAT to 1.1.1.1: youtube.com → 142.251.45.14 (real), 301
  - tcpdump confirms response source changes from 192.168.1.1 to
    correct resolution through the proxy
2026-10-11 14:04:49 +08:00
Eliot the Cougar 6fe3893bfd Fix policy group fallback isolation (#6283)
Give least-ping and least-load groups their own first member as fallback so missing or failed probes cannot send a matched routing rule through the main profile. Keep least-load on its burst observatory and preserve random and round-robin fallback behavior. Cover group isolation and observatory selection with regression tests.
2026-10-06 15:32:19 +08:00
Miheichev Aleksandr Sergeevich 61c4e40ec1 test(root): fix flaky RootProcessRunner inherited-stdout test (#6282)
The test gave RootProcessRunner.run a 250 ms deadline. When sh takes
longer than that to start and finish, the runner hits the deadline,
destroys it and returns -1, and the test fails with
"expected: <0> but was: <-1>". With the sh from Git for Windows this
happened in 6 of 30 runs.

The test's real guard is the 1500 ms elapsed bound against the
background "sleep 5". A 3000 ms deadline leaves that bound alone to
decide the result, so a runner that keeps a finished command open until
its deadline now fails the test as well; with 250 ms it passed.
2026-10-06 15:29:09 +08:00
2dust 4a1510eb65 Refresh switch widget styling and icons 2026-10-06 15:23:04 +08:00
2dust 44a56f56bc Revert "Feat: Azerbaijani localization support and language selection (#6286)"
This reverts commit 3687436792.
2026-10-06 14:56:50 +08:00
Figim 3687436792 Feat: Azerbaijani localization support and language selection (#6286)
* Azerbaijani localization

Azerbaijani language support added

* Delete V2rayNG/app/src/main/res/values-az

* Azerbaijani localization support

Azerbaijani translations are now available

* Fix

* Add Azerbaijani language selection

* Update Azerbaijani strings in strings.xml

* Fix string formatting in Azerbaijani resource file
2026-10-06 14:48:39 +08:00
cin ffc9614417 feat(wireguard): add features from the new core version (#6290)
* feat(wireguard): add features from the new core version

- The `local` value is no longer allowed for `remoteDNS`. If this value is passed in the profile, the core will panic while calling `netip.MustParseAddr`.

- Add the `targetStrategy` field to `OutboundBean`.

- The `domainStrategy` field has been removed from `OutSettingsBean`. Any value passed for `domainStrategy` is now ignored.

* update locales

- ru,en - handwritten.
- other - AI-generated.
2026-10-06 14:43:02 +08:00
JaroWorldand2dust fcacb9cfb0 Keep fractional numbers when saving JSON array subscriptions (#6293)
* Keep fractional numbers when saving JSON array subscriptions

toJsonPretty wrote every Double through toInt(), so 0.4 became 0 and
values above Int.MAX_VALUE were clamped. Write whole numbers as Long
and leave other values as Double.

Fixes #6291

* Add a JsonUtil test for numbers in config arrays

* Update JsonUtil.kt

---------

Co-authored-by: 2dust <31833384+2dust@users.noreply.github.com>
2026-10-06 14:41:29 +08:00
2dust a4dd3d08de up 2.3.10 2.3.10 2026-10-01 17:00:28 +08:00
2dust ab09f816a0 Update libs.versions.toml 2026-10-01 16:17:33 +08:00
2dust 504f22d75b Fix server row text overlap in main pager 2026-10-01 16:13:46 +08:00
2dust 996b039b48 Update AndroidLibXrayLite 2026-10-01 15:58:47 +08:00
Miheichev Aleksandr SergeevichandClaude Opus 5.5 e151890c55 ci: update Android NDK to r30 (30.0.16248370) (#6275)
r30 is the current NDK LTS; r29 is no longer supported. The NDK path
is part of the libhevtun cache key, so the cached libraries are rebuilt
with the new toolchain.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 15:27:02 +08:00
Miheichev Aleksandr SergeevichandClaude Opus 5.5 04d407f5a1 chore(deps): update hev-socks5-tunnel to 2.18.0 (#6272)
64cc609 (2.16.0+24) -> d9dca26 (tag 2.18.0), 16 commits. Changes on
the paths the app uses:

- HevSocks5SessionUDP: skip datagrams without an address or with an
  empty payload, and set the IPv4 address type for a fixed UDP peer
  (c02e3fd)
- lwIP 2a11c14 -> e22c9d2: fix PRETEND handling of IPv6 extension
  headers and fragments, validate UDP PRETEND packets before accepting
  new sessions
- HevSocks5Tunnel: assert on the stop event write result (c362232)

The rest is tunnel code for Windows, macOS, FreeBSD and NetBSD, an
optional Windows-only tunnel.guid key, mapped DNS, the upstream AAR
build, docs and version bumps. JNI entry points, Android.mk/build.mk
and the config keys the app writes are unchanged.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 15:25:50 +08:00
Miheichev Aleksandr SergeevichandClaude Opus 5.5 5029d75475 test: migrate unit tests from JUnit 4 to JUnit 6 (#6276)
JUnit 4 is in maintenance mode, and 4.13.2 (February 2021) is its last
release. Move the unit tests to JUnit Jupiter 6.1.3: the JUnit BOM,
junit-jupiter and the Platform launcher replace junit:junit, and the
unit test tasks run on the JUnit Platform. The test sources change only
mechanically: imports, lifecycle annotations, TemporaryFolder to
@TempDir, and the message argument moved last in three assertions.

Jupiter skips an invalid @Test method, such as one that returns a
value, with only a warning, where JUnit 4 failed the run. Treat
discovery warnings as failures to keep that behavior.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 15:20:41 +08:00
Miheichev Aleksandr SergeevichandClaude Opus 5.5 85b1f694c9 chore(build): update Gradle wrapper to 9.8.0 (#6274)
AGP 9.4.1 is in the AGP range Gradle 9.8.0 was tested with (9.0 to
9.5.0-alpha02). AGP 9.4 requires at least Gradle 9.6.0.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 15:19:26 +08:00
Miheichev Aleksandr SergeevichandClaude Opus 5.5 c63e18b751 chore(deps): update mockito-kotlin to 6.4.0, drop mockito-inline (#6273)
mockito-kotlin shared the mockitoMockitoInline version key with
mockito-inline, which was discontinued after 5.2.0 because Mockito 5
made the inline mock maker the default in mockito-core. The shared key
kept mockito-kotlin on 5.2.0.

- org.mockito:mockito-inline 5.2.0 -> org.mockito:mockito-core 5.24.0
- org.mockito.kotlin:mockito-kotlin 5.2.0 -> 6.4.0, on its own key

On the test classpath mockito-core moves from 5.7.0 to 5.24.0 and
Byte Buddy from 1.14.9 to 1.17.7, so the unit tests also run on JDK 25.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 15:17:16 +08:00
Eliot the Cougar 89f53233cb Fix navigation bar theme API lint errors (#6259) 2026-10-01 15:08:56 +08:00
Hossein Abaspanahandeliotcougar be1f2cf00b Update Luri Bakhtiari translation (#6169)
* Update strings.xml

* Update strings.xml

* Update strings.xml

* Update strings.xml

* Update strings.xml

* Update strings.xml

* Update strings.xml

* Update strings.xml

* Update strings.xml

* Fixed reported issue #1

* Reported issue 3, section 2, fixed

* Update V2rayNG/app/src/main/res/values-bqi-rIR/strings.xml

Co-authored-by: eliotcougar <eliotfur@gmail.com>

---------

Co-authored-by: eliotcougar <eliotfur@gmail.com>
2026-10-01 15:04:14 +08:00
2dust bd21bbc3f9 up 2.3.9 2.3.9 2026-09-22 14:49:01 +08:00
2dust 6e5d742e40 Fix
https://github.com/2dust/v2rayNG/issues/6240
2026-09-22 14:48:05 +08:00
2dust 4472162614 Preserve groups when replacing profiles 2026-09-22 14:30:22 +08:00
2dust 1f7cef32dc Animate start FAB icon spin on tap 2026-09-22 11:11:59 +08:00
2dust 7e68e2eaad Adjust toast background opacity
Increase toast background opacity from 70% to 85% for all theme variants in Theme.kt. This improves readability and keeps toast notifications visually consistent without changing their content or behavior.
2026-09-22 10:42:01 +08:00
2dust 4c7c964e65 Show service start failure details
Pass the optional failure message from the service layer through `MainServiceEvent` and show it in `MainViewModel` when available. This preserves the existing generic error toast as a fallback while surfacing more specific startup failures to the user.
2026-09-22 10:41:31 +08:00
2dust 1bd1bceadb Delete ServerActivity.kt 2026-09-21 19:13:13 +08:00
2dust 0e80f6b431 Add snackbar-safe toast dispatch
Refactor toast helpers to route through a shared dispatcher that first tries the app snackbar manager and falls back to Android Toasts on the main thread. This adds a `long` duration option across normal/success/error/info toast APIs and avoids posting to a new Handler for every message by reusing a single main-thread handler.
2026-09-21 19:10:33 +08:00
2dust 1ad5f30ede Show inline validation errors in forms
Move several save-time validation failures from toast messages to field error states in the server and subscription editors. Password validation now marks the relevant server form field, and subscription editing highlights invalid URLs and update intervals before save instead of relying on transient toasts.
2026-09-21 19:10:10 +08:00