Compare commits

...
11 Commits
Author SHA1 Message Date
2dust a4dd3d08de up 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
33 changed files with 281 additions and 239 deletions

No files matched your search

+3 -3
View File
@@ -35,11 +35,11 @@ jobs:
run: |
echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager \
--channel=0 \
--install "ndk;29.0.14206865"
echo "NDK_HOME=$ANDROID_HOME/ndk/29.0.14206865" >> $GITHUB_ENV
--install "ndk;30.0.16248370"
echo "NDK_HOME=$ANDROID_HOME/ndk/30.0.16248370" >> $GITHUB_ENV
sed -i '10i\
\
ndkVersion = "29.0.14206865"' ${{ github.workspace }}/V2rayNG/app/build.gradle.kts
ndkVersion = "30.0.16248370"' ${{ github.workspace }}/V2rayNG/app/build.gradle.kts
- name: Restore cached libhevtun
id: cache-libhevtun-restore
+17 -4
View File
@@ -13,8 +13,8 @@ android {
applicationId = "com.v2ray.ang"
minSdk = 24
targetSdk = 37
versionCode = 749
versionName = "2.3.9"
versionCode = 750
versionName = "2.3.10"
val abiFilterList = (properties["ABI_FILTERS"] as? String)?.split(';')
splits {
@@ -149,6 +149,17 @@ android {
}
}
testOptions {
unitTests.all {
it.useJUnitPlatform()
// Treat Jupiter discovery warnings as failures: JUnit 4 failed on an invalid @Test
// method, such as one that returns a value, while Jupiter only warns and skips it.
// The key is @API(status = EXPERIMENTAL) in JUnit 6; after a JUnit upgrade, check
// that a temporary `@Test fun probe() = 1` still fails the unit test task.
it.systemProperty("junit.platform.discovery.issue.severity.critical", "WARNING")
}
}
}
dependencies {
@@ -201,10 +212,12 @@ dependencies {
implementation(libs.reorderable)
// Testing Libraries
testImplementation(libs.junit)
testImplementation(platform(libs.junit.bom))
testImplementation(libs.junit.jupiter)
testRuntimeOnly(libs.junit.platform.launcher)
androidTestImplementation(libs.androidx.junit)
androidTestImplementation(libs.androidx.espresso.core)
testImplementation(libs.org.mockito.mockito.inline)
testImplementation(libs.mockito.core)
testImplementation(libs.mockito.kotlin)
coreLibraryDesugaring(libs.desugar.jdk.libs)
}
@@ -406,8 +406,22 @@ private fun ServerListItem(
}
Spacer(modifier = Modifier.height(6.dp))
Row(Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween) {
Text(row.typeDescription, style = MaterialTheme.typography.bodySmall, color = colorConfigType, maxLines = 1, overflow = TextOverflow.Ellipsis)
Text(testResult, style = MaterialTheme.typography.bodySmall, color = if (row.testDelayMillis < 0L) colorPingRed else colorPing, maxLines = 1, overflow = TextOverflow.Ellipsis)
Text(
row.typeDescription,
modifier = Modifier.weight(1f, fill = false),
style = MaterialTheme.typography.bodySmall,
color = colorConfigType,
maxLines = 1,
overflow = TextOverflow.Ellipsis
)
Spacer(modifier = Modifier.width(8.dp))
Text(
testResult,
style = MaterialTheme.typography.bodySmall,
color = if (row.testDelayMillis < 0L) colorPingRed else colorPing,
maxLines = 1,
overflow = TextOverflow.Ellipsis
)
}
}
}
@@ -3,14 +3,14 @@
<string name="app_name" translatable="false">v2rayNG</string>
<string name="app_widget_name">آلشت</string>
<string name="app_tile_name">آلشت</string>
<string name="app_tile_first_use">سی کرت ٱولی و کار بوردن ای ویژیی، ٱول ز من برنومه ی سرور اضاف کۊنین</string>
<string name="app_tile_first_use">سی کرت ٱولی و کار بوردن ای ویژیی، ٱول ز من برنومه ی سرور ازاف کۊنین</string>
<string name="navigation_drawer_open">گۊشیڌن نومگه کشاری</string>
<string name="navigation_drawer_close">بستن نومگه کشاری</string>
<string name="migration_success">جاگورویی داڌه یل وا مووفقیت ٱنجوم وابی!</string>
<string name="migration_success">جاگورویی داده یل وا مووفقیت ٱنجوم وابی!</string>
<string name="action_stop_service">واڌاشتن سرویس</string>
<string name="action_ok">قوۊل</string>
<string name="action_cancel">لغو</string>
<string name="migration_fail">جاگورویی داڌه یل شکست خرد!</string>
<string name="action_cancel">لقو</string>
<string name="migration_fail">جاگورویی داده یل شکست خرد!</string>
<string name="pull_down_to_refresh">سی وانۊ کردن، بلگه ن بلم بکشین!</string>
<!-- Notifications -->
@@ -34,7 +34,7 @@
<string name="menu_item_del_config">پاک کردن کانفیگ</string>
<string name="menu_item_import_config_qrcode">و من ٱووردن کانفیگ ز کود QR</string>
<string name="menu_item_import_config_clipboard">و من ٱووردن کانفیگ ز کلیپ بورد</string>
<string name="menu_item_import_config_local">و من ٱووردن کانفیگ ز محلی</string>
<string name="menu_item_import_config_local">و من ٱووردن کانفیگ ز ویرگه مهلی</string>
<string name="menu_item_import_config_policy_group">ٱووردن [بونکۊ سیاست]</string>
<string name="menu_item_import_config_proxy_chain">ٱووردن [زنجیره پروکسی]</string>
<string name="menu_item_import_config_manually_vmess">ٱووردن [VMess]</string>
@@ -53,8 +53,8 @@
<string name="confirm_delete_proxy_chain_member">ای عوزو زنجیره پروکسی پاک ابۊ، هنی هم اخۊی پاکس کۊنی؟</string>
<string name="confirm_delete_routing_rule">ای قانووݩ تور جوستن پاک ابۊ، هنی هم اخۊی پاکس کۊنی؟</string>
<string name="confirm_delete_subscription_group">ای بونکۊ اشتراک پاک ابۊ، هنی هم اخۊی پاکس کۊنی؟</string>
<string name="confirm_delete_asset_file">ای فایل بونچک جغرافیایی پاک ابۊ، هنی هم اخۊی پاکس کۊنی؟</string>
<string name="confirm_delete_asset_source">ای بونچک فایلا جغرافیایی پاک ابۊ، هنی هم اخۊی پاکس کۊنی؟</string>
<string name="confirm_delete_asset_file">فایل بونچک جوقرافیایی «%1$s» پاک ابۊ، هنی هم اخۊی پاکس کۊنی؟</string>
<string name="confirm_delete_asset_source">ای بونچک فایل جوقرافیایی پاک ابۊ، هنی هم اخۊی پاکس کۊنی؟</string>
<string name="server_lab_remarks">نیشتنا</string>
<string name="server_lab_address">نشۊوی</string>
<string name="server_lab_port">پورت</string>
@@ -64,7 +64,7 @@
<string name="server_lab_network">شبکه</string>
<string name="server_lab_more_function">جاگورو</string>
<string name="server_lab_head_type">نوع هدر</string>
<string name="server_lab_mode_type">حالت gRPC</string>
<string name="server_lab_mode_type">هالت gRPC</string>
<string name="server_lab_request_host">هاست</string>
<string name="server_lab_request_host_http">هاست http</string>
<string name="server_lab_request_host_ws">هاست ws</string>
@@ -84,7 +84,7 @@
<string name="server_lab_stream_security" translatable="false">TLS</string>
<string name="server_lab_stream_fingerprint">جا کلک</string>
<string name="server_lab_stream_alpn" translatable="false">ALPN</string>
<string name="server_lab_allow_insecure">تئیڌ گوواهی ن ناڌیڌه بگرین (allowInsecure)</string>
<string name="server_lab_allow_insecure">تئیڌ گوواهی ن نیڌه بگرین (allowInsecure)</string>
<string name="server_lab_sni" translatable="false">SNI</string>
<string name="server_lab_address3">نشۊوی</string>
<string name="server_lab_port3">پورت</string>
@@ -101,42 +101,42 @@
<string name="server_lab_mldsa65_verify" translatable="false">mldsa65Verify</string>
<string name="server_lab_secret_key">کیلیت سیخومی</string>
<string name="server_lab_reserved">Reserved(اختیاری، وا کاما (,) ز یک جوڌا ابۊن)</string>
<string name="server_lab_local_address">نشۊوی محلی (اختیاری IPv4/IPv6، وا کاما (,) ز یک جوڌا ابۊن)</string>
<string name="server_lab_local_mtu">MTU(اختیاری، پؽش فرض 1420)</string>
<string name="server_lab_remote_dns">remoteDNS (اختياری، آدرس‌های IPv4/IPv6 جدا شده با کاما، یا "local" برای استفاده از DNS دستگاه)</string>
<string name="server_lab_kcp_mtu">mKCP MTU (اختیاری، پؽش فرض 1350)</string>
<string name="server_lab_kcp_tti">mKCP TTI (اختیاری، پؽش فرض 50 میلی‌ثانیه)</string>
<string name="server_lab_local_address">نشۊوی مهلی (اختیاری IPv4/IPv6، وا کاما (,) ز یک جوڌا ابۊن)</string>
<string name="server_lab_local_mtu">MTU(اختیاری، پؽش فرز 1420)</string>
<string name="server_lab_remote_dns">remoteDNS (اختياری، نشۊویا IPv4/IPv6 جوڌا وابیڌه وا کاما، یا «local» سی و کار گرؽڌن DNS دسگا)</string>
<string name="server_lab_kcp_mtu">mKCP MTU (اختیاری، پؽش فرز 1350)</string>
<string name="server_lab_kcp_tti">mKCP TTI (اختیاری، پؽش فرز 50 میلی‌سانیه)</string>
<string name="toast_success">وا مووفقیت ٱنجوم وابی</string>
<string name="toast_failure">شکست خرد</string>
<string name="toast_none_data">هیچ داڌه ای وۊجۊڌ نڌاره</string>
<string name="toast_none_data">هیچ داده ای وۊجۊڌ نڌاره</string>
<string name="toast_incorrect_protocol">پوروتوکول نادوروست</string>
<string name="toast_decoding_failed">رزم گوشایی ٱنجوم نوابی</string>
<string name="title_file_chooser">پسند فایل کانفیگ</string>
<string name="toast_require_file_manager">ی برنومه دؽوۉداری فایل بپۊرنین.</string>
<string name="server_customize_config">کانفیگ سفارشی</string>
<string name="toast_config_file_invalid">کانفیگ نا موئتبر هڌ</string>
<string name="server_lab_content">محتوا</string>
<string name="toast_none_data_clipboard">هیچ داڌه ای من کلیپ بورد وۊجۊڌ نڌاره</string>
<string name="server_lab_content">موئتوا</string>
<string name="toast_none_data_clipboard">هیچ داده ای من کلیپ بورد وۊجۊڌ نڌاره</string>
<string name="toast_invalid_url">نشۊوی اینترنتی نا موئتبر هڌ</string>
<string name="toast_insecure_url_protocol">نشۊوی اشتراک پوروتوکول نا ٱمن HTTP ن و کار مبرین</string>
<string name="server_lab_need_inbound">موطمئن بۊین ک پورت وۊرۊڌی وا سامووا ی جۊر هڌ</string>
<string name="server_lab_need_inbound">موتمعن بۊین ک پورت وۊرۊڌی وا سامووا ی جۊر هڌ</string>
<string name="toast_malformed_json">کانفیگ نا موئتبر هڌ</string>
<string name="server_lab_request_host6">هاست(SNI)(اختیاری)</string>
<string name="toast_action_not_allowed">ای کار ممنۊع هڌ</string>
<string name="server_obfs_password">رزم obfs</string>
<string name="server_lab_port_hop">پورت گوم (درگا سرورن ز نۊ هؽل اکونه)</string>
<string name="server_lab_port_hop_interval">فاصله پورت گوم (ثانیه)</string>
<string name="server_lab_port_hop">گوم پورت (پورت سرورن ز نۊ هؽل اکونه)</string>
<string name="server_lab_port_hop_interval">فاسله گوم پورت (سانیه)</string>
<string name="server_lab_bandwidth_down">ب لم ٱووڌن پئنا باند (واهڌ)</string>
<string name="server_lab_bandwidth_up">وا روء رئڌن پئنا باند (واهڌ)</string>
<string name="server_lab_xhttp_mode">حالت XHTTP</string>
<string name="server_lab_xhttp_mode">هالت XHTTP</string>
<string name="server_lab_xhttp_extra">XHTTP Extra خام JSON، قالوو: { XHTTPObject }</string>
<string name="server_lab_final_mask">finalMask خام JSON، قالوو: { FinalMaskObject }</string>
<string name="server_lab_ech_config_list" translatable="false">echConfigList</string>
<string name="server_lab_verify_peer_cert_by_name">تئیڌ گوواهی هومتا و ری نوم</string>
<string name="server_lab_pinned_ca256">جا کلک گوواهی (SHA-256)</string>
<string name="server_lab_browser_dialer">Browser Dialer ن ره وستین</string>
<string name="server_lab_browser_dialer_tip">تینا وۊرۊیا xhttp (packet-up) وو ws ن پوشتؽووی اکونه؛ گاشڌ سامووا وابسته و TLS ناڌیڌه گرفته ابۊن یا وا همن جۊر نین</string>
<string name="toast_allow_insecure_deprecated">ای گر ز منپیز بی رمزنگاری کار اگیره. گاشڌ منپیزا شمو و دست دسگایل میووݩ شبکه ک و دست دولتا استبداڌی کنتورول ابۊن موستقیمن دیڌه ابۊ.\nسی ٱمنیت، ای جۊر گر یل وا هسته Xray نوسخه 26.2.6+ منپیز نابۊن.\nٱر گر خوتووݩ هڌ، رمزنگاری ٱمنی وری TLS ن ره وستین یا اثر انگشت گوواهی pinnedCA256 ن چفت کۊنین.\nٱر گر مال سرویس ڌهنده هڌ، ز سرویس ڌهنده بخواین ٱرتقا فنی ن ٱنجوم بڌه. ٱر همکاری نکونه، بئتره سرویس ڌهنده ی ک ب ٱمنیت کارورووݩ بؽتر اهمیت اڌه پسند کۊنین.\nسی دووسته بؽتر ورین و https://github.com/2dust/v2rayN/discussions/9460</string>
<string name="server_lab_browser_dialer">Browser Dialer ره وندن</string>
<string name="server_lab_browser_dialer_tip">تینا خۊرۊجیا xhttp (packet-up) وو ws لادراری ابۊن؛ سامووا وابسته و TLS گاشڌ نیڌه گرؽڌه بۊن یا تداخول داشته بۊ</string>
<string name="toast_allow_insecure_deprecated">گره هیم سکویی منپیز رزم نگاری نوابیڌه ن و کار اگره. زؽرساختا منجا شبکه ک من کونتورول هۊکۊمتا اقتدارگرا هڌن گاشڌ ارتباتا ایسا ن موستقیمن بنیرن.\nسی دلیلا ٱمنیتی، منپیز و ای گره هایی ک وا هسته Xray نوسخه 26.2.6 وو روء تر امکووݩ پزیر نؽڌ.\nٱر گره ن خوتووݩ ره وندین، رزم نگاری ٱمنی جۊر TLS ن ره ونین یا جا کلک گوواهی pinnedCA256 ن پین کۊنین.\nٱر گره ز ارائه کون خدمات هڌ، سی ارتقای فنی بسووݩ زنگ بزݩ. ٱر ارائه کون واتووݩ هیاری نکرد، پؽشنهاڌ ابۊ و ارائه کونی ریوین ک سی ٱمنیت منتورووݩ ٱهمیت قلوه ای اده.\nسی دووسمندیا قلوه و https://github.com/2dust/v2rayN/discussions/9460 سر بزنین.</string>
<string name="pinned_ca256_action_fetch">گرؽڌن وو پور کردن جا کلک گوواهی</string>
<string name="toast_fetch_cert_sha256_success">جا کلک گوواهی وا مووفقیت گرؽڌه وابی</string>
<string name="toast_fetch_cert_sha256_failed">گرؽڌن جا کلک گوواهی مووفق نبی</string>
@@ -149,10 +149,10 @@
<string name="menu_item_scan_qrcode">اسکن کود QR</string>
<string name="title_url" translatable="false">URL</string>
<string name="menu_item_download_file">دانلود فایلا</string>
<string name="title_user_asset_add_url">نشۊوی اینترنتی بونچک ن اضاف کۊنین</string>
<string name="title_user_asset_add_url">نشۊوی اینترنتی بونچک ن ازاف کۊنین</string>
<string name="msg_file_not_found">فایلن نجوست</string>
<string name="msg_remark_is_duplicate">ای نوم ز زیتر بیڌس</string>
<string name="asset_geo_files_sources">بونچک فایلا جغرافیایی (اختیاری)</string>
<string name="asset_geo_files_sources">بونچک فایلا جوقرافیایی (اختیاری)</string>
<!-- PerAppProxyActivity -->
<string name="msg_dialog_progress">هونی بار ونی ابۊ…</string>
@@ -160,14 +160,14 @@
<string name="menu_item_select_all">پسند پوی</string>
<string name="menu_item_invert_selection">چواسه کردن پسندا</string>
<string name="msg_enter_keywords">کلمه یل کلیڌی ن بزنین</string>
<string name="switch_bypass_apps_mode">حالت دور زیڌن</string>
<string name="switch_bypass_apps_mode">هالت دور زیڌن</string>
<string name="menu_item_select_proxy_app">پسند خوتکار برنومه یلی ک پروکسی اخون</string>
<string name="msg_downloading_content">محتوا هونی دانلود ابۊن…</string>
<string name="msg_downloading_content">موئتوا هونی دانلود ابۊ…</string>
<string name="menu_item_export_proxy_app">و در کشیڌن من کلیپ بورد</string>
<string name="menu_item_import_proxy_app">و من ٱووردن ز کلیپ بورد</string>
<string name="per_app_proxy_settings">سامووا ب تفکیک برنومه</string>
<string name="per_app_proxy_settings_enable">ره وندن ب تفکیک برنومه</string>
<string name="app_picker_unknown_app">برنومه ناناس (UID ناساڌه)</string>
<string name="app_picker_unknown_app">برنومه ناشناس (UID شناسایی نوابیڌه)</string>
<!-- Preferences -->
<string name="title_settings">سامووا</string>
@@ -183,9 +183,9 @@
<string name="toast_system_vpn_settings_unavailable">سامووا VPN سیستوم من دسرس نین.</string>
<string name="subscription_updater_job_tips">وزیفه من پس زمینه کار اکونه وو ایلاعات پؽشرفت من اعلان نشووݩ داڌه ابۊ.</string>
<string name="title_pref_auto_test_after_update_subscription">تست خوتکار بئڌ و رۊز کۊنی اشتراک</string>
<string name="summary_pref_auto_test_after_update_subscription">تست خوتکار زمووݩ زیاڌی ابره. ٱر ره وست بۊ، وزیفه من پس زمینه کار اکونه؛ وگرنه من همین بلگه کار اکونه.</string>
<string name="subscription_updater_job_tips">ای کار من پس زمینه ره اوۊفته وو پؽش رئڌن هو منه وارسۊوی نشووݩ داڌه ابۊ.</string>
<string name="title_pref_auto_test_after_update_subscription">تست خوتکار بئڌ ورۊ رسۊوی کردن اشتراک</string>
<string name="summary_pref_auto_test_after_update_subscription">تست خوتکار زمووݩ زیاڌی ابره. ٱر ره وسته بۊوه، وزیفه من پس زمینه کار اکونه؛ ٱندی من هیم بلگه کار اکونه.</string>
<string name="title_pref_auto_remove_invalid_after_test">پاک کردن خوتکار کانفیگا نا موئتبر بئڌ پینگ</string>
<string name="summary_pref_auto_remove_invalid_after_test">نتیجه یل پینگ گاشڌ دییق نبۊن؛ کانفیگا پاک وابیڌه ن نتری وورگنی.</string>
<string name="title_pref_auto_sort_after_test">ترتیب خوتکار بئڌ پینگ گرؽڌن</string>
@@ -193,7 +193,7 @@
<string name="title_mux_settings">سامووا Mux</string>
<string name="title_pref_mux_enabled">ره وندن Mux</string>
<string name="summary_pref_mux_enabled">زل تر، ٱما گاشڌ منپیز زی قط بۊ\nدؽوۉداری TCP، UDP وو QUIC ن ای لم سفارشی کۊنین.</string>
<string name="summary_pref_mux_enabled">زل تر، ٱما گاشڌ منپیز زی قت بۊ\nدؽوۉداری TCP ،UDP وو QUIC ن ای لم سفارشی کۊنین.</string>
<string name="title_pref_mux_concurrency">منپیزا TCP (تلایه منجا -1 تا 1024)</string>
<string name="title_pref_mux_xudp_concurrency">منپیزا XUDP (تلایه منجا -1 تا 1024)</string>
<string name="title_pref_mux_xudp_quic">دؽوۉداری QUIC من تۊنل mux</string>
@@ -204,21 +204,21 @@
</string-array>
<string name="title_pref_speed_enabled">ره وندن نشووݩ داڌن سورعت</string>
<string name="summary_pref_speed_enabled">سورعت هیم سکویی من وارسۊوی نشووݩ داڌه ابۊ.\nنماڌ نشووݩ اڌه ک ترافیک پروکسی یا موستقیم بؽتره.</string>
<string name="summary_pref_speed_enabled">سورعت هیم سکویی من وارسۊوی نشووݩ داڌه ابۊ.\nنماڌ نشووݩ اده ک ترافیک پروکسی قلوه هڌ یا ترافیک موستقیم.</string>
<string name="title_pref_sniffing_enabled">ره وندن در کشیڌن نوم دامنه موورد نظر (Sniffing)</string>
<string name="summary_pref_sniffing_enabled">قپ ریت سی و در کشیڌن نوم دامنه واقعی ز کتنا (پؽش فرض رۊشن هڌ)</string>
<string name="title_pref_sniffing_enabled">ره وندن و در کشیڌن نوم دامنه موورد نزر (Sniffing)</string>
<string name="summary_pref_sniffing_enabled">قپ ریت سی و در کشیڌن نوم دامنه واقعی ز کتنا (پؽش فرز رۊشن هڌ)</string>
<string name="title_pref_route_only_enabled">ره وندن تینا تور جوستن routeOnly</string>
<string name="summary_pref_route_only_enabled">نوم دامنه sniffed ن تینا سی تور جوستن و کار بگیرین وو نشۊوی موورد نظرن و عونوان نشۊوی IP ووردارین.</string>
<string name="summary_pref_route_only_enabled">نوم دامنه sniffed ن تینا سی تور جوستن و کار بگیرین وو نشۊوی موورد نزرن و عونوان نشۊوی IP ووردارین.</string>
<string name="title_pref_local_dns_enabled">ره وندن DNS محلی</string>
<string name="summary_pref_local_dns_enabled">درخواستا DNS و هسته و من ایان وو و دست ماژول DNS پردازشت ابۊن (پؽشنهاڌ ابۊ ٱر لنگ تور جوستن سی دور زیڌن نشۊویا LAN وو وولات ٱسلی هڌین ره ونده بۊ)</string>
<string name="title_pref_local_dns_enabled">ره وندن DNS مهلی</string>
<string name="summary_pref_local_dns_enabled">درخاستا DNS و هسته و من ایان وو و دست ماژول DNS پردازشت ابۊن (پؽشنهاڌ ابۊ ٱر لنگ تور جوستن سی دور زیڌن نشۊویا LAN وو وولات ٱسلی هڌین ره ونده بۊ)</string>
<string name="title_pref_fake_dns_enabled">ره وندن DNS جئلی (FakeDNS)</string>
<string name="summary_pref_fake_dns_enabled">FakeDNS نشۊویا IP جئلی ن سی نوم دامنه اوورگنه (زل تر، ٱما گاشڌ من ی قرده ز برنومه یل کار نکونه).</string>
<string name="title_pref_ipv6_enabled">ره وندن IPv6</string>
<string name="summary_pref_ipv6_enabled">نشۊویا وو تورا IPv6 ن و رابط VPN اضاف کۊنین</string>
<string name="summary_pref_ipv6_enabled">نشۊویا وو تورا IPv6 ن و رابت VPN ازاف کۊنین</string>
<string name="title_pref_prefer_ipv6">ترجی داڌن IPv6</string>
<string name="summary_pref_prefer_ipv6">مجال هل وو فسل نوم دامنه، نشۊویا IPv6 ن ترجی بڌین</string>
@@ -227,11 +227,11 @@
<string name="summary_pref_remote_dns" translatable="false">DNS</string>
<string name="title_pref_vpn_dns">VPN DNS (تینا IPv4/IPv6)</string>
<string name="title_pref_vpn_bypass_lan">VPN ز شبکه محلی اگوڌرته؟</string>
<string name="title_pref_vpn_bypass_lan">VPN ز شبکه مهلی اگوڌرته؟</string>
<string name="title_pref_vpn_interface_address">نشۊوی رابط VPN</string>
<string name="title_pref_vpn_interface_address">نشۊوی رابت VPN</string>
<string name="title_pref_vpn_mtu">VPN MTU (پؽش فرض 1500)</string>
<string name="title_pref_vpn_mtu">VPN MTU (پؽش فرز 1500)</string>
<string name="title_pref_domestic_dns">DNS موستقیم (اختیاری)</string>
@@ -247,74 +247,74 @@
<string name="title_pref_ip_api_url">نشۊوی اینترنتی آزمایش دووسمندیا منپیز هیم سکویی</string>
<string name="summary_pref_ip_api_url" translatable="false">URL</string>
<string name="title_pref_proxy_sharing_enabled">یک رسۊوی پروکسی من شبکه محلی LAN</string>
<string name="title_pref_proxy_sharing_enabled">یک رسۊوی پروکسی من شبکه مهلی LAN</string>
<string name="summary_pref_proxy_sharing_enabled">پوی دسگایل ترن وا نشۊوی IP ایسا، ز ره socks/http و پروکسی منپیز بۊن، تینا من شبکه قابل ائتماڌ ره ونده بۊ تا ز منپیز غیر موجاز جلو گری بۊ.</string>
<string name="toast_warning_pref_proxysharing_short">یک رسۊوی من شبکه محلی ره وست؛ موطمئن بۊین ک من ی شبکه ٱمن هڌین.</string>
<string name="toast_warning_pref_proxysharing_short">یک رسۊوی من شبکه مهلی ره وست؛ موتمعن بۊین ک من ی شبکه ٱمن هڌین.</string>
<string name="title_pref_socks_port">پورت پروکسی محلی</string>
<string name="title_pref_enable_local_proxy">ره وندن پروکسی محلی</string>
<string name="title_pref_socks_port">پورت پروکسی مهلی</string>
<string name="title_pref_enable_local_proxy">ره وندن پروکسی مهلی</string>
<string name="summary_pref_enable_local_proxy">هرسا ره نوسته بۊ، هیچ پروکسی SOCKS من دسرس نؽ، سی دل هیمو کارایی جۊر ورۊ رسۊوی یل اشتراک نترن پروکسی ن و کار گرن.</string>
<string name="title_pref_socks_enable_udp" translatable="false">SOCKS5 UDP</string>
<string name="summary_pref_socks_enable_udp">ائراز هۊویت SOCKS5 مجال استفاڌه ز UDP کاملن ایمن نؽ.</string>
<string name="summary_pref_socks_port">پورت پروکسی محلی</string>
<string name="title_pref_dynamic_socks_port">وورکل پورت موتغیر سی پروکسی محلی</string>
<string name="summary_pref_dynamic_socks_port">هر کرت ک و من ٱووڌنی وورکل ابۊ، ی پورت پروکسی محلی تساڌۊفی وورکل اکونه.</string>
<string name="title_pref_socks_username">نوم منتوری پروکسی محلی (اختیاری)</string>
<string name="summary_pref_socks_port">پورت پروکسی مهلی</string>
<string name="title_pref_dynamic_socks_port">وورکل پورت موتغیر سی پروکسی مهلی</string>
<string name="summary_pref_dynamic_socks_port">هر کرت ک و من ٱووڌنی وورکل ابۊ، ی پورت پروکسی مهلی تساڌۊفی وورکل اکونه.</string>
<string name="title_pref_socks_username">نوم منتوری پروکسی مهلی (اختیاری)</string>
<string name="summary_pref_socks_username">نوم منتوری</string>
<string name="title_pref_socks_password">رزم پروکسی محلی (اختیاری)</string>
<string name="title_pref_socks_password">رزم پروکسی مهلی (اختیاری)</string>
<string name="summary_pref_socks_password">رزم</string>
<string name="title_pref_local_dns_port">پورت DNS محلی</string>
<string name="summary_pref_local_dns_port">پورت DNS محلی</string>
<string name="title_pref_local_dns_port">پورت DNS مهلی</string>
<string name="summary_pref_local_dns_port">پورت DNS مهلی</string>
<string name="title_pref_confirm_remove">قوۊل کردن پاک کردن کانفیگ</string>
<string name="summary_pref_confirm_remove">سی پاک وابیڌن فایل کانفیگ، لنگ قوۊل کردن دووارته ز سمت منتور هڌ.</string>
<string name="title_pref_append_http_proxy">پروکسی HTTP ن و VPN اضاف کۊنین</string>
<string name="title_pref_append_http_proxy">پروکسی HTTP ن و VPN ازاف کۊنین</string>
<string name="summary_pref_append_http_proxy">پروکسی HTTP ن موستقیمن ز (مۊرۊرگر/ی قرد ز برنومه یل لادراری بیڌه)، بؽ استفاڌه ز دسگا NIC مجازی (Android 10+) استفاڌه ابۊ.</string>
<string name="title_pref_double_column_display">ره وندن نشووݩ داڌن دو سۊتۊنی</string>
<string name="summary_pref_double_column_display">نومگه کانفیگا من دو ستۊݩ نشووݩ داڌه ابۊ تا محتوا بؽتری من بلگه جا بگره.</string>
<string name="summary_pref_double_column_display">نومگه کانفیگا من دو سۊتۊن نشووݩ داڌه ابۊ تا موئتوا قلوه ای من بلگه جا بگره.</string>
<string name="title_pref_group_all_display">نشووݩ داڌن پوی بونکۊ یل ن ره ونین</string>
<string name="summary_pref_group_all_display">ی بلگه «پوی بونکۊ یل کانفیگ» اضاف کۊنین</string>
<string name="title_pref_group_all_display">نشووݩ داڌن بلگه «پوی»</string>
<string name="summary_pref_group_all_display">نشووݩ داڌن پوروفایلا پوی بونکۊیل اشتراک من ی بلگه.</string>
<!-- AboutActivity -->
<string name="title_pref_feedback">فشناڌن منشڌ</string>
<string name="summary_pref_feedback">فشناڌن منشڌ یا گوزارش موشکلا من GitHub</string>
<string name="summary_pref_tg_group">ٱووڌن من بونکۊ تلگرام</string>
<string name="toast_tg_app_not_found">برنومه تلگرامن نجوست</string>
<string name="title_privacy_policy">حریم سیخومی</string>
<string name="title_privacy_policy">هریم سیخومی</string>
<string name="title_qr_code">کود QR</string>
<string name="title_about">زبار</string>
<string name="title_source_code">کود بونچک</string>
<string name="title_oss_license">موجوزا کود بونچک</string>
<string name="title_translators">ترجومه‌گرا</string>
<string name="title_translators">ولرنی کارووݩ</string>
<string name="title_tg_channel">تورگه تلگرام</string>
<string name="title_pref_promotion">تبلیغات</string>
<string name="title_pref_promotion">تبلیقات</string>
<string name="title_pref_auto_update_subscription">ورۊ کردن خوتکار اشتراکا</string>
<string name="summary_pref_auto_update_subscription">اشتراکا خوتووݩ ن و تۉر خوتکار وا فاصله زمۊوی من پس زمینه ورۊ کۊنین. ای ویژیی من پوی دسگایل گاشڌ همیشه کار نکونه</string>
<string name="title_pref_auto_update_interval">فاصله ورۊ کردن خوتکار (اقلن وا 15 دؽقه بۊ)</string>
<string name="summary_pref_auto_update_subscription">اشتراکا خوتووݩ ن و تۉر خوتکار وا فاسله زمۊوی من پس زمینه ورۊ کۊنین. ای ویژیی من پوی دسگایل گاشڌ هی کار نکونه</string>
<string name="title_pref_auto_update_interval">فاسله ورۊ کردن خوتکار (ٱقلن وا 15 دؽقه بۊ)</string>
<string name="title_core_loglevel">سئت گوزارشا</string>
<string name="title_outbound_domain_resolve_method">بارت پؽش هل دامنه دری (outbound)</string>
<string name="title_mode">حالت</string>
<string name="title_mode">هالت</string>
<string name="title_mode_help">سی دووسمندیا وو هیاری قلوه، ری ای هؽل بزݩ</string>
<string name="title_language">زووݩ</string>
<string name="title_ui_settings">سامووا رابط منتوری</string>
<string name="title_pref_ui_mode_night">سامووا حالت رابط منتوری</string>
<string name="title_pref_dynamic_color">فعال‌سازی رنگ پویا</string>
<string name="summary_pref_dynamic_color">فقط روی اندروید ۱۲+ کار می‌کند</string>
<string name="title_ui_settings">سامووا رابت منتوری</string>
<string name="title_pref_ui_mode_night">سامووا هالت رابت منتوری</string>
<string name="title_pref_dynamic_color">ره وندن رنگ پۊیا</string>
<string name="summary_pref_dynamic_color">فقت ری ٱندروید 12+ کار اکونه</string>
<string name="title_pref_use_hev_tunnel">و کار گرؽڌن ویژیی Hev TUN</string>
<string name="summary_pref_use_hev_tunnel">مجالی ک ره ونده بۊ، TUN ایا hev-socks5-tunnel ن و کار اگره؛ ٱر ره نوۊفته بۊ، همو xray-core ن و کار اگره.</string>
<string name="title_pref_hev_tunnel_loglevel">Hev TUN سئت گوزارشا</string>
<string name="title_pref_hev_tunnel_rw_timeout">زمووݩ مندیر بیڌن خوندن/هؽل کردن Hev TUN (ثانیه؛ پؽش‌فرض TCP/UDP: 300/60)</string>
<string name="title_mode_settings">سامووا حالت</string>
<string name="title_root_mode_enabled">حالت رۊت ره وست (منتورووݩ رۊت)</string>
<string name="summary_root_mode_enabled">ره وستن پروکسی شفاف سئت بلم وا امتیازا ریشه. ای حالت، VPN استاندارد سیستوم ٱندروید ن دور ازنه تا موستقیمن پوی ترافیک شبکه لمی ن وا دست بگره. بئڌ ره وندن، حالت معمۊلی ٱسلی، تور جۊری هر برنومه وو سامووا VPN مربۊته کاملن نا موئتبر ابۊن.</string>
<string name="title_pref_hev_tunnel_loglevel">سئت گوزارشا Hev TUN</string>
<string name="title_pref_hev_tunnel_rw_timeout">زمووݩ مندیر بیڌن خوندن/هؽل کردن Hev TUN (سانیه؛ پؽش‌فرز TCP/UDP: 300/60)</string>
<string name="title_mode_settings">سامووا هالت</string>
<string name="title_root_mode_enabled">هالت رۊت ره وست (منتورووݩ رۊت)</string>
<string name="summary_root_mode_enabled">ره وستن پروکسی شفاف سئت بلم وا امتیازا ریشه. ای هالت، VPN استاندارد سیستوم ٱندروید ن دور ازنه تا موستقیمن پوی ترافیک شبکه لمی ن وا دست بگره. بئڌ ره وندن، هالت معمۊلی ٱسلی، تور جۊری هر برنومه وو سامووا VPN مربۊته کاملن نا موئتبر ابۊن.</string>
<string name="toast_root_required">دسرسی رۊت سی ای ویژیی لازوم هڌ</string>
<string name="title_root_lan_sharing">یک رسۊوی LAN / تترینگ (منتورووݩ رۊت وابیڌه)</string>
<string name="summary_root_lan_sharing">ترافیک هات‌اسپات وای‌فای وو دسگا یل منپیز وابیڌه وا USB (تترینگ) ن ز تور VPN بفشنین.</string>
@@ -332,25 +332,25 @@
<string name="sub_setting_remarks">نیشتنا</string>
<string name="sub_setting_url">نشۊوی اینترنتی اختیاری</string>
<string name="sub_setting_user_agent" translatable="false">User Agent</string>
<string name="sub_setting_request_headers">سرآیندا درخواست (قالوو JSON)</string>
<string name="sub_setting_request_headers">هدر درخاست (قالوو JSON)</string>
<string name="sub_setting_filter">فیلتر نیشتنا وا regex</string>
<string name="sub_setting_enable">ره وندن ورۊ کردن</string>
<string name="sub_auto_update">ره وندن ورۊ کردن خوتکار</string>
<string name="sub_allow_insecure_url">موجاز کردن نشۊوی HTTP نا ٱمن</string>
<string name="sub_setting_pre_profile">پروکسی وۊرۊی</string>
<string name="sub_setting_pre_profile">پروکسی منی</string>
<string name="sub_setting_next_profile">پروکسی دری</string>
<string name="sub_setting_pre_profile_tip">موطمئن بۊ ک نیشتنا هڌس وو جۊرس نی</string>
<string name="sub_setting_entry_proxy_tip">ای پروکسی پؽش ز هر کانفیگ من ای اشتراک، وری ٱول عوزو زنجیره پروکسی اضاف ابۊ.</string>
<string name="sub_setting_exit_proxy_tip">ای پروکسی بئڌ ز هر کانفیگ من ای اشتراک، وری آخر عوزو زنجیره پروکسی اضاف ابۊ.</string>
<string name="toast_invalid_update_interval">فاصله ورۊ کردن نا موئتبر هڌ. حداقل مقدار 15 دؽقه هڌ.</string>
<string name="sub_setting_pre_profile_tip">موتمعن بۊ ک نوم موستعار ن هڌس وو جۊرس نی</string>
<string name="sub_setting_entry_proxy_tip">پروکسی پسند وابیڌه پؽش ز هر کانفیگ من ای اشتراک، و عونوان عوزو نیایی زنجیره پروکسی ازاف ابۊ.</string>
<string name="sub_setting_exit_proxy_tip">پروکسی پسند وابیڌه بئڌ ز هر کانفیگ من ای اشتراک، و عونوان عوزو دیندایی زنجیره پروکسی ازاف ابۊ.</string>
<string name="toast_invalid_update_interval">فاسله ورۊ کردن نا موئتبر هڌ. حداقل مقدار 15 دؽقه هڌ.</string>
<string name="title_sub_update">ورۊ کردن اشتراک بونکۊ سکویی</string>
<string name="title_ping_all_server">آزمایش تئخیر TCP (TCPing)</string>
<string name="title_real_ping_all_server">آزمایش تئخیر واقعی</string>
<string name="title_user_asset_setting">فایلا بونچک جغرافیایی</string>
<string name="title_user_asset_setting">فایلا بونچک جوقرافیایی</string>
<string name="title_sort_by_test_results">ترتیب و ری نتیجه یل پینگ</string>
<string name="title_filter_config">فیلتر کردن کانفیگا</string>
<string name="filter_config_all">پوی</string>
<string name="summary_scan_qrcode">سی وا کردن دوربیݩ وو ٱسکووݩ، و ری بلگه بزنین</string>
<string name="summary_scan_qrcode">سی گۊشیڌن شؽواتگر وو اسکن، و ری بلگه بزنین</string>
<string name="title_del_duplicate_config_count">پاک کردن %d کانفیگ تکراری</string>
<string name="title_del_config_count">پاک کردن %d کانفیگ</string>
<string name="title_import_config_count">و من ٱووردن %d کانفیگ</string>
@@ -374,7 +374,7 @@
<!-- RoutingSettingActivity -->
<string name="routing_settings_domain_strategy">نشقه دامنه</string>
<string name="routing_settings_title">سامووا تور جوستن</string>
<string name="routing_settings_tips">پوی شرطا سئت بیڌه بایڌ هوم زمووی جور ابۊن (AND). قانووݩ یل ز سر و ته وارس ابۊن؛ ٱولی قانووݩ جور وابیڌه و کار ابسته ابۊ.</string>
<string name="routing_settings_tips">ی قانووݩ تینا زمووی ائمال ابۊ ک پوی شرتا ی جۊر بیڌه و من ٱووڌه هوم زمووݩ برقرار بۊن (AND). قانووا ز روء و بلم واجۊری ابۊن وو ٱولین قانووݩ ی جۊر، ائمال ابۊ.</string>
<string name="routing_settings_comma_tip">چنتا مقدار ن وا کاما (,) ز یک جوڌا کۊنین.</string>
<string name="routing_settings_save">زفت کردن</string>
<string name="routing_settings_delete">روفتن</string>
@@ -384,47 +384,47 @@
<string name="routing_settings_import_rulesets_tip">قانووایی ک هیم سکو هڌسووݩ پاک ابۊن، هنی هم اخۊی پاکسووݩ کۊنی؟</string>
<string name="routing_settings_import_rulesets_from_clipboard">و من ٱووردن قانووا ز کلیپ بورد</string>
<string name="routing_settings_import_rulesets_from_qrcode">و من ٱووردن قانووا ز کود QR</string>
<string name="routing_settings_export_rulesets_to_clipboard">و در کشیڌن قانووا وو زفت من کلیپ بورد</string>
<string name="routing_settings_export_rulesets_to_clipboard">و در کشیڌن قانووا وو زفت کردن من کلیپ بورد</string>
<string name="routing_settings_locked">چفت هڌ، ای قانووݩ ن مجال و من ٱووردن ز پؽش سامووا زفت کۊنین</string>
<string name="routing_settings_domain" translatable="false">domain</string>
<string name="routing_settings_ip" translatable="false">ip</string>
<string name="routing_settings_process">process (نوم بسته — تینا مجال کار بوردن Xray TUN، ره بیڌن routeOnly وو Android 10+ پوشتؽووی ابۊ)</string>
<string name="routing_settings_process">process (نوم بسته — تینا مجال و کار گرؽڌن Xray TUN، ره وسته بیڌن routeOnly وو ٱندروید 10+ لادراری ابۊ)</string>
<string name="routing_settings_process_select">نوم بسته ن پسند کۊنین</string>
<string name="routing_settings_port" translatable="false">port</string>
<string name="routing_settings_protocol" translatable="false">protocol</string>
<string name="routing_settings_protocol_tip" translatable="false">[http,tls,bittorrent]</string>
<string name="routing_settings_network" translatable="false">network</string>
<string name="routing_settings_outbound_tag_hint">proxy / direct / block / &lt;%1$s&gt;</string>
<string name="routing_settings_outbound_tag_hint" translatable="false">proxy / direct / block / &lt;%1$s&gt;</string>
<string name="routing_settings_outbound_tag" translatable="false">outboundTag</string>
<string name="connection_test_pending">منپیزن واجۊری کوݩ</string>
<string name="connection_test_testing">هونی آزمایش ابۊ…</string>
<string name="connection_test_testing_count">%d کانفیگ هونی آزمایش ابۊ…</string>
<string name="connection_test_available">مووفق بی: منپیز %1$s طۊل کشی</string>
<string name="server_test_delay_value">%1$d میلی‌ثانیه</string>
<string name="connection_test_available">مووفق بی: منپیز %1$s تۊل کشی</string>
<string name="server_test_delay_value">%1$d میلی‌سانیه</string>
<string name="connection_test_error">منپیز و اینترنتن نجوست: %s</string>
<string name="connection_test_fail">اینترنت من دسرس نؽ</string>
<string name="connection_test_error_status_code">کود خطا: #%d</string>
<string name="connection_test_error_status_code">کود ختا: #%d</string>
<string name="connection_connected">منپیز هڌ. سی واجۊری کیلیک کوݩ.</string>
<string name="connection_not_connected">منپیز نؽڌ</string>
<string name="connection_running_task_left">آزمایشا هونی ٱنجوم ابۊن: %s</string>
<string name="import_subscription_success">اشتراک وا مووفقیت و من ٱووڌه وابی</string>
<string name="import_subscription_success">اشتراک وا مووفقیت و من ٱوورده وابی</string>
<string name="import_subscription_failure">و من ٱووردن اشتراک مووفق نبی</string>
<string name="title_fragment_settings">سامووا فرگمنت (Fragment)</string>
<string name="title_pref_fragment_packets">کتنا فرگمنت</string>
<string name="title_pref_fragment_length">طۊل کتنا فرگمنت (حداقل-حداکثر)</string>
<string name="title_pref_fragment_interval">فاصله منجا کتنا فرگمنت (حداقل-حداکثر)</string>
<string name="title_pref_fragment_length">تۊل کتنا فرگمنت (هدقل-هدکسر)</string>
<string name="title_pref_fragment_interval">فاسله منجا کتنا فرگمنت (هدقل-هدکسر)</string>
<string name="title_pref_fragment_enabled">ره وندن فرگمنت</string>
<string name="title_pref_fragment_maxsplit">حداکثر تقسیم فرگمنت</string>
<string name="title_pref_fragment_maxsplit">هدکسر تقسیم فرگمنت</string>
<string name="title_observatory_settings">سامووا واجۊری منپیز (Observatory)</string>
<string name="title_pref_observatory_least_ping_interval">فاصله leastPing</string>
<string name="title_pref_observatory_least_load_interval">فاصله leastLoad</string>
<string name="title_pref_observatory_least_load_method">روش HTTP سی leastLoad</string>
<string name="title_pref_observatory_least_load_sampling">نمونه گیری leastLoad</string>
<string name="title_pref_observatory_least_load_timeout">مهلت leastLoad</string>
<string name="toast_invalid_observatory_duration">زمووݩ نا موئتبر هڌ. ارزشی وری 3m یا 30s ن و کار بگیرین.</string>
<string name="toast_invalid_observatory_sampling">نمونه گیری نا موئتبر هڌ. شوماره ی مثبت ن و کار بگیرین.</string>
<string name="title_pref_observatory_least_ping_interval">فاسله leastPing</string>
<string name="title_pref_observatory_least_load_interval">فاسله leastLoad</string>
<string name="title_pref_observatory_least_load_method">بارت HTTP سی leastLoad</string>
<string name="title_pref_observatory_least_load_sampling">نمووه گیری leastLoad</string>
<string name="title_pref_observatory_least_load_timeout">موهلت leastLoad</string>
<string name="toast_invalid_observatory_duration">زمووݩ نا موئتبر هڌ. ٱرزشی و ری 3m یا 30s ن و کار بگیرین.</string>
<string name="toast_invalid_observatory_sampling">نمووه گیری نا موئتبر هڌ. شوماره ای موسبت ن و کار بگیرین.</string>
<string name="update_check_for_update">واجۊری سی ورۊ رسۊوی</string>
<string name="update_already_latest_version">سکو نوسخه دیندایی پۊرنیڌه هڌ</string>
@@ -437,12 +437,12 @@
<string name="title_policy_group_subscription_id">ز بونکۊ اشتراک</string>
<string name="title_policy_group_subscription_filter">فیلتر نیشتنا وا regex</string>
<string name="title_policy_group_test_outbounds">آزمایش بارتا (outbounds)</string>
<string name="title_policy_group_fallback">بارت جایگزین (outbound، اختیاری)</string>
<string name="title_policy_group_fallback">بارت جایگۊزین (outbound، اختیاری)</string>
<string name="server_proxy_chain_members">ٱئزا زنجیره پروکسی</string>
<string name="server_proxy_chain_pick_members">سی پسند عوزو ایچو بزنین</string>
<string name="server_proxy_chain_member_unselected">ی عوزو پسند کۊنین</string>
<string name="server_proxy_chain_members_unselected">سی هر ردیف زنجیره ی عوزو پسند کۊنین</string>
<string name="server_proxy_chain_members_unselected">سی هر ردیف زنجیره، ی عوزو پسند کۊنین</string>
<string name="server_proxy_chain_members_insufficient">تعداڌ ٱئزا بس نؽ</string>
<string name="server_proxy_chain_members_invalid">ٱئزا نا موئتبر زنجیره: %1$s</string>
@@ -450,11 +450,11 @@
<string name="title_configuration_backup_restore">لادراری گرؽڌن &amp; وورگندن</string>
<string name="title_configuration_backup">لادراری گرؽڌن ز کانفیگ</string>
<string name="title_configuration_restore">وورگندن کانفیگ</string>
<string name="title_profile_storage_cleanup">جۊر کردن داڌه یل کانفیگا</string>
<string name="summary_profile_storage_cleanup">پاک کردن داڌه یل کانفیگا ک دی و کار نؽن</string>
<string name="message_profile_storage_cleanup">داڌه یل کانفیگا ک دی من هیچ بونکۊی و کار نؽن پاک ابۊن، هنی هم اخۊی پاکسووݩ کۊنی؟ کانفیگا پسند وابیڌه وو داڌه یلی ک نتری وا موطمئنی بفهمی دی و کار نؽن پاک نابۊن.</string>
<string name="toast_profile_storage_cleanup">کانفیگا ک دی و کار نؽن پاک وابیڌن: %1$d</string>
<string name="toast_profile_storage_cleanup_skipped">نتری وا موطمئنی بفهمی ک کۊی داڌه یل کانفیگا دی و کار نؽن. هیچ داڌه ای پاک نوابی.</string>
<string name="title_profile_storage_cleanup">ترمیم جاگه زفت کردن پوروفایلا</string>
<string name="summary_profile_storage_cleanup">پاک کردن داده یل پوروفایلایی ک دی و کار گرؽڌه نؽبۊن</string>
<string name="message_profile_storage_cleanup">داده یل پوروفایلایی ک دی من هیچ بونکۊیی و کار گرؽڌه نؽبۊن پاک ابۊن، هنی هم اخۊی پاکسووݩ کۊنی؟ پوروفایل پسند وابیڌه وو داده یلی ک نتری وا موتمعنی بفهمی دی و کار گرؽڌه نؽبۊن پاک نؽبۊن.</string>
<string name="toast_profile_storage_cleanup">پوروفایلایی ک دی و کار گرؽڌه نؽبۊن پاک وابیڌن: %1$d</string>
<string name="toast_profile_storage_cleanup_skipped">نترست وا موتمعنی بفهمه ک کۊیکی ز داده یل پوروفایلا دی و کار گرؽڌه نؽبۊن. هیچ داده ای پاک نوابی.</string>
<string name="title_configuration_share">یک رسۊوی کانفیگ</string>
<string name="title_webdav_config_setting">WebDAV سامووا</string>
<string name="title_webdav_config_setting_unknown">ٱول WebDAV ن کانفیگ کۊنین</string>
@@ -464,7 +464,7 @@
<string name="title_webdav_remote_path">دایرکتوری ره دیر (اختیاری)</string>
<string name="share_method_qrcode">کود QR</string>
<string name="share_method_clipboard">لف گیری لینک کانفیگ</string>
<string name="share_method_clipboard">لف گیری لینگ کانفیگ</string>
<string name="share_method_full_content">لف گیری پوی کانفیگ</string>
<string name="action_edit">آلشتکاری</string>
<string name="action_delete">پاک کردن</string>
@@ -479,7 +479,7 @@
</string-array>
<string-array name="browser_dialer_mode">
<item>خامۊش</item>
<item>کۊر</item>
<item>OkHttp</item>
<item>WebView</item>
</string-array>
@@ -497,15 +497,15 @@
<string name="routing_preset_russia_whitelist">نومگه اسبؽڌ رۊسیه</string>
<string-array name="vpn_bypass_lan">
<item>پؽش فرض کانفیگ</item>
<item>پؽش فرز کانفیگ</item>
<item>دور زیڌه بۊ</item>
<item>دور زیڌه نبۊ</item>
</string-array>
<string-array name="outbound_domain_resolve_method">
<item>هل وو فسل مکۊنین</item>
<item>هل وو ٱووردن و میزبووݩ یل دامنه DNS</item>
<item>هل وو جایونی دامنه</item>
<item>هل وو فسل وو ٱووردن و هاستا دامنه DNS</item>
<item>هل وو فسل وو جایگۊزینی دامنه</item>
</string-array>
<string-array name="policy_group_type">
@@ -515,35 +515,35 @@
<item>گردشی (roundRobin)</item>
</string-array>
<string name="backup_location_local">محلی</string>
<string name="backup_location_local">مهلی</string>
<string name="backup_location_webdav" translatable="false">WebDAV</string>
<string name="acc_refresh">وانۊ کردن گوزارش</string>
<string name="toast_permission_denied_for">گرؽڌن موجوز مومکن نؽڌ: %1$s</string>
<string name="acc_add_subscription">ٱووردن اشتراک</string>
<string name="toast_malformed_json_detail">کانفیگ نا موئتبر هڌ: %1$s</string>
<string name="acc_add_asset">ٱووردن بونچک فایلا جغرافیایی</string>
<string name="acc_download_file">دانلود فایلا بونچک جغرافیایی</string>
<string name="acc_add_asset">ٱووردن بونچک فایلا جوقرافیایی</string>
<string name="acc_download_file">دانلود فایلا بونچک جوقرافیایی</string>
<string name="acc_qr_code">کود QR</string>
<string name="acc_copy_log">لف گیری گوزارش</string>
<string name="acc_clear_log">روفتن گوزارش</string>
<string name="acc_add_rule">ٱووردن قانووݩ</string>
<string name="acc_start">ره وستن سرویس</string>
<string name="acc_stop">واڌاشتن سرویس</string>
<string name="acc_back">برگشت</string>
<string name="acc_back">وورگشتن</string>
<string name="acc_search">پیتینیڌن</string>
<string name="acc_add">ٱووردن کانفیگ</string>
<string name="acc_more">امکووݩا بؽتر</string>
<string name="acc_selected_server">Selected</string>
<string name="acc_share_subscription">یک رسۊوی لینک اشتراک</string>
<string name="acc_more">گۊزینه یل قلوه</string>
<string name="acc_selected_server">پسند وابیڌه</string>
<string name="acc_share_subscription">یک رسۊوی لینگ اشتراک</string>
<string name="acc_share_log">یک رسۊوی گوزارش</string>
<string name="acc_remove">پاک کردن عوزو زنجیره پروکسی</string>
<string name="acc_add_member">ٱووردن عوزو زنجیره پروکسی</string>
<string name="acc_start_scanner">ره وستن اسکنر QR</string>
<string name="acc_stop_scanner">واڌاشتن اسکنر QR</string>
<string name="acc_turn_torch_on">روشن کردن چراغ</string>
<string name="acc_turn_torch_off">خاموش کردن چراغ</string>
<string name="acc_select_image">پسند ٱکس سی اسکن</string>
<string name="acc_turn_torch_on">رۊشن کردن لیت</string>
<string name="acc_turn_torch_off">کۊر کردن لیت</string>
<string name="acc_select_image">پسند شؽوات سی اسکن</string>
<string name="acc_locked">ای قانووݩ مجال و من ٱووردن ز پؽش سامووا زفت ابۊ</string>
<string name="acc_open_menu">گۊشیڌن نومگه کشاری</string>
<string name="acc_edit">آلشتکاری</string>
@@ -551,14 +551,14 @@
<string name="acc_save">زفت کردن</string>
<string name="acc_update_subscriptions">ورۊ کردن اشتراکا</string>
<string name="acc_per_app_proxy_information">دووسمندی پروکسی و ری برنومه</string>
<string name="permission_camera">دوربیݩ</string>
<string name="permission_camera">شؽواتگر</string>
<string name="permission_notification">وارسۊوی</string>
<string name="permission_local_network">شبکه محلی</string>
<string name="permission_local_network">شبکه مهلی</string>
<string name="subscription_update_updating">اشتراک %1$s هونی ورۊ ابۊ</string>
<string name="subscription_update_progress">%2$s هونی آزمایش ابۊ: %1$s</string>
<string name="tasker_blurb_start">ره وستن %1$s</string>
<string name="tasker_blurb_stop">واڌاشتن %1$s</string>
<string name="connection_test_empty_message">دووسمندی نؽ</string>
<string name="value_unknown">نا مؽخص</string>
<string name="value_unknown">نا موشخس</string>
</resources>
</resources>
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="AppThemeBase" parent="AppThemeBaseCommon">
<item name="android:windowLightNavigationBar">false</item>
</style>
</resources>
@@ -1,11 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Night theme: override window background and status bar flags for dark mode -->
<style name="AppThemeBase" parent="Theme.AppCompat.DayNight.NoActionBar">
<style name="AppThemeBaseCommon" parent="Theme.AppCompat.DayNight.NoActionBar">
<item name="android:statusBarColor">@android:color/transparent</item>
<item name="android:navigationBarColor">@android:color/transparent</item>
<item name="android:windowLightStatusBar">false</item>
<item name="android:windowLightNavigationBar">false</item>
<item name="android:windowBackground">@color/window_background_dark</item>
</style>
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="AppThemeBase" parent="AppThemeBaseCommon">
<item name="android:windowLightNavigationBar">true</item>
</style>
</resources>
+4 -2
View File
@@ -2,14 +2,16 @@
<color name="window_background_light">#FFFFFFFF</color>
<color name="window_background_dark">#FF1C1B1F</color>
<style name="AppThemeBase" parent="Theme.AppCompat.DayNight.NoActionBar">
<style name="AppThemeBaseCommon" parent="Theme.AppCompat.DayNight.NoActionBar">
<item name="android:statusBarColor">@android:color/transparent</item>
<item name="android:navigationBarColor">@android:color/transparent</item>
<item name="android:windowLightStatusBar">true</item>
<item name="android:windowLightNavigationBar">true</item>
<item name="android:windowBackground">@color/window_background_light</item>
</style>
<!-- API 27+ adds navigation bar icon appearance in the versioned base theme. -->
<style name="AppThemeBase" parent="AppThemeBaseCommon" />
<style name="AppThemeDayNight" parent="AppThemeBase" />
<style name="AppThemeDayNight.NoActionBar" parent="AppThemeBase" />
@@ -1,8 +1,8 @@
package com.v2ray.ang
import com.v2ray.ang.util.HttpUtil
import org.junit.Assert.assertEquals
import org.junit.Test
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Test
class HttpUtilTest {
@@ -1,10 +1,10 @@
package com.v2ray.ang
import com.v2ray.ang.util.Utils
import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue
import org.junit.Test
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Assertions.assertFalse
import org.junit.jupiter.api.Assertions.assertTrue
import org.junit.jupiter.api.Test
/**
* Example local unit test, which will execute on the development machine (host).
@@ -1,9 +1,9 @@
package com.v2ray.ang.extension
import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue
import org.junit.Test
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Assertions.assertFalse
import org.junit.jupiter.api.Assertions.assertTrue
import org.junit.jupiter.api.Test
class ListExtTest {
@@ -4,14 +4,14 @@ import android.util.Base64
import android.util.Log
import com.v2ray.ang.enums.EConfigType
import com.v2ray.ang.dto.entities.ProfileItem
import org.junit.After
import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse
import org.junit.Assert.assertNotNull
import org.junit.Assert.assertNull
import org.junit.Assert.assertTrue
import org.junit.Before
import org.junit.Test
import org.junit.jupiter.api.AfterEach
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Assertions.assertFalse
import org.junit.jupiter.api.Assertions.assertNotNull
import org.junit.jupiter.api.Assertions.assertNull
import org.junit.jupiter.api.Assertions.assertTrue
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
import org.mockito.MockedStatic
import org.mockito.Mockito
import org.mockito.Mockito.mockStatic
@@ -67,7 +67,7 @@ class ShadowsocksFmtTest {
return "$SS_SCHEME${base64Encoded}#${remarks.replace(" ", "%20")}"
}
@Before
@BeforeEach
fun setUp() {
mockLog = mockStatic(Log::class.java, Mockito.RETURNS_DEFAULTS)
@@ -113,7 +113,7 @@ class ShadowsocksFmtTest {
}
}
@After
@AfterEach
fun tearDown() {
mockLog.close()
mockBase64.close()
@@ -271,7 +271,7 @@ class ShadowsocksFmtTest {
val uri = ShadowsocksFmt.toUri(config)
// Verify URI does not include scheme (toUri returns without ss:// prefix)
assertFalse("toUri should not include scheme prefix", uri.startsWith(SS_SCHEME))
assertFalse(uri.startsWith(SS_SCHEME), "toUri should not include scheme prefix")
assertTrue(uri.contains("@example.com:8388"))
assertTrue(uri.contains("#Test%20Server"))
@@ -317,8 +317,8 @@ class ShadowsocksFmtTest {
// Verify toUri returns without scheme, so we need to prepend it
assertFalse(
"toUri should return URI without scheme",
regeneratedUri.startsWith(SS_SCHEME)
regeneratedUri.startsWith(SS_SCHEME),
"toUri should return URI without scheme"
)
val reparsed = ShadowsocksFmt.parse("$SS_SCHEME$regeneratedUri")
@@ -362,7 +362,7 @@ class ShadowsocksFmtTest {
val result = ShadowsocksFmt.parseSip002(ssUrl)
assertNotNull("Failed for method: $method", result)
assertNotNull(result, "Failed for method: $method")
assertEquals(method, result?.method)
}
}
@@ -1,9 +1,9 @@
package com.v2ray.ang.handler
import com.v2ray.ang.AppConfig.DEFAULT_SUBSCRIPTION_ID
import org.junit.Assert.assertEquals
import org.junit.Assert.assertNull
import org.junit.Test
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Assertions.assertNull
import org.junit.jupiter.api.Test
class OrphanProfileCleanerTest {
@@ -2,9 +2,9 @@ package com.v2ray.ang.handler
import com.v2ray.ang.dto.entities.ProfileItem
import com.v2ray.ang.enums.EConfigType
import org.junit.Assert.assertEquals
import org.junit.Assert.assertNull
import org.junit.Test
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Assertions.assertNull
import org.junit.jupiter.api.Test
class ProfileReplacementTest {
@@ -4,10 +4,10 @@ import android.util.Log
import com.tencent.mmkv.MMKV
import com.v2ray.ang.dto.entities.SubscriptionItem
import com.v2ray.ang.util.JsonUtil
import org.junit.Assert.assertEquals
import org.junit.Before
import org.junit.BeforeClass
import org.junit.Test
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.BeforeAll
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
import org.mockito.Mockito.mockStatic
import org.mockito.kotlin.any
import org.mockito.kotlin.mock
@@ -20,7 +20,7 @@ class SubscriptionIndexTest {
private val mainValues = mutableMapOf<String, String>()
private val subValues = mutableMapOf<String, String>()
@Before
@BeforeEach
fun prepareStorage() {
for ((storage, values) in listOf(main to mainValues, subs to subValues)) {
reset(storage)
@@ -99,7 +99,7 @@ class SubscriptionIndexTest {
private val subs: MMKV = mock()
private val settings: MMKV = mock()
@BeforeClass
@BeforeAll
@JvmStatic
fun initializeHandles() {
mockStatic(MMKV::class.java).use {
@@ -1,7 +1,7 @@
package com.v2ray.ang.root
import org.junit.Assert.*
import org.junit.Test
import org.junit.jupiter.api.Assertions.*
import org.junit.jupiter.api.Test
import java.util.concurrent.TimeUnit
class RootProcessRunnerTest {
@@ -1,7 +1,7 @@
package com.v2ray.ang.root
import org.junit.Assert.assertEquals
import org.junit.Test
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Test
class RootProxyManagerTest {
@@ -6,12 +6,12 @@ import android.os.Looper
import android.webkit.WebSettings
import android.webkit.WebView
import android.webkit.WebViewClient
import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse
import org.junit.Assert.assertSame
import org.junit.Assert.assertThrows
import org.junit.Assert.assertTrue
import org.junit.Test
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Assertions.assertFalse
import org.junit.jupiter.api.Assertions.assertSame
import org.junit.jupiter.api.Assertions.assertThrows
import org.junit.jupiter.api.Assertions.assertTrue
import org.junit.jupiter.api.Test
import org.mockito.Mockito.mockConstruction
import org.mockito.Mockito.mockStatic
import org.mockito.kotlin.any
@@ -5,9 +5,9 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.async
import kotlinx.coroutines.awaitAll
import kotlinx.coroutines.runBlocking
import org.junit.Assert.assertEquals
import org.junit.Assert.assertTrue
import org.junit.Test
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Assertions.assertTrue
import org.junit.jupiter.api.Test
import java.util.concurrent.CountDownLatch
import java.util.concurrent.TimeUnit
import java.util.concurrent.atomic.AtomicInteger
@@ -6,8 +6,8 @@ import com.google.zxing.DecodeHintType
import com.google.zxing.MultiFormatReader
import com.google.zxing.common.HybridBinarizer
import com.google.zxing.qrcode.QRCodeWriter
import org.junit.Assert.assertEquals
import org.junit.Test
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Test
import java.nio.ByteBuffer
class ScannerActivityTest {
@@ -1,8 +1,8 @@
package com.v2ray.ang.ui.apppicker
import android.app.Application
import org.junit.Assert.assertEquals
import org.junit.Test
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Test
import org.mockito.kotlin.mock
class AppPickerViewModelTest {
@@ -1,8 +1,8 @@
package com.v2ray.ang.ui.logcat
import org.junit.Assert.assertEquals
import org.junit.Assert.assertTrue
import org.junit.Test
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Assertions.assertTrue
import org.junit.jupiter.api.Test
class LogcatEntryTest {
@Test
@@ -1,7 +1,7 @@
package com.v2ray.ang.ui.main
import org.junit.Assert.assertEquals
import org.junit.Test
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Test
class MainImportMenuTest {
@@ -1,11 +1,11 @@
package com.v2ray.ang.ui.main
import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse
import org.junit.Assert.assertNotEquals
import org.junit.Assert.assertNull
import org.junit.Assert.assertTrue
import org.junit.Test
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Assertions.assertFalse
import org.junit.jupiter.api.Assertions.assertNotEquals
import org.junit.jupiter.api.Assertions.assertNull
import org.junit.jupiter.api.Assertions.assertTrue
import org.junit.jupiter.api.Test
class MainTestRequestsTest {
@Test
@@ -1,9 +1,9 @@
package com.v2ray.ang.ui.main
import androidx.compose.runtime.saveable.SaverScope
import org.junit.Assert.assertEquals
import org.junit.Assert.assertNull
import org.junit.Test
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Assertions.assertNull
import org.junit.jupiter.api.Test
class ServerDeleteTargetTest {
@Test
@@ -1,8 +1,8 @@
package com.v2ray.ang.ui.server
import org.junit.Assert.assertEquals
import org.junit.Assert.assertSame
import org.junit.Test
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Assertions.assertSame
import org.junit.jupiter.api.Test
class ProxyChainMembersTest {
@Test
@@ -7,10 +7,10 @@ import android.content.pm.PackageManager
import android.provider.Settings
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.runBlocking
import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue
import org.junit.Test
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Assertions.assertFalse
import org.junit.jupiter.api.Assertions.assertTrue
import org.junit.jupiter.api.Test
import org.mockito.Mockito.mockConstruction
import org.mockito.kotlin.mock
import org.mockito.kotlin.whenever
@@ -4,9 +4,9 @@ import android.app.Application
import com.v2ray.ang.AppConfig
import com.v2ray.ang.dto.entities.AssetUrlCache
import com.v2ray.ang.dto.entities.AssetUrlItem
import org.junit.Assert.assertEquals
import org.junit.Assert.assertTrue
import org.junit.Test
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Assertions.assertTrue
import org.junit.jupiter.api.Test
import org.mockito.Mockito.mock
class UserAssetViewModelTest {
@@ -1,12 +1,11 @@
package com.v2ray.ang.util
import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse
import org.junit.Assert.assertThrows
import org.junit.Assert.assertTrue
import org.junit.Rule
import org.junit.Test
import org.junit.rules.TemporaryFolder
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Assertions.assertFalse
import org.junit.jupiter.api.Assertions.assertThrows
import org.junit.jupiter.api.Assertions.assertTrue
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.io.TempDir
import java.io.File
import java.util.zip.ZipEntry
import java.util.zip.ZipException
@@ -14,13 +13,13 @@ import java.util.zip.ZipOutputStream
class ZipUtilTest {
@get:Rule
val temporaryFolder = TemporaryFolder()
@TempDir
lateinit var tempDir: File
@Test
fun unzipToFolderExtractsNestedFile() {
val archive = createArchive("nested/config" to "value".toByteArray())
val destination = File(temporaryFolder.root, "destination")
val destination = File(tempDir, "destination")
assertTrue(ZipUtil.unzipToFolder(archive, destination.absolutePath))
assertEquals("value", File(destination, "nested/config").readText())
@@ -29,7 +28,7 @@ class ZipUtilTest {
@Test
fun extractArchiveRejectsPathTraversal() {
val archive = createArchive("../outside" to "overwrite".toByteArray())
val outside = File(temporaryFolder.root, "outside")
val outside = File(tempDir, "outside")
assertArchiveRejected(archive)
@@ -100,7 +99,7 @@ class ZipUtilTest {
archive: File,
limits: ZipUtil.ExtractionLimits = extractionLimits(),
) {
val destination = File(temporaryFolder.root, "destination")
val destination = File(tempDir, "destination")
assertThrows(ZipException::class.java) {
ZipUtil.extractArchive(archive, destination, limits)
}
@@ -108,7 +107,7 @@ class ZipUtilTest {
}
private fun createArchive(vararg entries: Pair<String, ByteArray>): File {
val archive = temporaryFolder.newFile()
val archive = File.createTempFile("archive", ".zip", tempDir)
ZipOutputStream(archive.outputStream()).use { output ->
entries.forEach { (name, contents) ->
output.putNextEntry(ZipEntry(name))
+11 -8
View File
@@ -3,20 +3,21 @@ agp = "9.4.1"
desugarJdkLibs = "2.1.5"
gradleLicensePlugin = "0.9.91"
kotlin = "2.4.20"
coreKtx = "1.19.0"
junit = "4.13.2"
coreKtx = "1.19.1"
junit = "6.1.3"
junitVersion = "1.3.0"
espressoCore = "3.7.0"
activity = "1.13.0"
appcompat = "1.8.0"
mmkvStatic = "1.3.16"
mmkvStatic = "1.3.17"
gson = "2.14.0"
okhttp = "5.5.0"
kotlinxCoroutines = "1.11.0"
core = "3.5.4"
workRuntimeKtx = "2.11.2"
workRuntimeKtx = "2.12.0"
lifecycleViewmodelKtx = "2.11.0"
mockitoMockitoInline = "5.2.0"
mockitoCore = "5.24.0"
mockitoKotlin = "6.4.0"
camerax = "1.6.2"
composeBom = "2026.09.00"
reorderable = "3.1.0"
@@ -25,7 +26,9 @@ coil = "3.6.3"
androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" }
desugar-jdk-libs = { module = "com.android.tools:desugar_jdk_libs", version.ref = "desugarJdkLibs" }
gradle-license-plugin = { module = "com.jaredsburrows:gradle-license-plugin", version.ref = "gradleLicensePlugin" }
junit = { group = "junit", name = "junit", version.ref = "junit" }
junit-bom = { group = "org.junit", name = "junit-bom", version.ref = "junit" }
junit-jupiter = { group = "org.junit.jupiter", name = "junit-jupiter" }
junit-platform-launcher = { group = "org.junit.platform", name = "junit-platform-launcher" }
androidx-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junitVersion" }
androidx-espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espressoCore" }
mmkv-static = { module = "com.tencent:mmkv-static", version.ref = "mmkvStatic" }
@@ -38,8 +41,8 @@ work-runtime-ktx = { module = "androidx.work:work-runtime-ktx", version.ref = "w
work-multiprocess = { module = "androidx.work:work-multiprocess", version.ref = "workRuntimeKtx" }
lifecycle-viewmodel-ktx = { module = "androidx.lifecycle:lifecycle-viewmodel-ktx", version.ref = "lifecycleViewmodelKtx" }
lifecycle-runtime-ktx = { module = "androidx.lifecycle:lifecycle-runtime-ktx", version.ref = "lifecycleViewmodelKtx" }
org-mockito-mockito-inline = { module = "org.mockito:mockito-inline", version.ref = "mockitoMockitoInline" }
mockito-kotlin = { module = "org.mockito.kotlin:mockito-kotlin", version.ref = "mockitoMockitoInline" }
mockito-core = { module = "org.mockito:mockito-core", version.ref = "mockitoCore" }
mockito-kotlin = { module = "org.mockito.kotlin:mockito-kotlin", version.ref = "mockitoKotlin" }
reorderable = { module = "sh.calvin.reorderable:reorderable", version.ref = "reorderable" }
# CameraX
+1 -1
View File
@@ -1,6 +1,6 @@
#Thu Nov 14 12:42:51 BDT 2024
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-9.6.0-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-9.8.0-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists