├── .github ├── ISSUE_TEMPLATE │ ├── bug_cn.md │ └── config.yml └── workflows │ ├── build.yml │ └── fastlane.yml ├── .gitignore ├── .gitmodules ├── CR.md ├── LICENSE ├── README.md ├── V2rayNG ├── app │ ├── build.gradle.kts │ ├── proguard-rules.pro │ └── src │ │ ├── dev │ │ └── res │ │ │ └── values │ │ │ └── strings.xml │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── assets │ │ │ ├── custom_routing_black │ │ │ ├── custom_routing_global │ │ │ ├── custom_routing_white │ │ │ ├── custom_routing_white_iran │ │ │ ├── open_source_licenses.html │ │ │ ├── proxy_packagename.txt │ │ │ └── v2ray_config.json │ │ ├── ic_launcher-web.png │ │ ├── java │ │ │ └── com │ │ │ │ └── v2ray │ │ │ │ └── ang │ │ │ │ ├── AngApplication.kt │ │ │ │ ├── AppConfig.kt │ │ │ │ ├── dto │ │ │ │ ├── AppInfo.kt │ │ │ │ ├── AssetUrlItem.kt │ │ │ │ ├── CheckUpdateResult.kt │ │ │ │ ├── ConfigResult.kt │ │ │ │ ├── EConfigType.kt │ │ │ │ ├── GitHubRelease.kt │ │ │ │ ├── Hysteria2Bean.kt │ │ │ │ ├── IPAPIInfo.kt │ │ │ │ ├── Language.kt │ │ │ │ ├── NetworkType.kt │ │ │ │ ├── ProfileItem.kt │ │ │ │ ├── RoutingType.kt │ │ │ │ ├── RulesetItem.kt │ │ │ │ ├── ServerAffiliationInfo.kt │ │ │ │ ├── ServerConfig.kt │ │ │ │ ├── ServersCache.kt │ │ │ │ ├── SubscriptionItem.kt │ │ │ │ ├── V2rayConfig.kt │ │ │ │ ├── VmessQRCode.kt │ │ │ │ └── VpnInterfaceAddressConfig.kt │ │ │ │ ├── extension │ │ │ │ └── _Ext.kt │ │ │ │ ├── fmt │ │ │ │ ├── CustomFmt.kt │ │ │ │ ├── FmtBase.kt │ │ │ │ ├── HttpFmt.kt │ │ │ │ ├── Hysteria2Fmt.kt │ │ │ │ ├── ShadowsocksFmt.kt │ │ │ │ ├── SocksFmt.kt │ │ │ │ ├── TrojanFmt.kt │ │ │ │ ├── VlessFmt.kt │ │ │ │ ├── VmessFmt.kt │ │ │ │ └── WireguardFmt.kt │ │ │ │ ├── handler │ │ │ │ ├── AngConfigManager.kt │ │ │ │ ├── MigrateManager.kt │ │ │ │ ├── MmkvManager.kt │ │ │ │ ├── SettingsManager.kt │ │ │ │ ├── SpeedtestManager.kt │ │ │ │ ├── UpdateCheckerManager.kt │ │ │ │ └── V2rayConfigManager.kt │ │ │ │ ├── helper │ │ │ │ ├── CustomDividerItemDecoration.kt │ │ │ │ ├── ItemTouchHelperAdapter.kt │ │ │ │ ├── ItemTouchHelperViewHolder.kt │ │ │ │ └── SimpleItemTouchHelperCallback.kt │ │ │ │ ├── plugin │ │ │ │ ├── NativePlugin.kt │ │ │ │ ├── Plugin.kt │ │ │ │ ├── PluginContract.kt │ │ │ │ ├── PluginList.kt │ │ │ │ ├── PluginManager.kt │ │ │ │ └── ResolvedPlugin.kt │ │ │ │ ├── receiver │ │ │ │ ├── BootReceiver.kt │ │ │ │ ├── TaskerReceiver.kt │ │ │ │ └── WidgetProvider.kt │ │ │ │ ├── service │ │ │ │ ├── NotificationService.kt │ │ │ │ ├── ProcessService.kt │ │ │ │ ├── QSTileService.kt │ │ │ │ ├── ServiceControl.kt │ │ │ │ ├── SubscriptionUpdater.kt │ │ │ │ ├── V2RayProxyOnlyService.kt │ │ │ │ ├── V2RayServiceManager.kt │ │ │ │ ├── V2RayTestService.kt │ │ │ │ └── V2RayVpnService.kt │ │ │ │ ├── ui │ │ │ │ ├── AboutActivity.kt │ │ │ │ ├── BaseActivity.kt │ │ │ │ ├── CheckUpdateActivity.kt │ │ │ │ ├── FragmentAdapter.kt │ │ │ │ ├── LogcatActivity.kt │ │ │ │ ├── LogcatRecyclerAdapter.kt │ │ │ │ ├── MainActivity.kt │ │ │ │ ├── MainRecyclerAdapter.kt │ │ │ │ ├── PerAppProxyActivity.kt │ │ │ │ ├── PerAppProxyAdapter.kt │ │ │ │ ├── RoutingEditActivity.kt │ │ │ │ ├── RoutingSettingActivity.kt │ │ │ │ ├── RoutingSettingRecyclerAdapter.kt │ │ │ │ ├── ScScannerActivity.kt │ │ │ │ ├── ScSwitchActivity.kt │ │ │ │ ├── ScannerActivity.kt │ │ │ │ ├── ServerActivity.kt │ │ │ │ ├── ServerCustomConfigActivity.kt │ │ │ │ ├── SettingsActivity.kt │ │ │ │ ├── SubEditActivity.kt │ │ │ │ ├── SubSettingActivity.kt │ │ │ │ ├── SubSettingRecyclerAdapter.kt │ │ │ │ ├── TaskerActivity.kt │ │ │ │ ├── UrlSchemeActivity.kt │ │ │ │ ├── UserAssetActivity.kt │ │ │ │ └── UserAssetUrlActivity.kt │ │ │ │ ├── util │ │ │ │ ├── AppManagerUtil.kt │ │ │ │ ├── HttpUtil.kt │ │ │ │ ├── JsonUtil.kt │ │ │ │ ├── MessageUtil.kt │ │ │ │ ├── MyContextWrapper.kt │ │ │ │ ├── PluginUtil.kt │ │ │ │ ├── QRCodeDecoder.kt │ │ │ │ ├── Utils.kt │ │ │ │ └── ZipUtil.kt │ │ │ │ └── viewmodel │ │ │ │ ├── MainViewModel.kt │ │ │ │ └── SettingsViewModel.kt │ │ └── res │ │ │ ├── color │ │ │ └── color_highlight_material.xml │ │ │ ├── drawable-hdpi │ │ │ ├── ic_stat_direct.png │ │ │ ├── ic_stat_name.png │ │ │ └── ic_stat_proxy.png │ │ │ ├── drawable-mdpi │ │ │ ├── ic_stat_direct.png │ │ │ ├── ic_stat_name.png │ │ │ ├── ic_stat_name_black.png │ │ │ └── ic_stat_proxy.png │ │ │ ├── drawable-night │ │ │ ├── ic_about_24dp.xml │ │ │ ├── ic_action_done.xml │ │ │ ├── ic_add_24dp.xml │ │ │ ├── ic_backup_24dp.xml │ │ │ ├── ic_check_update_24dp.xml │ │ │ ├── ic_cloud_download_24dp.xml │ │ │ ├── ic_copy.xml │ │ │ ├── ic_delete_24dp.xml │ │ │ ├── ic_description_24dp.xml │ │ │ ├── ic_edit_24dp.xml │ │ │ ├── ic_fab_check.xml │ │ │ ├── ic_feedback_24dp.xml │ │ │ ├── ic_file_24dp.xml │ │ │ ├── ic_image_24dp.xml │ │ │ ├── ic_lock_24dp.xml │ │ │ ├── ic_logcat_24dp.xml │ │ │ ├── ic_more_vert_24dp.xml │ │ │ ├── ic_outline_filter_alt_24.xml │ │ │ ├── ic_per_apps_24dp.xml │ │ │ ├── ic_play_24dp.xml │ │ │ ├── ic_privacy_24dp.xml │ │ │ ├── ic_promotion_24dp.xml │ │ │ ├── ic_restore_24dp.xml │ │ │ ├── ic_routing_24dp.xml │ │ │ ├── ic_save_24dp.xml │ │ │ ├── ic_scan_24dp.xml │ │ │ ├── ic_select_all_24dp.xml │ │ │ ├── ic_settings_24dp.xml │ │ │ ├── ic_share_24dp.xml │ │ │ ├── ic_source_code_24dp.xml │ │ │ ├── ic_stop_24dp.xml │ │ │ ├── ic_subscriptions_24dp.xml │ │ │ ├── ic_telegram_24dp.xml │ │ │ └── nav_header_bg.png │ │ │ ├── drawable-xhdpi │ │ │ ├── ic_stat_direct.png │ │ │ ├── ic_stat_name.png │ │ │ ├── ic_stat_name_black.png │ │ │ └── ic_stat_proxy.png │ │ │ ├── drawable-xxhdpi │ │ │ ├── ic_stat_direct.png │ │ │ ├── ic_stat_name.png │ │ │ ├── ic_stat_name_black.png │ │ │ └── ic_stat_proxy.png │ │ │ ├── drawable-xxxhdpi │ │ │ ├── ic_stat_direct.png │ │ │ ├── ic_stat_name.png │ │ │ ├── ic_stat_name_black.png │ │ │ └── ic_stat_proxy.png │ │ │ ├── drawable │ │ │ ├── custom_divider.xml │ │ │ ├── ic_about_24dp.xml │ │ │ ├── ic_action_done.xml │ │ │ ├── ic_add_24dp.xml │ │ │ ├── ic_backup_24dp.xml │ │ │ ├── ic_check_update_24dp.xml │ │ │ ├── ic_circle.xml │ │ │ ├── ic_cloud_download_24dp.xml │ │ │ ├── ic_copy.xml │ │ │ ├── ic_delete_24dp.xml │ │ │ ├── ic_description_24dp.xml │ │ │ ├── ic_edit_24dp.xml │ │ │ ├── ic_fab_check.xml │ │ │ ├── ic_feedback_24dp.xml │ │ │ ├── ic_file_24dp.xml │ │ │ ├── ic_image_24dp.xml │ │ │ ├── ic_lock_24dp.xml │ │ │ ├── ic_logcat_24dp.xml │ │ │ ├── ic_more_vert_24dp.xml │ │ │ ├── ic_outline_filter_alt_24.xml │ │ │ ├── ic_per_apps_24dp.xml │ │ │ ├── ic_play_24dp.xml │ │ │ ├── ic_privacy_24dp.xml │ │ │ ├── ic_promotion_24dp.xml │ │ │ ├── ic_qu_scan_24dp.xml │ │ │ ├── ic_qu_switch_24dp.xml │ │ │ ├── ic_restore_24dp.xml │ │ │ ├── ic_rounded_corner_active.xml │ │ │ ├── ic_rounded_corner_inactive.xml │ │ │ ├── ic_routing_24dp.xml │ │ │ ├── ic_save_24dp.xml │ │ │ ├── ic_scan_24dp.xml │ │ │ ├── ic_select_all_24dp.xml │ │ │ ├── ic_settings_24dp.xml │ │ │ ├── ic_share_24dp.xml │ │ │ ├── ic_source_code_24dp.xml │ │ │ ├── ic_stop_24dp.xml │ │ │ ├── ic_subscriptions_24dp.xml │ │ │ ├── ic_telegram_24dp.xml │ │ │ ├── license_24px.xml │ │ │ └── nav_header_bg.png │ │ │ ├── font │ │ │ └── montserrat_thin.ttf │ │ │ ├── layout │ │ │ ├── activity_about.xml │ │ │ ├── activity_bypass_list.xml │ │ │ ├── activity_check_update.xml │ │ │ ├── activity_logcat.xml │ │ │ ├── activity_main.xml │ │ │ ├── activity_none.xml │ │ │ ├── activity_routing_edit.xml │ │ │ ├── activity_routing_setting.xml │ │ │ ├── activity_server_custom_config.xml │ │ │ ├── activity_server_hysteria2.xml │ │ │ ├── activity_server_shadowsocks.xml │ │ │ ├── activity_server_socks.xml │ │ │ ├── activity_server_trojan.xml │ │ │ ├── activity_server_vless.xml │ │ │ ├── activity_server_vmess.xml │ │ │ ├── activity_server_wireguard.xml │ │ │ ├── activity_settings.xml │ │ │ ├── activity_sub_edit.xml │ │ │ ├── activity_sub_setting.xml │ │ │ ├── activity_tasker.xml │ │ │ ├── activity_user_asset.xml │ │ │ ├── activity_user_asset_url.xml │ │ │ ├── dialog_config_filter.xml │ │ │ ├── item_qrcode.xml │ │ │ ├── item_recycler_bypass_list.xml │ │ │ ├── item_recycler_footer.xml │ │ │ ├── item_recycler_logcat.xml │ │ │ ├── item_recycler_main.xml │ │ │ ├── item_recycler_routing_setting.xml │ │ │ ├── item_recycler_sub_setting.xml │ │ │ ├── item_recycler_user_asset.xml │ │ │ ├── layout_address_port.xml │ │ │ ├── layout_tls.xml │ │ │ ├── layout_tls_hysteria2.xml │ │ │ ├── layout_transport.xml │ │ │ ├── nav_header.xml │ │ │ ├── preference_with_help_link.xml │ │ │ └── widget_switch.xml │ │ │ ├── menu │ │ │ ├── action_server.xml │ │ │ ├── action_sub_setting.xml │ │ │ ├── menu_asset.xml │ │ │ ├── menu_bypass_list.xml │ │ │ ├── menu_drawer.xml │ │ │ ├── menu_logcat.xml │ │ │ ├── menu_main.xml │ │ │ ├── menu_routing_setting.xml │ │ │ └── menu_scanner.xml │ │ │ ├── mipmap-anydpi-v26 │ │ │ ├── ic_banner.xml │ │ │ ├── ic_launcher.xml │ │ │ └── ic_launcher_round.xml │ │ │ ├── mipmap-hdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_foreground.png │ │ │ ├── mipmap-mdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_foreground.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xhdpi │ │ │ ├── ic_banner.png │ │ │ ├── ic_banner_foreground.png │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_foreground.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_foreground.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_foreground.png │ │ │ └── ic_launcher_round.png │ │ │ ├── raw │ │ │ └── licenses.xml │ │ │ ├── values-ar │ │ │ └── strings.xml │ │ │ ├── values-bn │ │ │ └── strings.xml │ │ │ ├── values-bqi-rIR │ │ │ └── strings.xml │ │ │ ├── values-fa │ │ │ └── strings.xml │ │ │ ├── values-night │ │ │ ├── colors.xml │ │ │ └── themes.xml │ │ │ ├── values-ru │ │ │ └── strings.xml │ │ │ ├── values-sw360dp-v13 │ │ │ └── values-preference.xml │ │ │ ├── values-vi │ │ │ └── strings.xml │ │ │ ├── values-zh-rCN │ │ │ └── strings.xml │ │ │ ├── values-zh-rTW │ │ │ └── strings.xml │ │ │ ├── values │ │ │ ├── arrays.xml │ │ │ ├── attrs.xml │ │ │ ├── colors.xml │ │ │ ├── dimens.xml │ │ │ ├── ic_banner_background.xml │ │ │ ├── ic_launcher_background.xml │ │ │ ├── strings.xml │ │ │ └── themes.xml │ │ │ └── xml │ │ │ ├── app_widget_provider.xml │ │ │ ├── cache_paths.xml │ │ │ ├── network_security_config.xml │ │ │ ├── pref_settings.xml │ │ │ └── shortcuts.xml │ │ ├── pre_release │ │ └── res │ │ │ └── values │ │ │ └── strings.xml │ │ └── test │ │ └── java │ │ └── com │ │ └── v2ray │ │ └── ang │ │ ├── HttpUtilTest.kt │ │ └── UtilsTest.kt ├── build.gradle.kts ├── gradle.properties ├── gradle │ ├── libs.versions.toml │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle.kts ├── compile-tun2socks.sh ├── fastlane └── metadata │ └── android │ └── en-US │ ├── full_description.txt │ ├── images │ └── icon.png │ ├── short_description.txt │ └── title.txt ├── libhysteria2.sh └── tun2socks.mk /.github/ISSUE_TEMPLATE/bug_cn.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: v2rayNG程序问题 3 | about: 创建一个报告来帮助我们改进 4 | --- 5 | 6 | 在提出问题前请先自行排除服务器端问题,同时也请通过搜索确认是否有人提出过相同问题。 7 | 8 | 9 | ### 预期行为 10 | 描述你认为应该发生什么 11 | 12 | ### 实际行为 13 | 描述实际发生了什么 14 | 15 | ### 复现方法 16 | 1. 17 | 2. 18 | 3. 19 | 20 | ### 日志信息 21 | <details> 22 | 23 | 通过`adb logcat -s com.v2ray.ang GoLog V2rayConfigUtilGoLog Main`获取日志。请自行删减日志中可能出现的敏感信息。 24 | 25 | 如果问题可重现,建议先执行`adb logcat -c`清空系统日志再执行上述命令,再操作重现问题。 26 | ``` 27 | 在这里粘贴日志 28 | ``` 29 | </details> 30 | 31 | ### 环境信息 32 | 33 | ### 额外信息(可选) 34 | 35 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | contact_links: 3 | - name: V2Ray程序问题 4 | url: https://github.com/v2fly/v2ray-core/ 5 | about: 如果您有V2Ray而非v2rayNG的问题,请至这个链接讨论。 -------------------------------------------------------------------------------- /.github/workflows/fastlane.yml: -------------------------------------------------------------------------------- 1 | name: Validate Fastlane metadata 2 | 3 | on: 4 | workflow_dispatch: 5 | push: 6 | branches: [ "master" ] 7 | pull_request: 8 | branches: [ "master" ] 9 | 10 | jobs: 11 | go: 12 | runs-on: ubuntu-latest 13 | steps: 14 | - uses: actions/checkout@v4 15 | - name: Validate Fastlane Supply Metadata 16 | uses: ashutoshgngwr/validate-fastlane-supply-metadata@v2.1.0 17 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Ignore data and key store files 2 | *.dat 3 | *.jks 4 | 5 | # Ignore output JSON file 6 | V2rayNG/app/release/output.json 7 | 8 | # Ignore IDE and build system directories 9 | .idea/ 10 | .gradle/ 11 | *.iml 12 | 13 | # Ignore local properties and DS_Store files 14 | /local.properties 15 | .DS_Store 16 | 17 | # Ignore build directories and captures 18 | /build 19 | /captures 20 | V2rayNG/app/build 21 | V2rayNG/build 22 | V2rayNG/local.properties 23 | 24 | # Ignore APK and AAR files 25 | *.apk 26 | *.aar 27 | 28 | # Ignore signing properties 29 | signing.properties 30 | 31 | # Ignore shared object files 32 | *.so 33 | 34 | # Ignore Google services JSON 35 | V2rayNG/app/google-services.json 36 | 37 | # Additional common Android/Java ignores 38 | *.log 39 | *.tmp 40 | *.bak 41 | *.swp 42 | *.orig 43 | *.class 44 | *.jar 45 | *.war 46 | *.ear 47 | 48 | # Ignore executable files 49 | *.exe 50 | *.dll 51 | *.obj 52 | *.o 53 | *.pyc 54 | *.pyo 55 | 56 | # Ignore files from other IDEs 57 | .vscode/ 58 | .classpath 59 | .project 60 | .settings/ 61 | *.sublime-workspace 62 | *.sublime-project 63 | 64 | # Ignore OS-specific files 65 | Thumbs.db 66 | .DS_Store 67 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "hysteria"] 2 | path = hysteria 3 | url = https://github.com/apernet/hysteria 4 | [submodule "AndroidLibXrayLite"] 5 | path = AndroidLibXrayLite 6 | url = https://github.com/2dust/AndroidLibXrayLite 7 | [submodule "badvpn"] 8 | path = badvpn 9 | url = https://github.com/XTLS/badvpn 10 | [submodule "libancillary"] 11 | path = libancillary 12 | url = https://github.com/shadowsocks/libancillary 13 | -------------------------------------------------------------------------------- /CR.md: -------------------------------------------------------------------------------- 1 | **v2rayNG 隐私权政策** 2 | 3 | 本政策自2023年11月17日起施行 4 | 5 | 2dust 将 v2rayNG 应用程序构建为开源应用程序。 本服务由 2dust 免费提供,并且旨在按原样使用。 6 | 7 | v2rayNG 尊重并保护所有用户的个人隐私权,为此我们向大众公开这份隐私权政策。**您使用 v2rayNG 即代表您以阅读并同意了这份条款,如果您不同意这份条款请立即停止使用并卸载 v2rayNG。** 8 | 9 | **信息收集** 10 | 11 | v2rayNG 软件自身不会发送任何信息到开发者,但是您下载软件的应用市场(如 Google Play)可能会收集关于应用运行状态的相关信息并提供给 v2rayNG 开发者。有关这些信息,请阅读您使用的应用市场所提供的隐私权政策。 12 | 13 | v2rayNG 软件中可能包含需要通过 IAP 支付解锁的功能,您的支付信息将由相关的 IAP 渠道进行处理,而我们对支付信息没有访问权。 14 | 15 | 当您向 v2rayNG 开发者反馈软件运行中的错误时,开发者可能会要求您提供软件以及系统的日志以帮助确认问题的原因。因日志中可能包括敏感信息,此类信息只能由您自己操作发送。**我们不对任何传输服务的安全性和隐私性做任何明示或暗示的担保,请您在传送相关信息时选择可以您自身可以接受的方式。** 16 | 17 | **信息共享** 18 | 19 | 我们不会向任何第三方出售收集到的用户数据。我们可能向外部开发者提供信息以协助软件的开发,但是在提供信息之前我们会传达相关保密义务并确定其可以遵守。 20 | 21 | **信息存留** 22 | 23 | 除非有相关法律规定,我们会在 30 天内清除不需要继续使用的用户数据,或将统计数据整合为无法识别单个用户的综合报告。 24 | 25 | **信息泄露** 26 | 27 | 我们会使用合理的技术和安全手段尽力保护用户的数据,但是无法保证数据的绝对安全。如果我们确认数据发生了泄露,我们会在 7 天内通过可用的渠道通知用户。**您同意不向我们追责任何因不可抗力而造成的损失。** 28 | 29 | **儿童隐私** 30 | 31 | 这些服务不针对 13 岁以下的任何人。我不会故意收集 13 岁以下儿童的个人身份信息。 如果我发现 13 岁以下的儿童向我提供了个人信息,我会立即从我们的服务器中删除该信息。 如果您是父母或监护人,并且您知道您的孩子向我们提供了个人信息,请与我联系,以便我能够采取必要的行动。 32 | 33 | **条款修改** 34 | 35 | 我们保留修改这份隐私权政策的权利,但是会确保在更新条款前至少 30 天通过我们的可用渠道和应用内提示来通知用户。**在新条款生效后继续使用软件即表示您同意修改后的隐私权政策。** 36 | 37 | **联系我们** 38 | 39 | 如果您对我的隐私政策有任何疑问或建议,请随时通过 CaptainIronng@protonmail.com 与我联系。 40 | 41 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # v2rayNG 2 | 3 | A V2Ray client for Android, support [Xray core](https://github.com/XTLS/Xray-core) and [v2fly core](https://github.com/v2fly/v2ray-core) 4 | 5 | [](https://developer.android.com/about/versions/lollipop) 6 | [](https://kotlinlang.org) 7 | [](https://github.com/2dust/v2rayNG/commits/master) 8 | [](https://www.codefactor.io/repository/github/2dust/v2rayng) 9 | [](https://github.com/2dust/v2rayNG/releases) 10 | [](https://t.me/v2rayn) 11 | 12 | ### Telegram Channel 13 | [github_2dust](https://t.me/github_2dust) 14 | 15 | ### Usage 16 | 17 | #### Geoip and Geosite 18 | - geoip.dat and geosite.dat files are in `Android/data/com.v2ray.ang/files/assets` (path may differ on some Android device) 19 | - download feature will get enhanced version in this [repo](https://github.com/Loyalsoldier/v2ray-rules-dat) (Note it need a working proxy) 20 | - latest official [domain list](https://github.com/Loyalsoldier/v2ray-rules-dat) and [ip list](https://github.com/Loyalsoldier/geoip) can be imported manually 21 | - possible to use third party dat file in the same folder, like [h2y](https://guide.v2fly.org/routing/sitedata.html#%E5%A4%96%E7%BD%AE%E7%9A%84%E5%9F%9F%E5%90%8D%E6%96%87%E4%BB%B6) 22 | 23 | ### More in our [wiki](https://github.com/2dust/v2rayNG/wiki) 24 | 25 | ### Development guide 26 | 27 | Android project under V2rayNG folder can be compiled directly in Android Studio, or using Gradle wrapper. But the v2ray core inside the aar is (probably) outdated. 28 | The aar can be compiled from the Golang project [AndroidLibV2rayLite](https://github.com/2dust/AndroidLibV2rayLite) or [AndroidLibXrayLite](https://github.com/2dust/AndroidLibXrayLite). 29 | For a quick start, read guide for [Go Mobile](https://github.com/golang/go/wiki/Mobile) and [Makefiles for Go Developers](https://tutorialedge.net/golang/makefiles-for-go-developers/) 30 | 31 | v2rayNG can run on Android Emulators. For WSA, VPN permission need to be granted via 32 | `appops set [package name] ACTIVATE_VPN allow` 33 | -------------------------------------------------------------------------------- /V2rayNG/app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /V2rayNG/app/src/dev/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <resources> 3 | <item name="app_name" type="string">v2rayNG (DEV)</item> 4 | </resources> -------------------------------------------------------------------------------- /V2rayNG/app/src/main/assets/custom_routing_global: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "remarks": "阻断udp443", 4 | "outboundTag": "block", 5 | "port": "443", 6 | "network": "udp" 7 | }, 8 | { 9 | "remarks": "绕过局域网IP", 10 | "outboundTag": "direct", 11 | "ip": [ 12 | "geoip:private" 13 | ] 14 | }, 15 | { 16 | "remarks": "绕过局域网域名", 17 | "outboundTag": "direct", 18 | "domain": [ 19 | "geosite:private" 20 | ] 21 | }, 22 | { 23 | "remarks": "最终代理", 24 | "port": "0-65535", 25 | "outboundTag": "proxy" 26 | } 27 | ] -------------------------------------------------------------------------------- /V2rayNG/app/src/main/assets/custom_routing_white: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "remarks": "Google cn", 4 | "outboundTag": "proxy", 5 | "domain": [ 6 | "domain:googleapis.cn", 7 | "domain:gstatic.com" 8 | ] 9 | }, 10 | { 11 | "remarks": "阻断udp443", 12 | "outboundTag": "block", 13 | "port": "443", 14 | "network": "udp" 15 | }, 16 | { 17 | "remarks": "绕过局域网IP", 18 | "outboundTag": "direct", 19 | "ip": [ 20 | "geoip:private" 21 | ] 22 | }, 23 | { 24 | "remarks": "绕过局域网域名", 25 | "outboundTag": "direct", 26 | "domain": [ 27 | "geosite:private" 28 | ] 29 | }, 30 | { 31 | "remarks": "绕过中国公共DNSIP", 32 | "outboundTag": "direct", 33 | "ip": [ 34 | "223.5.5.5", 35 | "223.6.6.6", 36 | "2400:3200::1", 37 | "2400:3200:baba::1", 38 | "119.29.29.29", 39 | "1.12.12.12", 40 | "120.53.53.53", 41 | "2402:4e00::", 42 | "2402:4e00:1::", 43 | "180.76.76.76", 44 | "2400:da00::6666", 45 | "114.114.114.114", 46 | "114.114.115.115", 47 | "114.114.114.119", 48 | "114.114.115.119", 49 | "114.114.114.110", 50 | "114.114.115.110", 51 | "180.184.1.1", 52 | "180.184.2.2", 53 | "101.226.4.6", 54 | "218.30.118.6", 55 | "123.125.81.6", 56 | "140.207.198.6", 57 | "1.2.4.8", 58 | "210.2.4.8", 59 | "52.80.66.66", 60 | "117.50.22.22", 61 | "2400:7fc0:849e:200::4", 62 | "2404:c2c0:85d8:901::4", 63 | "117.50.10.10", 64 | "52.80.52.52", 65 | "2400:7fc0:849e:200::8", 66 | "2404:c2c0:85d8:901::8", 67 | "117.50.60.30", 68 | "52.80.60.30" 69 | ] 70 | }, 71 | { 72 | "remarks": "绕过中国公共DNS域名", 73 | "outboundTag": "direct", 74 | "domain": [ 75 | "domain:alidns.com", 76 | "domain:doh.pub", 77 | "domain:dot.pub", 78 | "domain:360.cn", 79 | "domain:onedns.net" 80 | ] 81 | }, 82 | { 83 | "remarks": "绕过中国IP", 84 | "outboundTag": "direct", 85 | "ip": [ 86 | "geoip:cn" 87 | ] 88 | }, 89 | { 90 | "remarks": "绕过中国域名", 91 | "outboundTag": "direct", 92 | "domain": [ 93 | "geosite:cn" 94 | ] 95 | } 96 | ] -------------------------------------------------------------------------------- /V2rayNG/app/src/main/assets/custom_routing_white_iran: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "remarks": "Block udp443", 4 | "outboundTag": "block", 5 | "port": "443", 6 | "network": "udp" 7 | }, 8 | { 9 | "remarks": "Direct LAN IP", 10 | "outboundTag": "direct", 11 | "ip": [ 12 | "geoip:private" 13 | ] 14 | }, 15 | { 16 | "remarks": "Direct LAN domains", 17 | "outboundTag": "direct", 18 | "domain": [ 19 | "geosite:private" 20 | ] 21 | }, 22 | { 23 | "remarks": "Bypass Iran domains", 24 | "outboundTag": "direct", 25 | "domain": [ 26 | "domain:ir", 27 | "geosite:category-ir" 28 | ] 29 | }, 30 | { 31 | "remarks": "Bypass Iran IP", 32 | "outboundTag": "direct", 33 | "ip": [ 34 | "geoip:ir" 35 | ] 36 | } 37 | ] 38 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/assets/v2ray_config.json: -------------------------------------------------------------------------------- 1 | { 2 | "stats":{}, 3 | "log": { 4 | "loglevel": "warning" 5 | }, 6 | "policy":{ 7 | "levels": { 8 | "8": { 9 | "handshake": 4, 10 | "connIdle": 300, 11 | "uplinkOnly": 1, 12 | "downlinkOnly": 1 13 | } 14 | }, 15 | "system": { 16 | "statsOutboundUplink": true, 17 | "statsOutboundDownlink": true 18 | } 19 | }, 20 | "inbounds": [{ 21 | "tag": "socks", 22 | "port": 10808, 23 | "protocol": "socks", 24 | "settings": { 25 | "auth": "noauth", 26 | "udp": true, 27 | "userLevel": 8 28 | }, 29 | "sniffing": { 30 | "enabled": true, 31 | "destOverride": [ 32 | "http", 33 | "tls" 34 | ] 35 | } 36 | }, 37 | { 38 | "tag": "http", 39 | "port": 10809, 40 | "protocol": "http", 41 | "settings": { 42 | "userLevel": 8 43 | } 44 | } 45 | ], 46 | "outbounds": [{ 47 | "tag": "proxy", 48 | "protocol": "vmess", 49 | "settings": { 50 | "vnext": [ 51 | { 52 | "address": "v2ray.cool", 53 | "port": 10086, 54 | "users": [ 55 | { 56 | "id": "a3482e88-686a-4a58-8126-99c9df64b7bf", 57 | "alterId": 0, 58 | "security": "auto", 59 | "level": 8 60 | } 61 | ] 62 | } 63 | ], 64 | "servers": [ 65 | { 66 | "address": "v2ray.cool", 67 | "method": "chacha20", 68 | "ota": false, 69 | "password": "123456", 70 | "port": 10086, 71 | "level": 8 72 | } 73 | ] 74 | }, 75 | "streamSettings": { 76 | "network": "tcp" 77 | }, 78 | "mux": { 79 | "enabled": false 80 | } 81 | }, 82 | { 83 | "protocol": "freedom", 84 | "settings": { 85 | "domainStrategy": "UseIP" 86 | }, 87 | "tag": "direct" 88 | }, 89 | { 90 | "protocol": "blackhole", 91 | "tag": "block", 92 | "settings": { 93 | "response": { 94 | "type": "http" 95 | } 96 | } 97 | } 98 | ], 99 | "routing": { 100 | "domainStrategy": "AsIs", 101 | "rules": [] 102 | }, 103 | "dns": { 104 | "hosts": {}, 105 | "servers": [] 106 | } 107 | } 108 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/ic_launcher-web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/2dust/v2rayNG/680832614bd4ff9952d2009b9edeb2dd891ec2f7/V2rayNG/app/src/main/ic_launcher-web.png -------------------------------------------------------------------------------- /V2rayNG/app/src/main/java/com/v2ray/ang/AngApplication.kt: -------------------------------------------------------------------------------- 1 | package com.v2ray.ang 2 | 3 | import android.content.Context 4 | import androidx.multidex.MultiDexApplication 5 | import androidx.work.Configuration 6 | import androidx.work.WorkManager 7 | import com.tencent.mmkv.MMKV 8 | import com.v2ray.ang.AppConfig.ANG_PACKAGE 9 | import com.v2ray.ang.handler.SettingsManager 10 | 11 | class AngApplication : MultiDexApplication() { 12 | companion object { 13 | lateinit var application: AngApplication 14 | } 15 | 16 | /** 17 | * Attaches the base context to the application. 18 | * @param base The base context. 19 | */ 20 | override fun attachBaseContext(base: Context?) { 21 | super.attachBaseContext(base) 22 | application = this 23 | } 24 | 25 | private val workManagerConfiguration: Configuration = Configuration.Builder() 26 | .setDefaultProcessName("${ANG_PACKAGE}:bg") 27 | .build() 28 | 29 | /** 30 | * Initializes the application. 31 | */ 32 | override fun onCreate() { 33 | super.onCreate() 34 | 35 | MMKV.initialize(this) 36 | 37 | SettingsManager.setNightMode() 38 | // Initialize WorkManager with the custom configuration 39 | WorkManager.initialize(this, workManagerConfiguration) 40 | 41 | SettingsManager.initRoutingRulesets(this) 42 | 43 | es.dmoral.toasty.Toasty.Config.getInstance() 44 | .setGravity(android.view.Gravity.BOTTOM, 0, 200) 45 | .apply() 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/java/com/v2ray/ang/dto/AppInfo.kt: -------------------------------------------------------------------------------- 1 | package com.v2ray.ang.dto 2 | 3 | import android.graphics.drawable.Drawable 4 | 5 | data class AppInfo( 6 | val appName: String, 7 | val packageName: String, 8 | val appIcon: Drawable, 9 | val isSystemApp: Boolean, 10 | var isSelected: Int 11 | ) -------------------------------------------------------------------------------- /V2rayNG/app/src/main/java/com/v2ray/ang/dto/AssetUrlItem.kt: -------------------------------------------------------------------------------- 1 | package com.v2ray.ang.dto 2 | 3 | data class AssetUrlItem( 4 | var remarks: String = "", 5 | var url: String = "", 6 | val addedTime: Long = System.currentTimeMillis(), 7 | var lastUpdated: Long = -1, 8 | var locked: Boolean? = false, 9 | ) -------------------------------------------------------------------------------- /V2rayNG/app/src/main/java/com/v2ray/ang/dto/CheckUpdateResult.kt: -------------------------------------------------------------------------------- 1 | package com.v2ray.ang.dto 2 | 3 | data class CheckUpdateResult( 4 | val hasUpdate: Boolean, 5 | val latestVersion: String? = null, 6 | val releaseNotes: String? = null, 7 | val downloadUrl: String? = null, 8 | val error: String? = null, 9 | val isPreRelease: Boolean = false 10 | ) -------------------------------------------------------------------------------- /V2rayNG/app/src/main/java/com/v2ray/ang/dto/ConfigResult.kt: -------------------------------------------------------------------------------- 1 | package com.v2ray.ang.dto 2 | 3 | data class ConfigResult( 4 | var status: Boolean, 5 | var guid: String? = null, 6 | var content: String = "", 7 | var socksPort: Int? = null, 8 | ) 9 | 10 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/java/com/v2ray/ang/dto/EConfigType.kt: -------------------------------------------------------------------------------- 1 | package com.v2ray.ang.dto 2 | 3 | import com.v2ray.ang.AppConfig 4 | 5 | 6 | enum class EConfigType(val value: Int, val protocolScheme: String) { 7 | VMESS(1, AppConfig.VMESS), 8 | CUSTOM(2, AppConfig.CUSTOM), 9 | SHADOWSOCKS(3, AppConfig.SHADOWSOCKS), 10 | SOCKS(4, AppConfig.SOCKS), 11 | VLESS(5, AppConfig.VLESS), 12 | TROJAN(6, AppConfig.TROJAN), 13 | WIREGUARD(7, AppConfig.WIREGUARD), 14 | 15 | // TUIC(8, AppConfig.TUIC), 16 | HYSTERIA2(9, AppConfig.HYSTERIA2), 17 | HTTP(10, AppConfig.HTTP); 18 | 19 | companion object { 20 | fun fromInt(value: Int) = entries.firstOrNull { it.value == value } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/java/com/v2ray/ang/dto/GitHubRelease.kt: -------------------------------------------------------------------------------- 1 | package com.v2ray.ang.dto 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class GitHubRelease( 6 | @SerializedName("tag_name") 7 | val tagName: String, 8 | @SerializedName("body") 9 | val body: String, 10 | @SerializedName("assets") 11 | val assets: List<Asset>, 12 | @SerializedName("prerelease") 13 | val prerelease: Boolean = false, 14 | @SerializedName("published_at") 15 | val publishedAt: String = "" 16 | ) { 17 | data class Asset( 18 | @SerializedName("name") 19 | val name: String, 20 | @SerializedName("browser_download_url") 21 | val browserDownloadUrl: String 22 | ) 23 | } -------------------------------------------------------------------------------- /V2rayNG/app/src/main/java/com/v2ray/ang/dto/Hysteria2Bean.kt: -------------------------------------------------------------------------------- 1 | package com.v2ray.ang.dto 2 | 3 | data class Hysteria2Bean( 4 | val server: String?, 5 | val auth: String?, 6 | val lazy: Boolean? = true, 7 | val obfs: ObfsBean? = null, 8 | val socks5: Socks5Bean? = null, 9 | val http: Socks5Bean? = null, 10 | val tls: TlsBean? = null, 11 | val transport: TransportBean? = null, 12 | val bandwidth: BandwidthBean? = null, 13 | ) { 14 | data class ObfsBean( 15 | val type: String?, 16 | val salamander: SalamanderBean? 17 | ) { 18 | data class SalamanderBean( 19 | val password: String?, 20 | ) 21 | } 22 | 23 | data class Socks5Bean( 24 | val listen: String?, 25 | ) 26 | 27 | data class TlsBean( 28 | val sni: String?, 29 | val insecure: Boolean?, 30 | val pinSHA256: String?, 31 | ) 32 | 33 | data class TransportBean( 34 | val type: String?, 35 | val udp: TransportUdpBean? 36 | ) { 37 | data class TransportUdpBean( 38 | val hopInterval: String?, 39 | ) 40 | } 41 | 42 | data class BandwidthBean( 43 | val down: String?, 44 | val up: String?, 45 | ) 46 | } -------------------------------------------------------------------------------- /V2rayNG/app/src/main/java/com/v2ray/ang/dto/IPAPIInfo.kt: -------------------------------------------------------------------------------- 1 | package com.v2ray.ang.dto 2 | 3 | data class IPAPIInfo( 4 | var ip: String? = null, 5 | var clientIp: String? = null, 6 | var ip_addr: String? = null, 7 | var query: String? = null, 8 | var country: String? = null, 9 | var country_name: String? = null, 10 | var country_code: String? = null, 11 | var countryCode: String? = null 12 | ) -------------------------------------------------------------------------------- /V2rayNG/app/src/main/java/com/v2ray/ang/dto/Language.kt: -------------------------------------------------------------------------------- 1 | package com.v2ray.ang.dto 2 | 3 | enum class Language(val code: String) { 4 | AUTO("auto"), 5 | ENGLISH("en"), 6 | CHINA("zh-rCN"), 7 | TRADITIONAL_CHINESE("zh-rTW"), 8 | VIETNAMESE("vi"), 9 | RUSSIAN("ru"), 10 | PERSIAN("fa"), 11 | ARABIC("ar"), 12 | BANGLA("bn"), 13 | BAKHTIARI("bqi-rIR"); 14 | 15 | companion object { 16 | fun fromCode(code: String): Language { 17 | return entries.find { it.code == code } ?: AUTO 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/java/com/v2ray/ang/dto/NetworkType.kt: -------------------------------------------------------------------------------- 1 | package com.v2ray.ang.dto 2 | 3 | enum class NetworkType(val type: String) { 4 | TCP("tcp"), 5 | KCP("kcp"), 6 | WS("ws"), 7 | HTTP_UPGRADE("httpupgrade"), 8 | XHTTP("xhttp"), 9 | HTTP("http"), 10 | H2("h2"), 11 | 12 | //QUIC("quic"), 13 | GRPC("grpc"); 14 | 15 | companion object { 16 | fun fromString(type: String?) = entries.find { it.type == type } ?: TCP 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/java/com/v2ray/ang/dto/RoutingType.kt: -------------------------------------------------------------------------------- 1 | package com.v2ray.ang.dto 2 | 3 | enum class RoutingType(val fileName: String) { 4 | WHITE("custom_routing_white"), 5 | BLACK("custom_routing_black"), 6 | GLOBAL("custom_routing_global"), 7 | WHITE_IRAN("custom_routing_white_iran"); 8 | 9 | companion object { 10 | fun fromIndex(index: Int): RoutingType { 11 | return when (index) { 12 | 0 -> WHITE 13 | 1 -> BLACK 14 | 2 -> GLOBAL 15 | 3 -> WHITE_IRAN 16 | else -> WHITE 17 | } 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/java/com/v2ray/ang/dto/RulesetItem.kt: -------------------------------------------------------------------------------- 1 | package com.v2ray.ang.dto 2 | 3 | data class RulesetItem( 4 | var remarks: String? = "", 5 | var ip: List<String>? = null, 6 | var domain: List<String>? = null, 7 | var outboundTag: String = "", 8 | var port: String? = null, 9 | var network: String? = null, 10 | var protocol: List<String>? = null, 11 | var enabled: Boolean = true, 12 | var locked: Boolean? = false, 13 | ) -------------------------------------------------------------------------------- /V2rayNG/app/src/main/java/com/v2ray/ang/dto/ServerAffiliationInfo.kt: -------------------------------------------------------------------------------- 1 | package com.v2ray.ang.dto 2 | 3 | data class ServerAffiliationInfo(var testDelayMillis: Long = 0L) { 4 | fun getTestDelayString(): String { 5 | if (testDelayMillis == 0L) { 6 | return "" 7 | } 8 | return testDelayMillis.toString() + "ms" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/java/com/v2ray/ang/dto/ServersCache.kt: -------------------------------------------------------------------------------- 1 | package com.v2ray.ang.dto 2 | 3 | data class ServersCache( 4 | val guid: String, 5 | val profile: ProfileItem 6 | ) -------------------------------------------------------------------------------- /V2rayNG/app/src/main/java/com/v2ray/ang/dto/SubscriptionItem.kt: -------------------------------------------------------------------------------- 1 | package com.v2ray.ang.dto 2 | 3 | data class SubscriptionItem( 4 | var remarks: String = "", 5 | var url: String = "", 6 | var enabled: Boolean = true, 7 | val addedTime: Long = System.currentTimeMillis(), 8 | var lastUpdated: Long = -1, 9 | var autoUpdate: Boolean = false, 10 | val updateInterval: Int? = null, 11 | var prevProfile: String? = null, 12 | var nextProfile: String? = null, 13 | var filter: String? = null, 14 | var intelligentSelectionFilter: String? = null, 15 | var allowInsecureUrl: Boolean = false, 16 | ) 17 | 18 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/java/com/v2ray/ang/dto/VmessQRCode.kt: -------------------------------------------------------------------------------- 1 | package com.v2ray.ang.dto 2 | 3 | data class VmessQRCode( 4 | var v: String = "", 5 | var ps: String = "", 6 | var add: String = "", 7 | var port: String = "", 8 | var id: String = "", 9 | var aid: String = "0", 10 | var scy: String = "", 11 | var net: String = "", 12 | var type: String = "", 13 | var host: String = "", 14 | var path: String = "", 15 | var tls: String = "", 16 | var sni: String = "", 17 | var alpn: String = "", 18 | var fp: String = "" 19 | ) -------------------------------------------------------------------------------- /V2rayNG/app/src/main/java/com/v2ray/ang/dto/VpnInterfaceAddressConfig.kt: -------------------------------------------------------------------------------- 1 | package com.v2ray.ang.dto 2 | 3 | /** 4 | * VPN interface address configuration enum class 5 | * Defines predefined IPv4 and IPv6 address pairs for VPN TUN interface configuration. 6 | * Each option provides client and router addresses to establish point-to-point VPN tunnels. 7 | */ 8 | enum class VpnInterfaceAddressConfig( 9 | val displayName: String, 10 | val ipv4Client: String, 11 | val ipv4Router: String, 12 | val ipv6Client: String, 13 | val ipv6Router: String 14 | ) { 15 | OPTION_1("10.10.14.x", "10.10.14.1", "10.10.14.2", "fc00::10:10:14:1", "fc00::10:10:14:2"), 16 | OPTION_2("10.1.0.x", "10.1.0.1", "10.1.0.2", "fc00::10:1:0:1", "fc00::10:1:0:2"), 17 | OPTION_3("10.0.0.x", "10.0.0.1", "10.0.0.2", "fc00::10:0:0:1", "fc00::10:0:0:2"), 18 | OPTION_4("172.31.0.x", "172.31.0.1", "172.31.0.2", "fc00::172:31:0:1", "fc00::172:31:0:2"), 19 | OPTION_5("172.20.0.x", "172.20.0.1", "172.20.0.2", "fc00::172:20:0:1", "fc00::172:20:0:2"), 20 | OPTION_6("172.16.0.x", "172.16.0.1", "172.16.0.2", "fc00::172:16:0:1", "fc00::172:16:0:2"), 21 | OPTION_7("192.168.100.x", "192.168.100.1", "192.168.100.2", "fc00::192:168:100:1", "fc00::192:168:100:2"); 22 | 23 | companion object { 24 | /** 25 | * Retrieves the VPN interface address configuration based on the specified index. 26 | * 27 | * @param index The configuration index (0-based) corresponding to user selection 28 | * @return The VpnInterfaceAddressConfig instance at the specified index, 29 | * or OPTION_1 (default) if the index is out of bounds 30 | */ 31 | fun getConfigByIndex(index: Int): VpnInterfaceAddressConfig { 32 | return if (index in values().indices) { 33 | values()[index] 34 | } else { 35 | OPTION_1 // Default to the first configuration 36 | } 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/java/com/v2ray/ang/fmt/CustomFmt.kt: -------------------------------------------------------------------------------- 1 | package com.v2ray.ang.fmt 2 | 3 | import com.v2ray.ang.dto.EConfigType 4 | import com.v2ray.ang.dto.ProfileItem 5 | import com.v2ray.ang.dto.V2rayConfig 6 | import com.v2ray.ang.util.JsonUtil 7 | 8 | object CustomFmt : FmtBase() { 9 | /** 10 | * Parses a JSON string into a ProfileItem object. 11 | * 12 | * @param str the JSON string to parse 13 | * @return the parsed ProfileItem object, or null if parsing fails 14 | */ 15 | fun parse(str: String): ProfileItem? { 16 | val config = ProfileItem.create(EConfigType.CUSTOM) 17 | 18 | val fullConfig = JsonUtil.fromJson(str, V2rayConfig::class.java) 19 | val outbound = fullConfig.getProxyOutbound() 20 | 21 | config.remarks = fullConfig?.remarks ?: System.currentTimeMillis().toString() 22 | config.server = outbound?.getServerAddress() 23 | config.serverPort = outbound?.getServerPort().toString() 24 | 25 | return config 26 | } 27 | } -------------------------------------------------------------------------------- /V2rayNG/app/src/main/java/com/v2ray/ang/fmt/HttpFmt.kt: -------------------------------------------------------------------------------- 1 | package com.v2ray.ang.fmt 2 | 3 | import com.v2ray.ang.dto.EConfigType 4 | import com.v2ray.ang.dto.ProfileItem 5 | import com.v2ray.ang.dto.V2rayConfig.OutboundBean 6 | import com.v2ray.ang.extension.isNotNullEmpty 7 | import com.v2ray.ang.handler.V2rayConfigManager 8 | 9 | object HttpFmt : FmtBase() { 10 | /** 11 | * Converts a ProfileItem object to an OutboundBean object. 12 | * 13 | * @param profileItem the ProfileItem object to convert 14 | * @return the converted OutboundBean object, or null if conversion fails 15 | */ 16 | fun toOutbound(profileItem: ProfileItem): OutboundBean? { 17 | val outboundBean = V2rayConfigManager.createInitOutbound(EConfigType.HTTP) 18 | 19 | outboundBean?.settings?.servers?.first()?.let { server -> 20 | server.address = getServerAddress(profileItem) 21 | server.port = profileItem.serverPort.orEmpty().toInt() 22 | if (profileItem.username.isNotNullEmpty()) { 23 | val socksUsersBean = OutboundBean.OutSettingsBean.ServersBean.SocksUsersBean() 24 | socksUsersBean.user = profileItem.username.orEmpty() 25 | socksUsersBean.pass = profileItem.password.orEmpty() 26 | server.users = listOf(socksUsersBean) 27 | } 28 | } 29 | 30 | return outboundBean 31 | } 32 | } -------------------------------------------------------------------------------- /V2rayNG/app/src/main/java/com/v2ray/ang/fmt/SocksFmt.kt: -------------------------------------------------------------------------------- 1 | package com.v2ray.ang.fmt 2 | 3 | import com.v2ray.ang.dto.EConfigType 4 | import com.v2ray.ang.dto.ProfileItem 5 | import com.v2ray.ang.dto.V2rayConfig.OutboundBean 6 | import com.v2ray.ang.extension.idnHost 7 | import com.v2ray.ang.extension.isNotNullEmpty 8 | import com.v2ray.ang.handler.V2rayConfigManager 9 | import com.v2ray.ang.util.Utils 10 | import java.net.URI 11 | 12 | object SocksFmt : FmtBase() { 13 | /** 14 | * Parses a Socks URI string into a ProfileItem object. 15 | * 16 | * @param str the Socks URI string to parse 17 | * @return the parsed ProfileItem object, or null if parsing fails 18 | */ 19 | fun parse(str: String): ProfileItem? { 20 | val config = ProfileItem.create(EConfigType.SOCKS) 21 | 22 | val uri = URI(Utils.fixIllegalUrl(str)) 23 | if (uri.idnHost.isEmpty()) return null 24 | if (uri.port <= 0) return null 25 | 26 | config.remarks = Utils.urlDecode(uri.fragment.orEmpty()).let { if (it.isEmpty()) "none" else it } 27 | config.server = uri.idnHost 28 | config.serverPort = uri.port.toString() 29 | 30 | if (uri.userInfo?.isEmpty() == false) { 31 | val result = Utils.decode(uri.userInfo).split(":", limit = 2) 32 | if (result.count() == 2) { 33 | config.username = result.first() 34 | config.password = result.last() 35 | } 36 | } 37 | 38 | return config 39 | } 40 | 41 | /** 42 | * Converts a ProfileItem object to a URI string. 43 | * 44 | * @param config the ProfileItem object to convert 45 | * @return the converted URI string 46 | */ 47 | fun toUri(config: ProfileItem): String { 48 | val pw = 49 | if (config.username.isNotNullEmpty()) 50 | "${config.username}:${config.password}" 51 | else 52 | ":" 53 | 54 | return toUri(config, Utils.encode(pw), null) 55 | } 56 | 57 | /** 58 | * Converts a ProfileItem object to an OutboundBean object. 59 | * 60 | * @param profileItem the ProfileItem object to convert 61 | * @return the converted OutboundBean object, or null if conversion fails 62 | */ 63 | fun toOutbound(profileItem: ProfileItem): OutboundBean? { 64 | val outboundBean = V2rayConfigManager.createInitOutbound(EConfigType.SOCKS) 65 | 66 | outboundBean?.settings?.servers?.first()?.let { server -> 67 | server.address = getServerAddress(profileItem) 68 | server.port = profileItem.serverPort.orEmpty().toInt() 69 | if (profileItem.username.isNotNullEmpty()) { 70 | val socksUsersBean = OutboundBean.OutSettingsBean.ServersBean.SocksUsersBean() 71 | socksUsersBean.user = profileItem.username.orEmpty() 72 | socksUsersBean.pass = profileItem.password.orEmpty() 73 | server.users = listOf(socksUsersBean) 74 | } 75 | } 76 | 77 | return outboundBean 78 | } 79 | } -------------------------------------------------------------------------------- /V2rayNG/app/src/main/java/com/v2ray/ang/helper/CustomDividerItemDecoration.kt: -------------------------------------------------------------------------------- 1 | package com.v2ray.ang.helper 2 | 3 | import android.graphics.Canvas 4 | import android.graphics.Rect 5 | import android.graphics.drawable.Drawable 6 | import android.view.View 7 | import androidx.recyclerview.widget.RecyclerView 8 | 9 | class CustomDividerItemDecoration( 10 | private val divider: Drawable, 11 | private val orientation: Int 12 | ) : RecyclerView.ItemDecoration() { 13 | 14 | override fun onDraw(canvas: Canvas, parent: RecyclerView, state: RecyclerView.State) { 15 | if (orientation == RecyclerView.VERTICAL) { 16 | drawVerticalDividers(canvas, parent) 17 | } else { 18 | drawHorizontalDividers(canvas, parent) 19 | } 20 | } 21 | 22 | private fun drawVerticalDividers(canvas: Canvas, parent: RecyclerView) { 23 | val left = parent.paddingLeft 24 | val right = parent.width - parent.paddingRight 25 | 26 | val childCount = parent.childCount 27 | for (i in 0 until childCount - 1) { 28 | val child = parent.getChildAt(i) 29 | val params = child.layoutParams as RecyclerView.LayoutParams 30 | 31 | val top = child.bottom + params.bottomMargin 32 | val bottom = top + divider.intrinsicHeight 33 | 34 | divider.setBounds(left, top, right, bottom) 35 | divider.draw(canvas) 36 | } 37 | } 38 | 39 | private fun drawHorizontalDividers(canvas: Canvas, parent: RecyclerView) { 40 | val top = parent.paddingTop 41 | val bottom = parent.height - parent.paddingBottom 42 | 43 | val childCount = parent.childCount 44 | for (i in 0 until childCount - 1) { 45 | val child = parent.getChildAt(i) 46 | val params = child.layoutParams as RecyclerView.LayoutParams 47 | 48 | val left = child.right + params.rightMargin 49 | val right = left + divider.intrinsicWidth 50 | 51 | divider.setBounds(left, top, right, bottom) 52 | divider.draw(canvas) 53 | } 54 | } 55 | 56 | override fun getItemOffsets( 57 | outRect: Rect, 58 | view: View, 59 | parent: RecyclerView, 60 | state: RecyclerView.State 61 | ) { 62 | if (orientation == RecyclerView.VERTICAL) { 63 | outRect.set(0, 0, 0, divider.intrinsicHeight) 64 | } else { 65 | outRect.set(0, 0, divider.intrinsicWidth, 0) 66 | } 67 | } 68 | } -------------------------------------------------------------------------------- /V2rayNG/app/src/main/java/com/v2ray/ang/helper/ItemTouchHelperAdapter.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2015 Paul Burke 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package com.v2ray.ang.helper 17 | 18 | /** 19 | * Interface to listen for a move or dismissal event from a [ItemTouchHelper.Callback]. 20 | * 21 | * @author Paul Burke (ipaulpro) 22 | */ 23 | interface ItemTouchHelperAdapter { 24 | /** 25 | * Called when an item has been dragged far enough to trigger a move. This is called every time 26 | * an item is shifted, and **not** at the end of a "drop" event.<br></br> 27 | * <br></br> 28 | * Implementations should call [RecyclerView.Adapter.notifyItemMoved] after 29 | * adjusting the underlying data to reflect this move. 30 | * 31 | * @param fromPosition The start position of the moved item. 32 | * @param toPosition Then resolved position of the moved item. 33 | * @return True if the item was moved to the new adapter position. 34 | * @see RecyclerView.getAdapterPositionFor 35 | * @see RecyclerView.ViewHolder.getAdapterPosition 36 | */ 37 | fun onItemMove(fromPosition: Int, toPosition: Int): Boolean 38 | 39 | 40 | fun onItemMoveCompleted() 41 | 42 | /** 43 | * Called when an item has been dismissed by a swipe.<br></br> 44 | * <br></br> 45 | * Implementations should call [RecyclerView.Adapter.notifyItemRemoved] after 46 | * adjusting the underlying data to reflect this removal. 47 | * 48 | * @param position The position of the item dismissed. 49 | * @see RecyclerView.getAdapterPositionFor 50 | * @see RecyclerView.ViewHolder.getAdapterPosition 51 | */ 52 | fun onItemDismiss(position: Int) 53 | } 54 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/java/com/v2ray/ang/helper/ItemTouchHelperViewHolder.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2015 Paul Burke 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package com.v2ray.ang.helper 17 | 18 | import androidx.recyclerview.widget.ItemTouchHelper 19 | 20 | /** 21 | * Interface to notify an item ViewHolder of relevant callbacks from [ ]. 22 | * 23 | * @author Paul Burke (ipaulpro) 24 | */ 25 | interface ItemTouchHelperViewHolder { 26 | /** 27 | * Called when the [ItemTouchHelper] first registers an item as being moved or swiped. 28 | * Implementations should update the item view to indicate it's active state. 29 | */ 30 | fun onItemSelected() 31 | 32 | 33 | /** 34 | * Called when the [ItemTouchHelper] has completed the move or swipe, and the active item 35 | * state should be cleared. 36 | */ 37 | fun onItemClear() 38 | } 39 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/java/com/v2ray/ang/plugin/NativePlugin.kt: -------------------------------------------------------------------------------- 1 | /****************************************************************************** 2 | * * 3 | * Copyright (C) 2021 by nekohasekai <contact-sagernet@sekai.icu> * 4 | * Copyright (C) 2021 by Max Lv <max.c.lv@gmail.com> * 5 | * Copyright (C) 2021 by Mygod Studio <contact-shadowsocks-android@mygod.be> * 6 | * * 7 | * This program is free software: you can redistribute it and/or modify * 8 | * it under the terms of the GNU General Public License as published by * 9 | * the Free Software Foundation, either version 3 of the License, or * 10 | * (at your option) any later version. * 11 | * * 12 | * This program is distributed in the hope that it will be useful, * 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of * 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * 15 | * GNU General Public License for more details. * 16 | * * 17 | * You should have received a copy of the GNU General Public License * 18 | * along with this program. If not, see <http://www.gnu.org/licenses/>. * 19 | * * 20 | ******************************************************************************/ 21 | 22 | package com.v2ray.ang.plugin 23 | 24 | import android.content.pm.ResolveInfo 25 | 26 | class NativePlugin(resolveInfo: ResolveInfo) : ResolvedPlugin(resolveInfo) { 27 | init { 28 | check(resolveInfo.providerInfo != null) 29 | } 30 | 31 | override val componentInfo get() = resolveInfo.providerInfo!! 32 | } 33 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/java/com/v2ray/ang/plugin/Plugin.kt: -------------------------------------------------------------------------------- 1 | /****************************************************************************** 2 | * * 3 | * Copyright (C) 2021 by nekohasekai <contact-sagernet@sekai.icu> * 4 | * Copyright (C) 2021 by Max Lv <max.c.lv@gmail.com> * 5 | * Copyright (C) 2021 by Mygod Studio <contact-shadowsocks-android@mygod.be> * 6 | * * 7 | * This program is free software: you can redistribute it and/or modify * 8 | * it under the terms of the GNU General Public License as published by * 9 | * the Free Software Foundation, either version 3 of the License, or * 10 | * (at your option) any later version. * 11 | * * 12 | * This program is distributed in the hope that it will be useful, * 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of * 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * 15 | * GNU General Public License for more details. * 16 | * * 17 | * You should have received a copy of the GNU General Public License * 18 | * along with this program. If not, see <http://www.gnu.org/licenses/>. * 19 | * * 20 | ******************************************************************************/ 21 | 22 | package com.v2ray.ang.plugin 23 | 24 | import android.graphics.drawable.Drawable 25 | 26 | abstract class Plugin { 27 | abstract val id: String 28 | abstract val label: CharSequence 29 | abstract val version: Int 30 | abstract val versionName: String 31 | open val icon: Drawable? get() = null 32 | open val defaultConfig: String? get() = null 33 | open val packageName: String get() = "" 34 | open val directBootAware: Boolean get() = true 35 | 36 | override fun equals(other: Any?): Boolean { 37 | if (this === other) return true 38 | if (javaClass != other?.javaClass) return false 39 | return id == (other as Plugin).id 40 | } 41 | 42 | override fun hashCode() = id.hashCode() 43 | } 44 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/java/com/v2ray/ang/plugin/PluginContract.kt: -------------------------------------------------------------------------------- 1 | /****************************************************************************** 2 | * * 3 | * Copyright (C) 2021 by nekohasekai <contact-sagernet@sekai.icu> * 4 | * * 5 | * This program is free software: you can redistribute it and/or modify * 6 | * it under the terms of the GNU General Public License as published by * 7 | * the Free Software Foundation, either version 3 of the License, or * 8 | * (at your option) any later version. * 9 | * * 10 | * This program is distributed in the hope that it will be useful, * 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of * 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * 13 | * GNU General Public License for more details. * 14 | * * 15 | * You should have received a copy of the GNU General Public License * 16 | * along with this program. If not, see <http://www.gnu.org/licenses/>. * 17 | * * 18 | ******************************************************************************/ 19 | 20 | package com.v2ray.ang.plugin 21 | 22 | object PluginContract { 23 | 24 | const val ACTION_NATIVE_PLUGIN = "io.nekohasekai.sagernet.plugin.ACTION_NATIVE_PLUGIN" 25 | const val EXTRA_ENTRY = "io.nekohasekai.sagernet.plugin.EXTRA_ENTRY" 26 | const val METADATA_KEY_ID = "io.nekohasekai.sagernet.plugin.id" 27 | const val METADATA_KEY_EXECUTABLE_PATH = "io.nekohasekai.sagernet.plugin.executable_path" 28 | const val METHOD_GET_EXECUTABLE = "sagernet:getExecutable" 29 | 30 | const val COLUMN_PATH = "path" 31 | const val COLUMN_MODE = "mode" 32 | const val SCHEME = "plugin" 33 | } 34 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/java/com/v2ray/ang/plugin/PluginList.kt: -------------------------------------------------------------------------------- 1 | /****************************************************************************** 2 | * * 3 | * Copyright (C) 2021 by nekohasekai <contact-sagernet@sekai.icu> * 4 | * Copyright (C) 2021 by Max Lv <max.c.lv@gmail.com> * 5 | * Copyright (C) 2021 by Mygod Studio <contact-shadowsocks-android@mygod.be> * 6 | * * 7 | * This program is free software: you can redistribute it and/or modify * 8 | * it under the terms of the GNU General Public License as published by * 9 | * the Free Software Foundation, either version 3 of the License, or * 10 | * (at your option) any later version. * 11 | * * 12 | * This program is distributed in the hope that it will be useful, * 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of * 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * 15 | * GNU General Public License for more details. * 16 | * * 17 | * You should have received a copy of the GNU General Public License * 18 | * along with this program. If not, see <http://www.gnu.org/licenses/>. * 19 | * * 20 | ******************************************************************************/ 21 | 22 | package com.v2ray.ang.plugin 23 | 24 | import android.content.Intent 25 | import android.content.pm.PackageManager 26 | import com.v2ray.ang.AngApplication 27 | 28 | class PluginList : ArrayList<Plugin>() { 29 | init { 30 | addAll( 31 | AngApplication.application.packageManager.queryIntentContentProviders( 32 | Intent(PluginContract.ACTION_NATIVE_PLUGIN), PackageManager.GET_META_DATA 33 | ) 34 | .filter { it.providerInfo.exported }.map { NativePlugin(it) }) 35 | } 36 | 37 | val lookup = mutableMapOf<String, Plugin>().apply { 38 | for (plugin in this@PluginList.toList()) { 39 | fun check(old: Plugin?) { 40 | if (old != null && old != plugin) { 41 | this@PluginList.remove(old) 42 | } 43 | /* if (old != null && old !== plugin) { 44 | val packages = this@PluginList.filter { it.id == plugin.id } 45 | .joinToString { it.packageName } 46 | val message = "Conflicting plugins found from: $packages" 47 | Toast.makeText(SagerNet.application, message, Toast.LENGTH_LONG).show() 48 | throw IllegalStateException(message) 49 | }*/ 50 | } 51 | check(put(plugin.id, plugin)) 52 | } 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/java/com/v2ray/ang/receiver/BootReceiver.kt: -------------------------------------------------------------------------------- 1 | package com.v2ray.ang.receiver 2 | 3 | import android.content.BroadcastReceiver 4 | import android.content.Context 5 | import android.content.Intent 6 | import com.v2ray.ang.handler.MmkvManager 7 | import com.v2ray.ang.service.V2RayServiceManager 8 | 9 | class BootReceiver : BroadcastReceiver() { 10 | /** 11 | * This method is called when the BroadcastReceiver is receiving an Intent broadcast. 12 | * It checks if the context is not null and the action is ACTION_BOOT_COMPLETED. 13 | * If the conditions are met, it starts the V2Ray service. 14 | * 15 | * @param context The Context in which the receiver is running. 16 | * @param intent The Intent being received. 17 | */ 18 | override fun onReceive(context: Context?, intent: Intent?) { 19 | if (context == null || intent?.action != Intent.ACTION_BOOT_COMPLETED) return 20 | if (!MmkvManager.decodeStartOnBoot() || MmkvManager.getSelectServer().isNullOrEmpty()) return 21 | V2RayServiceManager.startVService(context) 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/java/com/v2ray/ang/receiver/TaskerReceiver.kt: -------------------------------------------------------------------------------- 1 | package com.v2ray.ang.receiver 2 | 3 | import android.content.BroadcastReceiver 4 | import android.content.Context 5 | import android.content.Intent 6 | import android.text.TextUtils 7 | import com.v2ray.ang.AppConfig 8 | import com.v2ray.ang.service.V2RayServiceManager 9 | 10 | class TaskerReceiver : BroadcastReceiver() { 11 | 12 | /** 13 | * This method is called when the BroadcastReceiver is receiving an Intent broadcast. 14 | * It retrieves the bundle from the intent and checks the switch and guid values. 15 | * Depending on the switch value, it starts or stops the V2Ray service. 16 | * 17 | * @param context The Context in which the receiver is running. 18 | * @param intent The Intent being received. 19 | */ 20 | override fun onReceive(context: Context, intent: Intent?) { 21 | try { 22 | val bundle = intent?.getBundleExtra(AppConfig.TASKER_EXTRA_BUNDLE) 23 | val switch = bundle?.getBoolean(AppConfig.TASKER_EXTRA_BUNDLE_SWITCH, false) 24 | val guid = bundle?.getString(AppConfig.TASKER_EXTRA_BUNDLE_GUID).orEmpty() 25 | 26 | if (switch == null || TextUtils.isEmpty(guid)) { 27 | return 28 | } else if (switch) { 29 | if (guid == AppConfig.TASKER_DEFAULT_GUID) { 30 | V2RayServiceManager.startVServiceFromToggle(context) 31 | } else { 32 | V2RayServiceManager.startVService(context, guid) 33 | } 34 | } else { 35 | V2RayServiceManager.stopVService(context) 36 | } 37 | } catch (e: Exception) { 38 | android.util.Log.e(AppConfig.TAG, "Error processing Tasker broadcast", e) 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/java/com/v2ray/ang/service/ProcessService.kt: -------------------------------------------------------------------------------- 1 | package com.v2ray.ang.service 2 | 3 | import android.content.Context 4 | import android.util.Log 5 | import com.v2ray.ang.AppConfig 6 | import kotlinx.coroutines.CoroutineScope 7 | import kotlinx.coroutines.Dispatchers 8 | import kotlinx.coroutines.launch 9 | 10 | class ProcessService { 11 | private var process: Process? = null 12 | 13 | /** 14 | * Runs a process with the given command. 15 | * @param context The context. 16 | * @param cmd The command to run. 17 | */ 18 | fun runProcess(context: Context, cmd: MutableList<String>) { 19 | Log.i(AppConfig.TAG, cmd.toString()) 20 | 21 | try { 22 | val proBuilder = ProcessBuilder(cmd) 23 | proBuilder.redirectErrorStream(true) 24 | process = proBuilder 25 | .directory(context.filesDir) 26 | .start() 27 | 28 | CoroutineScope(Dispatchers.IO).launch { 29 | Thread.sleep(50L) 30 | Log.i(AppConfig.TAG, "runProcess check") 31 | process?.waitFor() 32 | Log.i(AppConfig.TAG, "runProcess exited") 33 | } 34 | Log.i(AppConfig.TAG, process.toString()) 35 | 36 | } catch (e: Exception) { 37 | Log.e(AppConfig.TAG, e.toString(), e) 38 | } 39 | } 40 | 41 | /** 42 | * Stops the running process. 43 | */ 44 | fun stopProcess() { 45 | try { 46 | Log.i(AppConfig.TAG, "runProcess destroy") 47 | process?.destroy() 48 | } catch (e: Exception) { 49 | Log.e(AppConfig.TAG, "Failed to destroy process", e) 50 | } 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/java/com/v2ray/ang/service/ServiceControl.kt: -------------------------------------------------------------------------------- 1 | package com.v2ray.ang.service 2 | 3 | import android.app.Service 4 | 5 | interface ServiceControl { 6 | /** 7 | * Gets the service instance. 8 | * @return The service instance. 9 | */ 10 | fun getService(): Service 11 | 12 | /** 13 | * Starts the service. 14 | */ 15 | fun startService() 16 | 17 | /** 18 | * Stops the service. 19 | */ 20 | fun stopService() 21 | 22 | /** 23 | * Protects the VPN socket. 24 | * @param socket The socket to protect. 25 | * @return True if the socket is protected, false otherwise. 26 | */ 27 | fun vpnProtect(socket: Int): Boolean 28 | } 29 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/java/com/v2ray/ang/service/SubscriptionUpdater.kt: -------------------------------------------------------------------------------- 1 | package com.v2ray.ang.service 2 | 3 | import android.annotation.SuppressLint 4 | import android.app.NotificationChannel 5 | import android.app.NotificationManager 6 | import android.content.Context 7 | import android.os.Build 8 | import android.util.Log 9 | import androidx.core.app.NotificationCompat 10 | import androidx.core.app.NotificationManagerCompat 11 | import androidx.work.CoroutineWorker 12 | import androidx.work.WorkerParameters 13 | import com.v2ray.ang.AppConfig 14 | import com.v2ray.ang.AppConfig.SUBSCRIPTION_UPDATE_CHANNEL 15 | import com.v2ray.ang.AppConfig.SUBSCRIPTION_UPDATE_CHANNEL_NAME 16 | import com.v2ray.ang.R 17 | import com.v2ray.ang.handler.AngConfigManager.updateConfigViaSub 18 | import com.v2ray.ang.handler.MmkvManager 19 | 20 | object SubscriptionUpdater { 21 | 22 | class UpdateTask(context: Context, params: WorkerParameters) : 23 | CoroutineWorker(context, params) { 24 | 25 | private val notificationManager = NotificationManagerCompat.from(applicationContext) 26 | private val notification = 27 | NotificationCompat.Builder(applicationContext, SUBSCRIPTION_UPDATE_CHANNEL) 28 | .setWhen(0) 29 | .setTicker("Update") 30 | .setContentTitle(context.getString(R.string.title_pref_auto_update_subscription)) 31 | .setSmallIcon(R.drawable.ic_stat_name) 32 | .setCategory(NotificationCompat.CATEGORY_SERVICE) 33 | .setPriority(NotificationCompat.PRIORITY_DEFAULT) 34 | 35 | /** 36 | * Performs the subscription update work. 37 | * @return The result of the work. 38 | */ 39 | @SuppressLint("MissingPermission") 40 | override suspend fun doWork(): Result { 41 | Log.i(AppConfig.TAG, "subscription automatic update starting") 42 | 43 | val subs = MmkvManager.decodeSubscriptions().filter { it.second.autoUpdate } 44 | 45 | for (sub in subs) { 46 | val subItem = sub.second 47 | 48 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { 49 | notification.setChannelId(SUBSCRIPTION_UPDATE_CHANNEL) 50 | val channel = 51 | NotificationChannel( 52 | SUBSCRIPTION_UPDATE_CHANNEL, 53 | SUBSCRIPTION_UPDATE_CHANNEL_NAME, 54 | NotificationManager.IMPORTANCE_MIN 55 | ) 56 | notificationManager.createNotificationChannel(channel) 57 | } 58 | notificationManager.notify(3, notification.build()) 59 | Log.i(AppConfig.TAG, "subscription automatic update: ---${subItem.remarks}") 60 | updateConfigViaSub(Pair(sub.first, subItem)) 61 | notification.setContentText("Updating ${subItem.remarks}") 62 | } 63 | notificationManager.cancel(3) 64 | return Result.success() 65 | } 66 | } 67 | } -------------------------------------------------------------------------------- /V2rayNG/app/src/main/java/com/v2ray/ang/service/V2RayProxyOnlyService.kt: -------------------------------------------------------------------------------- 1 | package com.v2ray.ang.service 2 | 3 | import android.app.Service 4 | import android.content.Context 5 | import android.content.Intent 6 | import android.os.Build 7 | import android.os.IBinder 8 | import androidx.annotation.RequiresApi 9 | import com.v2ray.ang.handler.SettingsManager 10 | import com.v2ray.ang.util.MyContextWrapper 11 | import java.lang.ref.SoftReference 12 | 13 | class V2RayProxyOnlyService : Service(), ServiceControl { 14 | /** 15 | * Initializes the service. 16 | */ 17 | override fun onCreate() { 18 | super.onCreate() 19 | V2RayServiceManager.serviceControl = SoftReference(this) 20 | } 21 | 22 | /** 23 | * Handles the start command for the service. 24 | * @param intent The intent. 25 | * @param flags The flags. 26 | * @param startId The start ID. 27 | * @return The start mode. 28 | */ 29 | override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { 30 | V2RayServiceManager.startCoreLoop() 31 | return START_STICKY 32 | } 33 | 34 | /** 35 | * Destroys the service. 36 | */ 37 | override fun onDestroy() { 38 | super.onDestroy() 39 | V2RayServiceManager.stopCoreLoop() 40 | } 41 | 42 | /** 43 | * Gets the service instance. 44 | * @return The service instance. 45 | */ 46 | override fun getService(): Service { 47 | return this 48 | } 49 | 50 | /** 51 | * Starts the service. 52 | */ 53 | override fun startService() { 54 | // do nothing 55 | } 56 | 57 | /** 58 | * Stops the service. 59 | */ 60 | override fun stopService() { 61 | stopSelf() 62 | } 63 | 64 | /** 65 | * Protects the VPN socket. 66 | * @param socket The socket to protect. 67 | * @return True if the socket is protected, false otherwise. 68 | */ 69 | override fun vpnProtect(socket: Int): Boolean { 70 | return true 71 | } 72 | 73 | /** 74 | * Binds the service. 75 | * @param intent The intent. 76 | * @return The binder. 77 | */ 78 | override fun onBind(intent: Intent?): IBinder? { 79 | return null 80 | } 81 | 82 | /** 83 | * Attaches the base context to the service. 84 | * @param newBase The new base context. 85 | */ 86 | @RequiresApi(Build.VERSION_CODES.N) 87 | override fun attachBaseContext(newBase: Context?) { 88 | val context = newBase?.let { 89 | MyContextWrapper.wrap(newBase, SettingsManager.getLocale()) 90 | } 91 | super.attachBaseContext(context) 92 | } 93 | } 94 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/java/com/v2ray/ang/ui/BaseActivity.kt: -------------------------------------------------------------------------------- 1 | package com.v2ray.ang.ui 2 | 3 | import android.content.Context 4 | import android.os.Build 5 | import android.os.Bundle 6 | import android.view.MenuItem 7 | import androidx.annotation.RequiresApi 8 | import androidx.appcompat.app.AppCompatActivity 9 | import androidx.core.content.ContextCompat 10 | import androidx.core.view.WindowCompat 11 | import androidx.recyclerview.widget.DividerItemDecoration 12 | import androidx.recyclerview.widget.RecyclerView 13 | import com.v2ray.ang.handler.SettingsManager 14 | import com.v2ray.ang.helper.CustomDividerItemDecoration 15 | import com.v2ray.ang.util.MyContextWrapper 16 | import com.v2ray.ang.util.Utils 17 | 18 | 19 | abstract class BaseActivity : AppCompatActivity() { 20 | override fun onCreate(savedInstanceState: Bundle?) { 21 | super.onCreate(savedInstanceState) 22 | supportActionBar?.setDisplayHomeAsUpEnabled(true) 23 | if (!Utils.getDarkModeStatus(this)) { 24 | WindowCompat.getInsetsController(window, window.decorView).apply { 25 | isAppearanceLightStatusBars = true 26 | } 27 | } 28 | } 29 | 30 | override fun onOptionsItemSelected(item: MenuItem) = when (item.itemId) { 31 | android.R.id.home -> { 32 | // Handles the home button press by delegating to the onBackPressedDispatcher. 33 | // This ensures consistent back navigation behavior. 34 | onBackPressedDispatcher.onBackPressed() 35 | true 36 | } 37 | 38 | else -> super.onOptionsItemSelected(item) 39 | } 40 | 41 | @RequiresApi(Build.VERSION_CODES.N) 42 | override fun attachBaseContext(newBase: Context?) { 43 | super.attachBaseContext(MyContextWrapper.wrap(newBase ?: return, SettingsManager.getLocale())) 44 | } 45 | 46 | /** 47 | * Adds a custom divider to a RecyclerView. 48 | * 49 | * @param recyclerView The target RecyclerView to which the divider will be added. 50 | * @param context The context used to access resources. 51 | * @param drawableResId The resource ID of the drawable to be used as the divider. 52 | * @param orientation The orientation of the divider (DividerItemDecoration.VERTICAL or DividerItemDecoration.HORIZONTAL). 53 | */ 54 | fun addCustomDividerToRecyclerView(recyclerView: RecyclerView, context: Context?, drawableResId: Int, orientation: Int = DividerItemDecoration.VERTICAL) { 55 | // Get the drawable from resources 56 | val drawable = ContextCompat.getDrawable(context!!, drawableResId) 57 | requireNotNull(drawable) { "Drawable resource not found" } 58 | 59 | // Create a DividerItemDecoration with the specified orientation 60 | val dividerItemDecoration = CustomDividerItemDecoration(drawable, orientation) 61 | 62 | // Add the divider to the RecyclerView 63 | recyclerView.addItemDecoration(dividerItemDecoration) 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/java/com/v2ray/ang/ui/FragmentAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.v2ray.ang.ui 2 | 3 | import androidx.fragment.app.Fragment 4 | import androidx.fragment.app.FragmentActivity 5 | import androidx.viewpager2.adapter.FragmentStateAdapter 6 | 7 | class FragmentAdapter(fragmentActivity: FragmentActivity, private val mFragments: List<Fragment>) : 8 | FragmentStateAdapter(fragmentActivity) { 9 | 10 | override fun createFragment(position: Int): Fragment { 11 | return mFragments[position] 12 | } 13 | 14 | override fun getItemCount(): Int { 15 | return mFragments.size 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/java/com/v2ray/ang/ui/LogcatRecyclerAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.v2ray.ang.ui 2 | 3 | import android.util.Log 4 | import android.view.LayoutInflater 5 | import android.view.ViewGroup 6 | import androidx.recyclerview.widget.RecyclerView 7 | import com.v2ray.ang.AppConfig 8 | import com.v2ray.ang.databinding.ItemRecyclerLogcatBinding 9 | 10 | class LogcatRecyclerAdapter(val activity: LogcatActivity) : RecyclerView.Adapter<LogcatRecyclerAdapter.MainViewHolder>() { 11 | private var mActivity: LogcatActivity = activity 12 | 13 | 14 | override fun getItemCount() = mActivity.logsets.size 15 | 16 | override fun onBindViewHolder(holder: MainViewHolder, position: Int) { 17 | try { 18 | val log = mActivity.logsets[position] 19 | if (log.isEmpty()) { 20 | holder.itemSubSettingBinding.logTag.text = "" 21 | holder.itemSubSettingBinding.logContent.text = "" 22 | } else { 23 | val content = log.split("):", limit = 2) 24 | holder.itemSubSettingBinding.logTag.text = content.first().split("(", limit = 2).first().trim() 25 | holder.itemSubSettingBinding.logContent.text = if (content.count() > 1) content.last().trim() else "" 26 | } 27 | } catch (e: Exception) { 28 | Log.e(AppConfig.TAG, "Error binding log view data", e) 29 | } 30 | } 31 | 32 | override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MainViewHolder { 33 | return MainViewHolder( 34 | ItemRecyclerLogcatBinding.inflate( 35 | LayoutInflater.from(parent.context), 36 | parent, 37 | false 38 | ) 39 | ) 40 | } 41 | 42 | class MainViewHolder(val itemSubSettingBinding: ItemRecyclerLogcatBinding) : RecyclerView.ViewHolder(itemSubSettingBinding.root) 43 | 44 | } 45 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/java/com/v2ray/ang/ui/ScScannerActivity.kt: -------------------------------------------------------------------------------- 1 | package com.v2ray.ang.ui 2 | 3 | import android.Manifest 4 | import android.content.Intent 5 | import android.os.Bundle 6 | import androidx.activity.result.contract.ActivityResultContracts 7 | import com.v2ray.ang.R 8 | import com.v2ray.ang.extension.toast 9 | import com.v2ray.ang.extension.toastError 10 | import com.v2ray.ang.extension.toastSuccess 11 | import com.v2ray.ang.handler.AngConfigManager 12 | 13 | class ScScannerActivity : BaseActivity() { 14 | 15 | private val requestCameraPermissionLauncher = registerForActivityResult( 16 | ActivityResultContracts.RequestPermission() 17 | ) { isGranted: Boolean -> 18 | if (isGranted) { 19 | scanQRCode.launch(Intent(this, ScannerActivity::class.java)) 20 | } else { 21 | toast(R.string.toast_permission_denied) 22 | finish() 23 | } 24 | } 25 | 26 | override fun onCreate(savedInstanceState: Bundle?) { 27 | super.onCreate(savedInstanceState) 28 | setContentView(R.layout.activity_none) 29 | importQRcode() 30 | } 31 | 32 | private fun importQRcode(): Boolean { 33 | requestCameraPermissionLauncher.launch(Manifest.permission.CAMERA) 34 | return true 35 | } 36 | 37 | private val scanQRCode = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { 38 | if (it.resultCode == RESULT_OK) { 39 | val scanResult = it.data?.getStringExtra("SCAN_RESULT").orEmpty() 40 | val (count, countSub) = AngConfigManager.importBatchConfig(scanResult, "", false) 41 | 42 | if (count + countSub > 0) { 43 | toastSuccess(R.string.toast_success) 44 | } else { 45 | toastError(R.string.toast_failure) 46 | } 47 | 48 | startActivity(Intent(this, MainActivity::class.java)) 49 | } 50 | finish() 51 | } 52 | } -------------------------------------------------------------------------------- /V2rayNG/app/src/main/java/com/v2ray/ang/ui/ScSwitchActivity.kt: -------------------------------------------------------------------------------- 1 | package com.v2ray.ang.ui 2 | 3 | import android.os.Bundle 4 | import com.v2ray.ang.R 5 | import com.v2ray.ang.service.V2RayServiceManager 6 | 7 | class ScSwitchActivity : BaseActivity() { 8 | override fun onCreate(savedInstanceState: Bundle?) { 9 | super.onCreate(savedInstanceState) 10 | moveTaskToBack(true) 11 | 12 | setContentView(R.layout.activity_none) 13 | 14 | if (V2RayServiceManager.isRunning()) { 15 | V2RayServiceManager.stopVService(this) 16 | } else { 17 | V2RayServiceManager.startVServiceFromToggle(this) 18 | } 19 | finish() 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/java/com/v2ray/ang/util/AppManagerUtil.kt: -------------------------------------------------------------------------------- 1 | package com.v2ray.ang.util 2 | 3 | import android.content.Context 4 | import android.content.pm.ApplicationInfo 5 | import android.content.pm.PackageManager 6 | import com.v2ray.ang.dto.AppInfo 7 | import kotlinx.coroutines.Dispatchers 8 | import kotlinx.coroutines.withContext 9 | 10 | object AppManagerUtil { 11 | /** 12 | * Load the list of network applications. 13 | * 14 | * @param context The context to use. 15 | * @return A list of AppInfo objects representing the network applications. 16 | */ 17 | suspend fun loadNetworkAppList(context: Context): ArrayList<AppInfo> = 18 | withContext(Dispatchers.IO) { 19 | val packageManager = context.packageManager 20 | val packages = packageManager.getInstalledPackages(PackageManager.GET_PERMISSIONS) 21 | val apps = ArrayList<AppInfo>() 22 | 23 | for (pkg in packages) { 24 | val applicationInfo = pkg.applicationInfo ?: continue 25 | 26 | val appName = applicationInfo.loadLabel(packageManager).toString() 27 | val appIcon = applicationInfo.loadIcon(packageManager) ?: continue 28 | val isSystemApp = applicationInfo.flags and ApplicationInfo.FLAG_SYSTEM > 0 29 | 30 | val appInfo = AppInfo(appName, pkg.packageName, appIcon, isSystemApp, 0) 31 | apps.add(appInfo) 32 | } 33 | 34 | return@withContext apps 35 | } 36 | 37 | fun getLastUpdateTime(context: Context): Long = 38 | context.packageManager.getPackageInfo(context.packageName, 0).lastUpdateTime 39 | 40 | } 41 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/java/com/v2ray/ang/util/JsonUtil.kt: -------------------------------------------------------------------------------- 1 | package com.v2ray.ang.util 2 | 3 | import android.util.Log 4 | import com.google.gson.Gson 5 | import com.google.gson.GsonBuilder 6 | import com.google.gson.JsonObject 7 | import com.google.gson.JsonParser 8 | import com.google.gson.JsonPrimitive 9 | import com.google.gson.JsonSerializationContext 10 | import com.google.gson.JsonSerializer 11 | import com.google.gson.reflect.TypeToken 12 | import com.v2ray.ang.AppConfig 13 | import java.lang.reflect.Type 14 | 15 | object JsonUtil { 16 | private var gson = Gson() 17 | 18 | /** 19 | * Converts an object to its JSON representation. 20 | * 21 | * @param src The object to convert. 22 | * @return The JSON representation of the object. 23 | */ 24 | fun toJson(src: Any?): String { 25 | return gson.toJson(src) 26 | } 27 | 28 | /** 29 | * Parses a JSON string into an object of the specified class. 30 | * 31 | * @param src The JSON string to parse. 32 | * @param cls The class of the object to parse into. 33 | * @return The parsed object. 34 | */ 35 | fun <T> fromJson(src: String, cls: Class<T>): T { 36 | return gson.fromJson(src, cls) 37 | } 38 | 39 | /** 40 | * Converts an object to its pretty-printed JSON representation. 41 | * 42 | * @param src The object to convert. 43 | * @return The pretty-printed JSON representation of the object, or null if the object is null. 44 | */ 45 | fun toJsonPretty(src: Any?): String? { 46 | if (src == null) 47 | return null 48 | val gsonPre = GsonBuilder() 49 | .setPrettyPrinting() 50 | .disableHtmlEscaping() 51 | .registerTypeAdapter( // custom serializer is needed here since JSON by default parse number as Double, core will fail to start 52 | object : TypeToken<Double>() {}.type, 53 | JsonSerializer { src: Double?, _: Type?, _: JsonSerializationContext? -> 54 | JsonPrimitive( 55 | src?.toInt() 56 | ) 57 | } 58 | ) 59 | .create() 60 | return gsonPre.toJson(src) 61 | } 62 | 63 | /** 64 | * Parses a JSON string into a JsonObject. 65 | * 66 | * @param src The JSON string to parse. 67 | * @return The parsed JsonObject, or null if parsing fails. 68 | */ 69 | fun parseString(src: String?): JsonObject? { 70 | if (src == null) 71 | return null 72 | try { 73 | return JsonParser.parseString(src).getAsJsonObject() 74 | } catch (e: Exception) { 75 | Log.e(AppConfig.TAG, "Failed to parse JSON string", e) 76 | return null 77 | } 78 | } 79 | } -------------------------------------------------------------------------------- /V2rayNG/app/src/main/java/com/v2ray/ang/util/MessageUtil.kt: -------------------------------------------------------------------------------- 1 | package com.v2ray.ang.util 2 | 3 | import android.content.ComponentName 4 | import android.content.Context 5 | import android.content.Intent 6 | import android.util.Log 7 | import com.v2ray.ang.AppConfig 8 | import com.v2ray.ang.service.V2RayTestService 9 | import java.io.Serializable 10 | 11 | object MessageUtil { 12 | 13 | 14 | /** 15 | * Sends a message to the service. 16 | * 17 | * @param ctx The context. 18 | * @param what The message identifier. 19 | * @param content The message content. 20 | */ 21 | fun sendMsg2Service(ctx: Context, what: Int, content: Serializable) { 22 | sendMsg(ctx, AppConfig.BROADCAST_ACTION_SERVICE, what, content) 23 | } 24 | 25 | /** 26 | * Sends a message to the UI. 27 | * 28 | * @param ctx The context. 29 | * @param what The message identifier. 30 | * @param content The message content. 31 | */ 32 | fun sendMsg2UI(ctx: Context, what: Int, content: Serializable) { 33 | sendMsg(ctx, AppConfig.BROADCAST_ACTION_ACTIVITY, what, content) 34 | } 35 | 36 | /** 37 | * Sends a message to the test service. 38 | * 39 | * @param ctx The context. 40 | * @param what The message identifier. 41 | * @param content The message content. 42 | */ 43 | fun sendMsg2TestService(ctx: Context, what: Int, content: Serializable) { 44 | try { 45 | val intent = Intent() 46 | intent.component = ComponentName(ctx, V2RayTestService::class.java) 47 | intent.putExtra("key", what) 48 | intent.putExtra("content", content) 49 | ctx.startService(intent) 50 | } catch (e: Exception) { 51 | Log.e(AppConfig.TAG, "Failed to send message to test service", e) 52 | } 53 | } 54 | 55 | /** 56 | * Sends a message with the specified action. 57 | * 58 | * @param ctx The context. 59 | * @param action The action string. 60 | * @param what The message identifier. 61 | * @param content The message content. 62 | */ 63 | private fun sendMsg(ctx: Context, action: String, what: Int, content: Serializable) { 64 | try { 65 | val intent = Intent() 66 | intent.action = action 67 | intent.`package` = AppConfig.ANG_PACKAGE 68 | intent.putExtra("key", what) 69 | intent.putExtra("content", content) 70 | ctx.sendBroadcast(intent) 71 | } catch (e: Exception) { 72 | Log.e(AppConfig.TAG, "Failed to send message with action: $action", e) 73 | } 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/java/com/v2ray/ang/util/MyContextWrapper.kt: -------------------------------------------------------------------------------- 1 | package com.v2ray.ang.util 2 | 3 | import android.content.Context 4 | import android.content.ContextWrapper 5 | import android.content.res.Configuration 6 | import android.content.res.Resources 7 | import android.os.Build 8 | import android.os.LocaleList 9 | import androidx.annotation.RequiresApi 10 | import java.util.Locale 11 | 12 | open class MyContextWrapper(base: Context?) : ContextWrapper(base) { 13 | companion object { 14 | /** 15 | * Wraps the context with a new locale. 16 | * 17 | * @param context The original context. 18 | * @param newLocale The new locale to set. 19 | * @return A ContextWrapper with the new locale. 20 | */ 21 | @RequiresApi(Build.VERSION_CODES.N) 22 | fun wrap(context: Context, newLocale: Locale?): ContextWrapper { 23 | var mContext = context 24 | val res: Resources = mContext.resources 25 | val configuration: Configuration = res.configuration 26 | mContext = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { 27 | configuration.setLocale(newLocale) 28 | val localeList = LocaleList(newLocale) 29 | LocaleList.setDefault(localeList) 30 | configuration.setLocales(localeList) 31 | mContext.createConfigurationContext(configuration) 32 | } else { 33 | configuration.setLocale(newLocale) 34 | mContext.createConfigurationContext(configuration) 35 | } 36 | return ContextWrapper(mContext) 37 | } 38 | } 39 | } -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/color/color_highlight_material.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <selector xmlns:android="http://schemas.android.com/apk/res/android"> 3 | <item android:alpha="@dimen/highlight_alpha_material_colored" android:color="?android:attr/colorControlActivated" android:state_checked="true" android:state_enabled="true" /> 4 | <item android:color="?android:attr/colorControlHighlight" /> 5 | </selector> -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable-hdpi/ic_stat_direct.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/2dust/v2rayNG/680832614bd4ff9952d2009b9edeb2dd891ec2f7/V2rayNG/app/src/main/res/drawable-hdpi/ic_stat_direct.png -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable-hdpi/ic_stat_name.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/2dust/v2rayNG/680832614bd4ff9952d2009b9edeb2dd891ec2f7/V2rayNG/app/src/main/res/drawable-hdpi/ic_stat_name.png -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable-hdpi/ic_stat_proxy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/2dust/v2rayNG/680832614bd4ff9952d2009b9edeb2dd891ec2f7/V2rayNG/app/src/main/res/drawable-hdpi/ic_stat_proxy.png -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable-mdpi/ic_stat_direct.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/2dust/v2rayNG/680832614bd4ff9952d2009b9edeb2dd891ec2f7/V2rayNG/app/src/main/res/drawable-mdpi/ic_stat_direct.png -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable-mdpi/ic_stat_name.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/2dust/v2rayNG/680832614bd4ff9952d2009b9edeb2dd891ec2f7/V2rayNG/app/src/main/res/drawable-mdpi/ic_stat_name.png -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable-mdpi/ic_stat_name_black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/2dust/v2rayNG/680832614bd4ff9952d2009b9edeb2dd891ec2f7/V2rayNG/app/src/main/res/drawable-mdpi/ic_stat_name_black.png -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable-mdpi/ic_stat_proxy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/2dust/v2rayNG/680832614bd4ff9952d2009b9edeb2dd891ec2f7/V2rayNG/app/src/main/res/drawable-mdpi/ic_stat_proxy.png -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable-night/ic_about_24dp.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:viewportWidth="1024" 5 | android:viewportHeight="1024"> 6 | <path 7 | android:fillColor="#FFFFFFFF" 8 | android:pathData="M810.7,206.3A426.7,426.7 0,1 0,512 938.7h5.5A426.7,426.7 0,0 0,810.7 206.3zM771.8,765A360.1,360.1 0,0 1,517.1 874.7L512,874.7a362.7,362.7 0,0 1,-4.9 -725.3h3.4a362.7,362.7 0,0 1,261.3 615.7z" /> 9 | <path 10 | android:fillColor="#FFFFFFFF" 11 | android:pathData="M547.2,390a57.4,57.4 0,0 0,62.3 -55.3,39.3 39.3,0 0,0 -45,-42.7 58.9,58.9 0,0 0,-64 54.6c-1.7,26.9 13.9,43.3 46.7,43.3zM548.3,663.5c-5.5,0 -7.9,-7.3 -2.3,-28.2l31.1,-118c11.7,-42.7 7.9,-71.3 -15.8,-71.3 -28.4,0 -94.7,28.4 -152.5,76.4l11.7,19.4a181.3,181.3 0,0 1,56.1 -24.7c5.5,0 4.7,7.3 0,25.2l-27.3,112.2c-16.6,64 0,77.7 24.5,77.7s85.3,-21.3 141,-77.7l-13.4,-17.9a122.7,122.7 0,0 1,-53.1 26.9z" /> 12 | </vector> 13 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable-night/ic_action_done.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:viewportWidth="24.0" 5 | android:viewportHeight="24.0"> 6 | <path 7 | android:fillColor="#FFFFFFFF" 8 | android:pathData="M9,16.2L4.8,12l-1.4,1.4L9,19 21,7l-1.4,-1.4L9,16.2z" /> 9 | </vector> 10 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable-night/ic_add_24dp.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:viewportWidth="24.0" 5 | android:viewportHeight="24.0"> 6 | <path 7 | android:fillColor="#FFFFFFFF" 8 | android:pathData="M19,13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z" /> 9 | </vector> 10 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable-night/ic_backup_24dp.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:viewportWidth="1024" 5 | android:viewportHeight="1024"> 6 | <path 7 | android:fillColor="#FFFFFFFF" 8 | android:pathData="M864,192L704,192L704,96c0,-17.7 -14.3,-32 -32,-32L352,64c-9,0 -17.2,3.7 -22.9,9.7L137.7,265.1c-6,5.8 -9.7,14 -9.7,22.9v512c0,17.7 14.3,32 32,32h160v96c0,17.7 14.3,32 32,32h512c17.7,0 32,-14.3 32,-32L896,224c0,-17.7 -14.3,-32 -32,-32zM320,173.2L320,256h-82.8l82.8,-82.8zM192,768L192,320h160c17.7,0 32,-14.3 32,-32L384,128h256v64h-96c-9,0 -17.2,3.7 -22.9,9.7L329.7,393.1c-6,5.8 -9.7,14 -9.7,22.9v352L192,768zM512,301.2L512,384h-82.8l82.8,-82.8zM832,896L384,896L384,448h160c17.7,0 32,-14.3 32,-32L576,256h256v640z" /> 9 | </vector> 10 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable-night/ic_check_update_24dp.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:viewportWidth="24" 5 | android:viewportHeight="24"> 6 | 7 | <path 8 | android:fillColor="#FFFFFFFF" 9 | android:pathData="M21,10.12h-6.78l2.74,-2.82c-2.73,-2.7 -7.15,-2.8 -9.88,-0.1c-2.73,2.71 -2.73,7.08 0,9.79s7.15,2.71 9.88,0C18.32,15.65 19,14.08 19,12.1h2c0,1.98 -0.88,4.55 -2.64,6.29c-3.51,3.48 -9.21,3.48 -12.72,0c-3.5,-3.47 -3.53,-9.11 -0.02,-12.58s9.14,-3.47 12.65,0L21,3V10.12zM12.5,8v4.25l3.5,2.08l-0.72,1.21L11,13V8H12.5z" /> 10 | 11 | </vector> 12 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable-night/ic_cloud_download_24dp.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:viewportWidth="24" 5 | android:viewportHeight="24"> 6 | <path 7 | android:fillColor="#FFFFFFFF" 8 | android:pathData="M19.35,10.04C18.67,6.59 15.64,4 12,4 9.11,4 6.6,5.64 5.35,8.04 2.34,8.36 0,10.91 0,14c0,3.31 2.69,6 6,6h13c2.76,0 5,-2.24 5,-5 0,-2.64 -2.05,-4.78 -4.65,-4.96zM17,13l-5,5 -5,-5h3V9h4v4h3z" /> 9 | </vector> 10 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable-night/ic_copy.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:viewportWidth="24.0" 5 | android:viewportHeight="24.0"> 6 | <path 7 | android:fillColor="#FFFFFFFF" 8 | android:pathData="M16,1L4,1c-1.1,0 -2,0.9 -2,2v14h2L4,3h12L16,1zM19,5L8,5c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h11c1.1,0 2,-0.9 2,-2L21,7c0,-1.1 -0.9,-2 -2,-2zM19,21L8,21L8,7h11v14z" /> 9 | </vector> 10 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable-night/ic_delete_24dp.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:viewportWidth="24.0" 5 | android:viewportHeight="24.0"> 6 | <path 7 | android:fillColor="#FFFFFFFF" 8 | android:pathData="M6,19c0,1.1 0.9,2 2,2h8c1.1,0 2,-0.9 2,-2L18,7L6,7v12zM8.46,11.88l1.41,-1.41L12,12.59l2.12,-2.12 1.41,1.41L13.41,14l2.12,2.12 -1.41,1.41L12,15.41l-2.12,2.12 -1.41,-1.41L10.59,14l-2.13,-2.12zM15.5,4l-1,-1h-5l-1,1L5,4v2h14L19,4z" /> 9 | </vector> 10 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable-night/ic_description_24dp.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:viewportWidth="24.0" 5 | android:viewportHeight="24.0"> 6 | <path 7 | android:fillColor="#FFFFFFFF" 8 | android:pathData="M14,2L6,2c-1.1,0 -1.99,0.9 -1.99,2L4,20c0,1.1 0.89,2 1.99,2L18,22c1.1,0 2,-0.9 2,-2L20,8l-6,-6zM16,18L8,18v-2h8v2zM16,14L8,14v-2h8v2zM13,9L13,3.5L18.5,9L13,9z" /> 9 | </vector> 10 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable-night/ic_edit_24dp.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:viewportWidth="24.0" 5 | android:viewportHeight="24.0"> 6 | <path 7 | android:fillColor="#FFFFFFFF" 8 | android:pathData="M3,17.25V21h3.75L17.81,9.94l-3.75,-3.75L3,17.25zM20.71,7.04c0.39,-0.39 0.39,-1.02 0,-1.41l-2.34,-2.34c-0.39,-0.39 -1.02,-0.39 -1.41,0l-1.83,1.83 3.75,3.75 1.83,-1.83z" /> 9 | </vector> 10 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable-night/ic_fab_check.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:viewportWidth="24.0" 5 | android:viewportHeight="24.0"> 6 | <path 7 | android:fillColor="#FFF" 8 | android:pathData="M9,16.17L4.83,12l-1.42,1.41L9,19 21,7l-1.41,-1.41z" /> 9 | </vector> 10 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable-night/ic_feedback_24dp.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:viewportWidth="1024" 5 | android:viewportHeight="1024"> 6 | <path 7 | android:fillColor="#FFFFFFFF" 8 | android:pathData="M512,192.7v42.7a21.3,21.3 0,0 1,-21.3 21.3H213.5V770.6l552.9,-2.2v-233.4a21.3,21.3 0,0 1,21.3 -21.3h42.7a21.3,21.3 0,0 1,21.3 21.3v256.1c0,32.6 -24.9,59.3 -56.6,62.4l-6.1,0.3 -598.2,2.1c-32.6,0 -59.3,-24.8 -62.4,-56.6l-0.3,-6V234c0,-32.6 24.8,-59.3 56.6,-62.4l6,-0.3H490.7a21.3,21.3 0,0 1,21.3 21.3z" /> 9 | <path 10 | android:fillColor="#FFFFFFFF" 11 | android:pathData="M848.7,238.2l-250.8,250.8a21.3,21.3 0,0 1,-13.1 6.1c-30.8,2.9 -47.9,2.6 -51.2,-0.8 -3.4,-3.4 -4,-20.8 -2,-52.3a21.3,21.3 0,0 1,6.2 -13.7l250.5,-250.6a21.3,21.3 0,0 1,30.2 0l30.2,30.2a21.3,21.3 0,0 1,0 30.2z" /> 12 | </vector> 13 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable-night/ic_file_24dp.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:viewportWidth="1024" 5 | android:viewportHeight="1024"> 6 | <path 7 | android:fillColor="#FFFFFFFF" 8 | android:pathData="M537,85.3A85.3,85.3 0,0 1,597.3 110.3L828.3,341.3A85.3,85.3 0,0 1,853.3 401.7L853.3,810.7a128,128 0,0 1,-128 128L298.7,938.7a128,128 0,0 1,-128 -128L170.7,213.3a128,128 0,0 1,128 -128zM537,170.7L298.7,170.7a42.7,42.7 0,0 0,-42.7 42.7v597.3a42.7,42.7 0,0 0,42.7 42.7h426.7a42.7,42.7 0,0 0,42.7 -42.7L768,401.7L537,170.7zM512,384a42.7,42.7 0,0 1,42.4 37.7L554.7,426.7v85.3h85.3a42.7,42.7 0,0 1,5 85L640,597.3h-85.3v85.3a42.7,42.7 0,0 1,-85 5L469.3,682.7v-85.3L384,597.3a42.7,42.7 0,0 1,-5 -85L384,512h85.3v-85.3a42.7,42.7 0,0 1,42.7 -42.7z" /> 9 | </vector> 10 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable-night/ic_image_24dp.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:viewportWidth="1024" 5 | android:viewportHeight="1024"> 6 | <path 7 | android:fillColor="#FFFFFFFF" 8 | android:pathData="M784,112L240,112c-88,0 -160,72 -160,160v480c0,88 72,160 160,160h544c88,0 160,-72 160,-160L944,272c0,-88 -72,-160 -160,-160zM880,752c0,52.8 -43.2,96 -96,96L240,848c-52.8,0 -96,-43.2 -96,-96L144,272c0,-52.8 43.2,-96 96,-96h544c52.8,0 96,43.2 96,96v480z" /> 9 | <path 10 | android:fillColor="#FFFFFFFF" 11 | android:pathData="M352,480c52.8,0 96,-43.2 96,-96s-43.2,-96 -96,-96 -96,43.2 -96,96 43.2,96 96,96zM352,352c17.6,0 32,14.4 32,32s-14.4,32 -32,32 -32,-14.4 -32,-32 14.4,-32 32,-32zM814.4,731.2l-3.2,-3.2 -177.6,-177.6c-25.6,-25.6 -65.6,-25.6 -91.2,0l-80,80 -36.8,-36.8c-25.6,-25.6 -65.6,-25.6 -91.2,0L200,728c-4.8,6.4 -8,14.4 -8,24 0,17.6 14.4,32 32,32 9.6,0 16,-3.2 22.4,-9.6L380.8,640l134.4,134.4c6.4,6.4 14.4,9.6 24,9.6 17.6,0 32,-14.4 32,-32 0,-9.6 -4.8,-17.6 -9.6,-24l-52.8,-52.8 80,-80L769.6,776c6.4,4.8 12.8,8 20.8,8 17.6,0 32,-14.4 32,-32 0,-8 -3.2,-16 -8,-20.8z" /> 12 | </vector> 13 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable-night/ic_lock_24dp.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:viewportWidth="1024" 5 | android:viewportHeight="1024"> 6 | 7 | <path 8 | android:fillColor="#FFFFFFFF" 9 | android:pathData="M742.4,409.6L716.8,409.6L716.8,332.8C716.8,205.8 613.4,102.4 486.4,102.4S256,205.8 256,332.8L256,409.6h-25.6C188.1,409.6 153.6,444.1 153.6,486.4v409.6c0,42.3 34.5,76.8 76.8,76.8h512c42.3,0 76.8,-34.5 76.8,-76.8v-409.6c0,-42.3 -34.5,-76.8 -76.8,-76.8zM307.2,332.8C307.2,234 387.6,153.6 486.4,153.6S665.6,234 665.6,332.8L665.6,409.6L307.2,409.6L307.2,332.8zM768,896a25.6,25.6 0,0 1,-25.6 25.6h-512a25.6,25.6 0,0 1,-25.6 -25.6v-409.6a25.6,25.6 0,0 1,25.6 -25.6h512a25.6,25.6 0,0 1,25.6 25.6v409.6z" /> 10 | 11 | </vector> -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable-night/ic_logcat_24dp.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:viewportWidth="1024" 5 | android:viewportHeight="1024"> 6 | <path 7 | android:fillColor="#FFFFFFFF" 8 | android:pathData="M273.2,212.8h583.7L856.9,906.2h-583.7L273.2,212.8zM344.9,284.5L344.9,834.6h440.3L785.2,284.5h-440.3z" /> 9 | <path 10 | android:fillColor="#FFFFFFFF" 11 | android:pathData="M167.1,117.8h554.4v123.6h-71.7V189.4H238.8v498.8h73.9v71.7H167.1V117.8z" /> 12 | <path 13 | android:fillColor="#FFFFFFFF" 14 | android:pathData="M674.8,504H455.3v-71.7h219.4v71.7zM674.8,650.2H455.3v-71.7h219.4v71.7z" /> 15 | </vector> 16 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable-night/ic_more_vert_24dp.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:viewportWidth="24" 5 | android:viewportHeight="24"> 6 | 7 | <path 8 | android:fillColor="#FFFFFFFF" 9 | android:pathData="M12,8c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2zM12,10c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2zM12,16c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2z" /> 10 | 11 | </vector> 12 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable-night/ic_outline_filter_alt_24.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:tint="#FFFFFF" 5 | android:viewportWidth="24" 6 | android:viewportHeight="24"> 7 | <path 8 | android:fillColor="@android:color/white" 9 | android:pathData="M7,6h10l-5.01,6.3L7,6zM4.25,5.61C6.27,8.2 10,13 10,13v6c0,0.55 0.45,1 1,1h2c0.55,0 1,-0.45 1,-1v-6c0,0 3.72,-4.8 5.74,-7.39C20.25,4.95 19.78,4 18.95,4H5.04C4.21,4 3.74,4.95 4.25,5.61z" /> 10 | </vector> 11 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable-night/ic_per_apps_24dp.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:viewportWidth="24" 5 | android:viewportHeight="24"> 6 | 7 | <path 8 | android:fillColor="#FFFFFFFF" 9 | android:pathData="M4,8h4L8,4L4,4v4zM10,20h4v-4h-4v4zM4,20h4v-4L4,16v4zM4,14h4v-4L4,10v4zM10,14h4v-4h-4v4zM16,4v4h4L20,4h-4zM10,8h4L14,4h-4v4zM16,14h4v-4h-4v4zM16,20h4v-4h-4v4z" /> 10 | 11 | </vector> 12 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable-night/ic_play_24dp.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:viewportWidth="1024" 5 | android:viewportHeight="1024"> 6 | <path 7 | android:fillColor="#FFFFFFFF" 8 | android:pathData="M213.333333 789.461333V234.538667C213.333333 168.533333 285.013333 127.530667 341.930667 160.981333l471.68 277.461334c56.106667 32.981333 56.106667 114.133333 0 147.114666L341.930667 863.018667C285.056 896.469333 213.333333 855.466667 213.333333 789.461333z" /> 9 | </vector> 10 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable-night/ic_privacy_24dp.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:viewportWidth="1024" 5 | android:viewportHeight="1024"> 6 | <path 7 | android:fillColor="#FFFFFFFF" 8 | android:pathData="M471.5,77.5a128,128 0,0 1,72.1 -2.6l8.9,2.6 256,85.3a128,128 0,0 1,87.3 113.6l0.3,7.8L896,512c0,101.6 -44.5,186 -103.2,253.1l-8.1,9 -12.1,12.8a618.2,618.2 0,0 1,-25 24.2l-12.8,11.4 -13,11a839.3,839.3 0,0 1,-127.7 86.5l-19.5,10.5 -17.5,9a101.4,101.4 0,0 1,-90.5 0l-18.9,-9.6c-40.1,-21.1 -93.9,-53.2 -145.9,-96.3l-12.9,-11 -12.8,-11.4a618.2,618.2 0,0 1,-24.9 -24.2l-12.1,-12.8 -8.1,-9c-55.9,-63.9 -98.9,-143.4 -102.9,-238.6L128,512L128,284.2A128,128 0,0 1,208.2 165.5l7.3,-2.7 256,-85.3zM512,661.3c-80.2,0 -151.1,40.3 -193.4,101.7 62,57.2 132.2,97.2 176.6,119a37.4,37.4 0,0 0,33.7 0c44.4,-21.9 114.6,-61.9 176.6,-119A234.4,234.4 0,0 0,512 661.3zM491.8,138.2l-256,85.3A64,64 0,0 0,192 284.2L192,512c0,78.5 32.9,146.4 81.5,204.2A298.2,298.2 0,0 1,512 597.3a298.2,298.2 0,0 1,238.5 118.8C799.1,658.4 832,590.5 832,512L832,284.2a64,64 0,0 0,-43.8 -60.7l-256,-85.3a64,64 0,0 0,-40.4 0zM512,298.7a128,128 0,1 1,0 256,128 128,0 0,1 0,-256zM512,362.7a64,64 0,1 0,0 128,64 64,0 0,0 0,-128z" /> 9 | </vector> 10 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable-night/ic_promotion_24dp.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:viewportWidth="1024" 5 | android:viewportHeight="1024"> 6 | <path 7 | android:fillColor="#FFFFFFFF" 8 | android:pathData="M723.9,312c-13.2,-13.2 -34.7,-13.2 -47.9,0 -6.6,6.6 -9.9,15.3 -9.9,23.9 0,8.7 3.3,17.3 9.9,23.9 65.9,65.9 80.9,165.5 37.3,247.8 -4.9,9.2 -10.5,18.2 -16.9,26.8 -6.4,8.7 -12.9,16.4 -20,23.3 -13.4,13.1 -13.7,34.5 -0.6,47.9 13.1,13.4 34.5,13.7 47.9,0.6 9.7,-9.5 18.9,-20.2 27.3,-31.6 8.3,-11.2 15.7,-23 22.2,-35.2 57.5,-108.7 37.7,-240.3 -49.3,-327.4zM507.6,470c-0.2,-0.2 -0.4,-0.3 -0.7,-0.5 -0.8,-0.3 -1.7,-0.1 -2.3,0.5 -0.2,0.2 -0.3,0.4 -0.5,0.7 -0.1,0.3 -0.2,0.5 -0.2,0.8 0,0.6 0.3,1.1 0.6,1.5 0.2,0.2 0.4,0.3 0.7,0.5 0.3,0.1 0.5,0.2 0.8,0.2 0.6,0 1.1,-0.3 1.5,-0.6 0.4,-0.4 0.6,-1 0.6,-1.5 0,-0.3 -0.1,-0.5 -0.2,-0.8 0,-0.4 -0.2,-0.6 -0.3,-0.8z" /> 9 | <path 10 | android:fillColor="#FFFFFFFF" 11 | android:pathData="M833.7,209.6c-13.2,-13.2 -34.5,-13.2 -47.6,0 -13.2,13.2 -13.2,34.5 0,47.6 122.3,122.3 140,314.4 42.1,456.6 -12.5,18.1 -26.5,35 -42.1,50.5 -6.6,6.6 -9.9,15.2 -9.9,23.8 0,8.6 3.3,17.2 9.9,23.8 13.2,13.2 34.5,13.2 47.6,0 18.4,-18.4 35.1,-38.5 49.9,-60C1000,583.1 979,355 833.7,209.6zM515.1,166.8c-48,-22.3 -102.9,-15.1 -143.4,19L176.6,349.9h-50.2c-31,0 -63.3,25.2 -63.3,56.3v209.4c0,31 32.2,56.3 63.3,56.3h50.2L371.7,836c24.9,21 55.4,31.8 86.2,31.8 19.3,0 38.7,-4.2 57.2,-12.8 48,-22.3 77.8,-69.1 77.8,-122L592.9,288.8c0,-52.9 -29.8,-99.6 -77.8,-122zM531.1,732.9c0,31.8 -17.2,52.9 -46.1,66.3 -28.9,13.4 -56.7,6.2 -81,-14.3L206.2,623.5c-4.9,-4.2 -11.2,-6.4 -17.6,-6.4h-60.2c-0.8,0 -1.5,-0.7 -1.5,-1.5L126.9,406.2c0,-0.8 0.7,-1.5 1.5,-1.5h60.2c6.5,0 12.7,-2.3 17.6,-6.4L412,237.7c24.4,-20.5 51.2,-24.7 80,-11.3 28.9,13.4 39.1,30.5 39.1,62.3v444.2z" /> 12 | </vector> 13 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable-night/ic_restore_24dp.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:viewportWidth="1024" 5 | android:viewportHeight="1024"> 6 | <path 7 | android:fillColor="#FFFFFFFF" 8 | android:pathData="M938.7,512a384,384 0,0 1,-384 384,379.3 379.3,0 0,1 -220.2,-69.5 21.8,21.8 0,0 1,-9 -15.8,21.3 21.3,0 0,1 6,-16.6l30.7,-31.1a21.3,21.3 0,0 1,26.9 -2.6A294.8,294.8 0,0 0,554.7 810.7a298.7,298.7 0,1 0,-298.7 -298.7h100.7a20.9,20.9 0,0 1,15.4 6.4l8.5,8.5a21.3,21.3 0,0 1,0 30.3L230,708.3a21.8,21.8 0,0 1,-30.3 0l-150.6,-151a21.3,21.3 0,0 1,0 -30.3l8.5,-8.5a20.9,20.9 0,0 1,15.4 -6.4H170.7a384,384 0,0 1,768 0z" /> 9 | </vector> 10 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable-night/ic_routing_24dp.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:viewportWidth="1024" 5 | android:viewportHeight="1024"> 6 | <path 7 | android:fillColor="#FFFFFFFF" 8 | android:pathData="M740,161a112.1,112.1 0,0 0,-33.5 218.9v95.9L320,602.4L320,318.1a112.1,112.1 0,1 0,-148 -106.1c0,49.3 31.8,91 76,106.1v387.9a112.1,112.1 0,1 0,148 106.1c0,-49.2 -31.8,-91 -76,-106.1v-27.8l423.5,-138.7a50.6,50.6 0,0 0,34.9 -48.2L778.4,378.2c42.9,-15.8 73.6,-57 73.6,-105.2 0,-61.8 -50.2,-112 -112,-112zM236,212a48,48 0,1 1,96 0,48 48,0 0,1 -96,0zM332,812a48,48 0,1 1,-96 0,48 48,0 0,1 96,0zM740,321a48,48 0,1 1,0 -96,48 48,0 0,1 0,96z" /> 9 | </vector> 10 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable-night/ic_save_24dp.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:viewportWidth="24.0" 5 | android:viewportHeight="24.0"> 6 | <path 7 | android:fillColor="#FFFFFFFF" 8 | android:pathData="M17,3L5,3c-1.11,0 -2,0.9 -2,2v14c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2L21,7l-4,-4zM12,19c-1.66,0 -3,-1.34 -3,-3s1.34,-3 3,-3 3,1.34 3,3 -1.34,3 -3,3zM15,9L5,9L5,5h10v4z" /> 9 | </vector> 10 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable-night/ic_scan_24dp.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:viewportWidth="1024" 5 | android:viewportHeight="1024"> 6 | 7 | <path 8 | android:fillColor="#FFFFFFFF" 9 | android:pathData="M181.333333 384a32 32 0 0 1-64 0v-111.146667a155.52 155.52 0 0 1 155.52-155.52H384a32 32 0 0 1 0 64h-111.146667a91.52 91.52 0 0 0-91.52 91.52V384zM640 181.333333a32 32 0 0 1 0-64h111.146667a155.52 155.52 0 0 1 155.52 155.52V384a32 32 0 0 1-64 0v-111.146667a91.52 91.52 0 0 0-91.52-91.52H640zM842.666667 640a32 32 0 0 1 64 0v111.146667a155.52 155.52 0 0 1-155.52 155.52H640a32 32 0 0 1 0-64h111.146667a91.52 91.52 0 0 0 91.52-91.52V640zM384 842.666667a32 32 0 0 1 0 64h-111.146667a155.52 155.52 0 0 1-155.52-155.52V640a32 32 0 0 1 64 0v111.146667a91.52 91.52 0 0 0 91.52 91.52H384z m-192-298.666667a32 32 0 0 1 0-64h640a32 32 0 0 1 0 64H192z" /> 10 | </vector> -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable-night/ic_select_all_24dp.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8" standalone="no"?> 2 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 3 | android:width="24dp" 4 | android:height="24dp" 5 | android:viewportWidth="24.0" 6 | android:viewportHeight="24.0"> 7 | <path 8 | android:fillColor="#FFFFFF" 9 | android:pathData="M3,5h2L5,3c-1.1,0 -2,0.9 -2,2zM3,13h2v-2L3,11v2zM7,21h2v-2L7,19v2zM3,9h2L5,7L3,7v2zM13,3h-2v2h2L13,3zM19,3v2h2c0,-1.1 -0.9,-2 -2,-2zM5,21v-2L3,19c0,1.1 0.9,2 2,2zM3,17h2v-2L3,15v2zM9,3L7,3v2h2L9,3zM11,21h2v-2h-2v2zM19,13h2v-2h-2v2zM19,21c1.1,0 2,-0.9 2,-2h-2v2zM19,9h2L21,7h-2v2zM19,17h2v-2h-2v2zM15,21h2v-2h-2v2zM15,5h2L17,3h-2v2zM7,17h10L17,7L7,7v10zM9,9h6v6L9,15L9,9z" /> 10 | </vector> 11 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable-night/ic_settings_24dp.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:viewportWidth="1024" 5 | android:viewportHeight="1024"> 6 | <path 7 | android:fillColor="#FFFFFFFF" 8 | android:pathData="M924.8,625.7l-65.5,-56c3.1,-19 4.7,-38.4 4.7,-57.8s-1.6,-38.8 -4.7,-57.8l65.5,-56c10.1,-8.6 13.8,-22.6 9.3,-35.2l-0.9,-2.6c-18.1,-50.5 -44.9,-96.9 -79.7,-137.9l-1.8,-2.1c-8.6,-10.1 -22.5,-13.9 -35.1,-9.5l-81.3,28.9c-30,-24.6 -63.5,-44 -99.7,-57.6l-15.7,-85c-2.4,-13.1 -12.7,-23.3 -25.8,-25.7l-2.7,-0.5c-52.1,-9.4 -106.9,-9.4 -159,0l-2.7,0.5c-13.1,2.4 -23.4,12.6 -25.8,25.7l-15.8,85.4c-35.9,13.6 -69.2,32.9 -99,57.4l-81.9,-29.1c-12.5,-4.4 -26.5,-0.7 -35.1,9.5l-1.8,2.1c-34.8,41.1 -61.6,87.5 -79.7,137.9l-0.9,2.6c-4.5,12.5 -0.8,26.5 9.3,35.2l66.3,56.6c-3.1,18.8 -4.6,38 -4.6,57.1 0,19.2 1.5,38.4 4.6,57.1L99,625.5c-10.1,8.6 -13.8,22.6 -9.3,35.2l0.9,2.6c18.1,50.4 44.9,96.9 79.7,137.9l1.8,2.1c8.6,10.1 22.5,13.9 35.1,9.5l81.9,-29.1c29.8,24.5 63.1,43.9 99,57.4l15.8,85.4c2.4,13.1 12.7,23.3 25.8,25.7l2.7,0.5c26.1,4.7 52.8,7.1 79.5,7.1 26.7,0 53.5,-2.4 79.5,-7.1l2.7,-0.5c13.1,-2.4 23.4,-12.6 25.8,-25.7l15.7,-85c36.2,-13.6 69.7,-32.9 99.7,-57.6l81.3,28.9c12.5,4.4 26.5,0.7 35.1,-9.5l1.8,-2.1c34.8,-41.1 61.6,-87.5 79.7,-137.9l0.9,-2.6c4.5,-12.3 0.8,-26.3 -9.3,-35zM788.3,465.9c2.5,15.1 3.8,30.6 3.8,46.1s-1.3,31 -3.8,46.1l-6.6,40.1 74.7,63.9c-11.3,26.1 -25.6,50.7 -42.6,73.6L721,702.8l-31.4,25.8c-23.9,19.6 -50.5,35 -79.3,45.8l-38.1,14.3 -17.9,97c-28.1,3.2 -56.8,3.2 -85,0l-17.9,-97.2 -37.8,-14.5c-28.5,-10.8 -55,-26.2 -78.7,-45.7l-31.4,-25.9 -93.4,33.2c-17,-22.9 -31.2,-47.6 -42.6,-73.6l75.5,-64.5 -6.5,-40c-2.4,-14.9 -3.7,-30.3 -3.7,-45.5 0,-15.3 1.2,-30.6 3.7,-45.5l6.5,-40 -75.5,-64.5c11.3,-26.1 25.6,-50.7 42.6,-73.6l93.4,33.2 31.4,-25.9c23.7,-19.5 50.2,-34.9 78.7,-45.7l37.9,-14.3 17.9,-97.2c28.1,-3.2 56.8,-3.2 85,0l17.9,97 38.1,14.3c28.7,10.8 55.4,26.2 79.3,45.8l31.4,25.8 92.8,-32.9c17,22.9 31.2,47.6 42.6,73.6L781.8,426l6.5,39.9z" /> 9 | <path 10 | android:fillColor="#FFFFFFFF" 11 | android:pathData="M512,326c-97.2,0 -176,78.8 -176,176s78.8,176 176,176 176,-78.8 176,-176 -78.8,-176 -176,-176zM591.2,581.2C570,602.3 541.9,614 512,614c-29.9,0 -58,-11.7 -79.2,-32.8C411.7,560 400,531.9 400,502c0,-29.9 11.7,-58 32.8,-79.2C454,401.6 482.1,390 512,390c29.9,0 58,11.6 79.2,32.8C612.3,444 624,472.1 624,502c0,29.9 -11.7,58 -32.8,79.2z" /> 12 | </vector> 13 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable-night/ic_share_24dp.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:viewportWidth="24.0" 5 | android:viewportHeight="24.0"> 6 | <path 7 | android:fillColor="#FFFFFFFF" 8 | android:pathData="M18,16.08c-0.76,0 -1.44,0.3 -1.96,0.77L8.91,12.7c0.05,-0.23 0.09,-0.46 0.09,-0.7s-0.04,-0.47 -0.09,-0.7l7.05,-4.11c0.54,0.5 1.25,0.81 2.04,0.81 1.66,0 3,-1.34 3,-3s-1.34,-3 -3,-3 -3,1.34 -3,3c0,0.24 0.04,0.47 0.09,0.7L8.04,9.81C7.5,9.31 6.79,9 6,9c-1.66,0 -3,1.34 -3,3s1.34,3 3,3c0.79,0 1.5,-0.31 2.04,-0.81l7.12,4.16c-0.05,0.21 -0.08,0.43 -0.08,0.65 0,1.61 1.31,2.92 2.92,2.92 1.61,0 2.92,-1.31 2.92,-2.92s-1.31,-2.92 -2.92,-2.92z" /> 9 | </vector> 10 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable-night/ic_source_code_24dp.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:viewportWidth="1024" 5 | android:viewportHeight="1024"> 6 | <path 7 | android:fillColor="#FFFFFFFF" 8 | android:pathData="M469.2,802.1l-81.7,-24.6L554.8,221.9l81.7,24.6L469.2,802.1zM362.7,654.5l-124.7,-141.7 124.8,-143.5 -64.4,-56 -173.8,199.8 174,197.7 64.1,-56.3zM899.4,513.1l-173.8,-199.8 -64.4,56 124.8,143.5 -124.7,141.7 64.1,56.4 174,-197.7z" /> 9 | </vector> 10 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable-night/ic_stop_24dp.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:viewportWidth="1024" 5 | android:viewportHeight="1024"> 6 | <path 7 | android:fillColor="#FFFFFFFF" 8 | android:pathData="M256 192h512c35.392 0 64 28.608 64 64v512c0 35.392-28.608 64-64 64H256c-35.392 0-64-28.608-64-64V256c0-35.392 28.608-64 64-64z" /> 9 | </vector> 10 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable-night/ic_subscriptions_24dp.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:viewportWidth="1024" 5 | android:viewportHeight="1024"> 6 | <path 7 | android:fillColor="#FFFFFFFF" 8 | android:pathData="M170.6,256h682.7v85.3L170.6,341.3L170.6,256zM256,85.3h512v85.4L256,170.7L256,85.3zM853.3,426.7L170.6,426.7c-46.9,0 -85.3,38.4 -85.3,85.3v341.3c0,47 38.4,85.4 85.3,85.4h682.7c46.9,0 85.3,-38.4 85.3,-85.4L938.6,512c0,-46.9 -38.4,-85.3 -85.3,-85.3zM853.3,853.3L170.6,853.3L170.6,512h682.7v341.3z" /> 9 | </vector> 10 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable-night/ic_telegram_24dp.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:viewportWidth="1024" 5 | android:viewportHeight="1024"> 6 | <path 7 | android:fillColor="#FFFFFFFF" 8 | android:pathData="M912.2,154A85.3,85.3 0,0 0,853.3 128a85.3,85.3 0,0 0,-33.3 6.8l-708.3,306.8a42.7,42.7 0,0 0,-26.5 42.7V512a42.7,42.7 0,0 0,29.4 42.7L298.7,616.1l55.5,187.3a75.9,75.9 0,0 0,56.3 53.3,62.7 62.7,0 0,0 15.4,0 73.8,73.8 0,0 0,50.8 -20.5l67.8,-64 131.4,103.7a85.3,85.3 0,0 0,90 9.4l14.1,-7.3a88.3,88.3 0,0 0,46.5 -62.7L938.7,235.1a90,90 0,0 0,-26.5 -81.1zM763.7,805.1a25.2,25.2 0,0 1,-12.8 17.5l-14.1,7.3a19.6,19.6 0,0 1,-9 2.1,19.6 19.6,0 0,1 -12.4,-4.7l-160.4,-128a20.9,20.9 0,0 0,-27.7 0l-94.7,89.2a11.1,11.1 0,0 1,-6 2.1V640a21.8,21.8 0,0 1,6.8 -15.8c136.1,-128 217.6,-199.7 266.2,-240.6a15.8,15.8 0,0 0,5.1 -11.1,13.7 13.7,0 0,0 -4.3,-11.1 14.9,14.9 0,0 0,-17.9 -4.3l-322.6,203.5a21.3,21.3 0,0 1,-18.3 0L149.3,494.9l694.2,-301.2a16.6,16.6 0,0 1,7.7 0,22.2 22.2,0 0,1 16.2,7.7 26.9,26.9 0,0 1,6.8 23.5z" /> 9 | </vector> 10 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable-night/nav_header_bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/2dust/v2rayNG/680832614bd4ff9952d2009b9edeb2dd891ec2f7/V2rayNG/app/src/main/res/drawable-night/nav_header_bg.png -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable-xhdpi/ic_stat_direct.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/2dust/v2rayNG/680832614bd4ff9952d2009b9edeb2dd891ec2f7/V2rayNG/app/src/main/res/drawable-xhdpi/ic_stat_direct.png -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable-xhdpi/ic_stat_name.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/2dust/v2rayNG/680832614bd4ff9952d2009b9edeb2dd891ec2f7/V2rayNG/app/src/main/res/drawable-xhdpi/ic_stat_name.png -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable-xhdpi/ic_stat_name_black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/2dust/v2rayNG/680832614bd4ff9952d2009b9edeb2dd891ec2f7/V2rayNG/app/src/main/res/drawable-xhdpi/ic_stat_name_black.png -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable-xhdpi/ic_stat_proxy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/2dust/v2rayNG/680832614bd4ff9952d2009b9edeb2dd891ec2f7/V2rayNG/app/src/main/res/drawable-xhdpi/ic_stat_proxy.png -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable-xxhdpi/ic_stat_direct.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/2dust/v2rayNG/680832614bd4ff9952d2009b9edeb2dd891ec2f7/V2rayNG/app/src/main/res/drawable-xxhdpi/ic_stat_direct.png -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable-xxhdpi/ic_stat_name.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/2dust/v2rayNG/680832614bd4ff9952d2009b9edeb2dd891ec2f7/V2rayNG/app/src/main/res/drawable-xxhdpi/ic_stat_name.png -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable-xxhdpi/ic_stat_name_black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/2dust/v2rayNG/680832614bd4ff9952d2009b9edeb2dd891ec2f7/V2rayNG/app/src/main/res/drawable-xxhdpi/ic_stat_name_black.png -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable-xxhdpi/ic_stat_proxy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/2dust/v2rayNG/680832614bd4ff9952d2009b9edeb2dd891ec2f7/V2rayNG/app/src/main/res/drawable-xxhdpi/ic_stat_proxy.png -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable-xxxhdpi/ic_stat_direct.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/2dust/v2rayNG/680832614bd4ff9952d2009b9edeb2dd891ec2f7/V2rayNG/app/src/main/res/drawable-xxxhdpi/ic_stat_direct.png -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable-xxxhdpi/ic_stat_name.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/2dust/v2rayNG/680832614bd4ff9952d2009b9edeb2dd891ec2f7/V2rayNG/app/src/main/res/drawable-xxxhdpi/ic_stat_name.png -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable-xxxhdpi/ic_stat_name_black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/2dust/v2rayNG/680832614bd4ff9952d2009b9edeb2dd891ec2f7/V2rayNG/app/src/main/res/drawable-xxxhdpi/ic_stat_name_black.png -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable-xxxhdpi/ic_stat_proxy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/2dust/v2rayNG/680832614bd4ff9952d2009b9edeb2dd891ec2f7/V2rayNG/app/src/main/res/drawable-xxxhdpi/ic_stat_proxy.png -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable/custom_divider.xml: -------------------------------------------------------------------------------- 1 | <!-- res/drawable/custom_divider.xml --> 2 | <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 3 | <item 4 | android:bottom="0dp" 5 | android:left="16dp" 6 | android:right="16dp" 7 | android:top="0dp"> 8 | <shape> 9 | <size android:height="1dp" /> 10 | <solid android:color="@color/divider_color_light" /> 11 | </shape> 12 | </item> 13 | </layer-list> -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable/ic_about_24dp.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:viewportWidth="1024" 5 | android:viewportHeight="1024"> 6 | <path 7 | android:fillColor="#FF000000" 8 | android:pathData="M810.7,206.3A426.7,426.7 0,1 0,512 938.7h5.5A426.7,426.7 0,0 0,810.7 206.3zM771.8,765A360.1,360.1 0,0 1,517.1 874.7L512,874.7a362.7,362.7 0,0 1,-4.9 -725.3h3.4a362.7,362.7 0,0 1,261.3 615.7z" /> 9 | <path 10 | android:fillColor="#FF000000" 11 | android:pathData="M547.2,390a57.4,57.4 0,0 0,62.3 -55.3,39.3 39.3,0 0,0 -45,-42.7 58.9,58.9 0,0 0,-64 54.6c-1.7,26.9 13.9,43.3 46.7,43.3zM548.3,663.5c-5.5,0 -7.9,-7.3 -2.3,-28.2l31.1,-118c11.7,-42.7 7.9,-71.3 -15.8,-71.3 -28.4,0 -94.7,28.4 -152.5,76.4l11.7,19.4a181.3,181.3 0,0 1,56.1 -24.7c5.5,0 4.7,7.3 0,25.2l-27.3,112.2c-16.6,64 0,77.7 24.5,77.7s85.3,-21.3 141,-77.7l-13.4,-17.9a122.7,122.7 0,0 1,-53.1 26.9z" /> 12 | </vector> 13 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable/ic_action_done.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:viewportWidth="24.0" 5 | android:viewportHeight="24.0"> 6 | <path 7 | android:fillColor="#FF000000" 8 | android:pathData="M9,16.2L4.8,12l-1.4,1.4L9,19 21,7l-1.4,-1.4L9,16.2z" /> 9 | </vector> 10 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable/ic_add_24dp.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:viewportWidth="24.0" 5 | android:viewportHeight="24.0"> 6 | <path 7 | android:fillColor="#FF000000" 8 | android:pathData="M19,13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z" /> 9 | </vector> 10 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable/ic_backup_24dp.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:viewportWidth="1024" 5 | android:viewportHeight="1024"> 6 | <path 7 | android:fillColor="#FF000000" 8 | android:pathData="M864,192L704,192L704,96c0,-17.7 -14.3,-32 -32,-32L352,64c-9,0 -17.2,3.7 -22.9,9.7L137.7,265.1c-6,5.8 -9.7,14 -9.7,22.9v512c0,17.7 14.3,32 32,32h160v96c0,17.7 14.3,32 32,32h512c17.7,0 32,-14.3 32,-32L896,224c0,-17.7 -14.3,-32 -32,-32zM320,173.2L320,256h-82.8l82.8,-82.8zM192,768L192,320h160c17.7,0 32,-14.3 32,-32L384,128h256v64h-96c-9,0 -17.2,3.7 -22.9,9.7L329.7,393.1c-6,5.8 -9.7,14 -9.7,22.9v352L192,768zM512,301.2L512,384h-82.8l82.8,-82.8zM832,896L384,896L384,448h160c17.7,0 32,-14.3 32,-32L576,256h256v640z" /> 9 | </vector> 10 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable/ic_check_update_24dp.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:viewportWidth="24" 5 | android:viewportHeight="24"> 6 | 7 | <path 8 | android:fillColor="#FF000000" 9 | android:pathData="M21,10.12h-6.78l2.74,-2.82c-2.73,-2.7 -7.15,-2.8 -9.88,-0.1c-2.73,2.71 -2.73,7.08 0,9.79s7.15,2.71 9.88,0C18.32,15.65 19,14.08 19,12.1h2c0,1.98 -0.88,4.55 -2.64,6.29c-3.51,3.48 -9.21,3.48 -12.72,0c-3.5,-3.47 -3.53,-9.11 -0.02,-12.58s9.14,-3.47 12.65,0L21,3V10.12zM12.5,8v4.25l3.5,2.08l-0.72,1.21L11,13V8H12.5z" /> 10 | 11 | </vector> 12 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable/ic_circle.xml: -------------------------------------------------------------------------------- 1 | <shape xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:shape="oval"> 3 | <solid android:color="@color/divider_color_light" /> 4 | <size 5 | android:width="48dp" 6 | android:height="48dp" /> 7 | </shape> -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable/ic_cloud_download_24dp.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:viewportWidth="24" 5 | android:viewportHeight="24"> 6 | <path 7 | android:fillColor="#FF000000" 8 | android:pathData="M19.35,10.04C18.67,6.59 15.64,4 12,4 9.11,4 6.6,5.64 5.35,8.04 2.34,8.36 0,10.91 0,14c0,3.31 2.69,6 6,6h13c2.76,0 5,-2.24 5,-5 0,-2.64 -2.05,-4.78 -4.65,-4.96zM17,13l-5,5 -5,-5h3V9h4v4h3z" /> 9 | </vector> 10 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable/ic_copy.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:viewportWidth="24.0" 5 | android:viewportHeight="24.0"> 6 | <path 7 | android:fillColor="#FF000000" 8 | android:pathData="M16,1L4,1c-1.1,0 -2,0.9 -2,2v14h2L4,3h12L16,1zM19,5L8,5c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h11c1.1,0 2,-0.9 2,-2L21,7c0,-1.1 -0.9,-2 -2,-2zM19,21L8,21L8,7h11v14z" /> 9 | </vector> 10 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable/ic_delete_24dp.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:viewportWidth="24.0" 5 | android:viewportHeight="24.0"> 6 | <path 7 | android:fillColor="#FF000000" 8 | android:pathData="M6,19c0,1.1 0.9,2 2,2h8c1.1,0 2,-0.9 2,-2L18,7L6,7v12zM8.46,11.88l1.41,-1.41L12,12.59l2.12,-2.12 1.41,1.41L13.41,14l2.12,2.12 -1.41,1.41L12,15.41l-2.12,2.12 -1.41,-1.41L10.59,14l-2.13,-2.12zM15.5,4l-1,-1h-5l-1,1L5,4v2h14L19,4z" /> 9 | </vector> 10 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable/ic_description_24dp.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:viewportWidth="24.0" 5 | android:viewportHeight="24.0"> 6 | <path 7 | android:fillColor="#FF000000" 8 | android:pathData="M14,2L6,2c-1.1,0 -1.99,0.9 -1.99,2L4,20c0,1.1 0.89,2 1.99,2L18,22c1.1,0 2,-0.9 2,-2L20,8l-6,-6zM16,18L8,18v-2h8v2zM16,14L8,14v-2h8v2zM13,9L13,3.5L18.5,9L13,9z" /> 9 | </vector> 10 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable/ic_edit_24dp.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:viewportWidth="24.0" 5 | android:viewportHeight="24.0"> 6 | <path 7 | android:fillColor="#FF000000" 8 | android:pathData="M3,17.25V21h3.75L17.81,9.94l-3.75,-3.75L3,17.25zM20.71,7.04c0.39,-0.39 0.39,-1.02 0,-1.41l-2.34,-2.34c-0.39,-0.39 -1.02,-0.39 -1.41,0l-1.83,1.83 3.75,3.75 1.83,-1.83z" /> 9 | </vector> 10 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable/ic_fab_check.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:viewportWidth="24.0" 5 | android:viewportHeight="24.0"> 6 | <path 7 | android:fillColor="#000" 8 | android:pathData="M9,16.17L4.83,12l-1.42,1.41L9,19 21,7l-1.41,-1.41z" /> 9 | </vector> 10 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable/ic_feedback_24dp.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:viewportWidth="1024" 5 | android:viewportHeight="1024"> 6 | <path 7 | android:fillColor="#FF000000" 8 | android:pathData="M512,192.7v42.7a21.3,21.3 0,0 1,-21.3 21.3H213.5V770.6l552.9,-2.2v-233.4a21.3,21.3 0,0 1,21.3 -21.3h42.7a21.3,21.3 0,0 1,21.3 21.3v256.1c0,32.6 -24.9,59.3 -56.6,62.4l-6.1,0.3 -598.2,2.1c-32.6,0 -59.3,-24.8 -62.4,-56.6l-0.3,-6V234c0,-32.6 24.8,-59.3 56.6,-62.4l6,-0.3H490.7a21.3,21.3 0,0 1,21.3 21.3z" /> 9 | <path 10 | android:fillColor="#FF000000" 11 | android:pathData="M848.7,238.2l-250.8,250.8a21.3,21.3 0,0 1,-13.1 6.1c-30.8,2.9 -47.9,2.6 -51.2,-0.8 -3.4,-3.4 -4,-20.8 -2,-52.3a21.3,21.3 0,0 1,6.2 -13.7l250.5,-250.6a21.3,21.3 0,0 1,30.2 0l30.2,30.2a21.3,21.3 0,0 1,0 30.2z" /> 12 | </vector> 13 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable/ic_file_24dp.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:viewportWidth="1024" 5 | android:viewportHeight="1024"> 6 | <path 7 | android:fillColor="#FF000000" 8 | android:pathData="M537,85.3A85.3,85.3 0,0 1,597.3 110.3L828.3,341.3A85.3,85.3 0,0 1,853.3 401.7L853.3,810.7a128,128 0,0 1,-128 128L298.7,938.7a128,128 0,0 1,-128 -128L170.7,213.3a128,128 0,0 1,128 -128zM537,170.7L298.7,170.7a42.7,42.7 0,0 0,-42.7 42.7v597.3a42.7,42.7 0,0 0,42.7 42.7h426.7a42.7,42.7 0,0 0,42.7 -42.7L768,401.7L537,170.7zM512,384a42.7,42.7 0,0 1,42.4 37.7L554.7,426.7v85.3h85.3a42.7,42.7 0,0 1,5 85L640,597.3h-85.3v85.3a42.7,42.7 0,0 1,-85 5L469.3,682.7v-85.3L384,597.3a42.7,42.7 0,0 1,-5 -85L384,512h85.3v-85.3a42.7,42.7 0,0 1,42.7 -42.7z" /> 9 | </vector> 10 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable/ic_image_24dp.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:viewportWidth="1024" 5 | android:viewportHeight="1024"> 6 | <path 7 | android:fillColor="#FF000000" 8 | android:pathData="M784,112L240,112c-88,0 -160,72 -160,160v480c0,88 72,160 160,160h544c88,0 160,-72 160,-160L944,272c0,-88 -72,-160 -160,-160zM880,752c0,52.8 -43.2,96 -96,96L240,848c-52.8,0 -96,-43.2 -96,-96L144,272c0,-52.8 43.2,-96 96,-96h544c52.8,0 96,43.2 96,96v480z" /> 9 | <path 10 | android:fillColor="#FF000000" 11 | android:pathData="M352,480c52.8,0 96,-43.2 96,-96s-43.2,-96 -96,-96 -96,43.2 -96,96 43.2,96 96,96zM352,352c17.6,0 32,14.4 32,32s-14.4,32 -32,32 -32,-14.4 -32,-32 14.4,-32 32,-32zM814.4,731.2l-3.2,-3.2 -177.6,-177.6c-25.6,-25.6 -65.6,-25.6 -91.2,0l-80,80 -36.8,-36.8c-25.6,-25.6 -65.6,-25.6 -91.2,0L200,728c-4.8,6.4 -8,14.4 -8,24 0,17.6 14.4,32 32,32 9.6,0 16,-3.2 22.4,-9.6L380.8,640l134.4,134.4c6.4,6.4 14.4,9.6 24,9.6 17.6,0 32,-14.4 32,-32 0,-9.6 -4.8,-17.6 -9.6,-24l-52.8,-52.8 80,-80L769.6,776c6.4,4.8 12.8,8 20.8,8 17.6,0 32,-14.4 32,-32 0,-8 -3.2,-16 -8,-20.8z" /> 12 | </vector> 13 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable/ic_lock_24dp.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:viewportWidth="1024" 5 | android:viewportHeight="1024"> 6 | 7 | <path 8 | android:fillColor="#FF000000" 9 | android:pathData="M742.4,409.6L716.8,409.6L716.8,332.8C716.8,205.8 613.4,102.4 486.4,102.4S256,205.8 256,332.8L256,409.6h-25.6C188.1,409.6 153.6,444.1 153.6,486.4v409.6c0,42.3 34.5,76.8 76.8,76.8h512c42.3,0 76.8,-34.5 76.8,-76.8v-409.6c0,-42.3 -34.5,-76.8 -76.8,-76.8zM307.2,332.8C307.2,234 387.6,153.6 486.4,153.6S665.6,234 665.6,332.8L665.6,409.6L307.2,409.6L307.2,332.8zM768,896a25.6,25.6 0,0 1,-25.6 25.6h-512a25.6,25.6 0,0 1,-25.6 -25.6v-409.6a25.6,25.6 0,0 1,25.6 -25.6h512a25.6,25.6 0,0 1,25.6 25.6v409.6z" /> 10 | 11 | </vector> -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable/ic_logcat_24dp.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:viewportWidth="1024" 5 | android:viewportHeight="1024"> 6 | <path 7 | android:fillColor="#FF000000" 8 | android:pathData="M273.2,212.8h583.7L856.9,906.2h-583.7L273.2,212.8zM344.9,284.5L344.9,834.6h440.3L785.2,284.5h-440.3z" /> 9 | <path 10 | android:fillColor="#FF000000" 11 | android:pathData="M167.1,117.8h554.4v123.6h-71.7V189.4H238.8v498.8h73.9v71.7H167.1V117.8z" /> 12 | <path 13 | android:fillColor="#FF000000" 14 | android:pathData="M674.8,504H455.3v-71.7h219.4v71.7zM674.8,650.2H455.3v-71.7h219.4v71.7z" /> 15 | </vector> 16 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable/ic_more_vert_24dp.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:viewportWidth="24" 5 | android:viewportHeight="24"> 6 | 7 | <path 8 | android:fillColor="#FF000000" 9 | android:pathData="M12,8c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2zM12,10c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2zM12,16c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2z" /> 10 | 11 | </vector> 12 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable/ic_outline_filter_alt_24.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:tint="#000000" 5 | android:viewportWidth="24" 6 | android:viewportHeight="24"> 7 | <path 8 | android:fillColor="@android:color/white" 9 | android:pathData="M7,6h10l-5.01,6.3L7,6zM4.25,5.61C6.27,8.2 10,13 10,13v6c0,0.55 0.45,1 1,1h2c0.55,0 1,-0.45 1,-1v-6c0,0 3.72,-4.8 5.74,-7.39C20.25,4.95 19.78,4 18.95,4H5.04C4.21,4 3.74,4.95 4.25,5.61z" /> 10 | </vector> 11 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable/ic_per_apps_24dp.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:viewportWidth="24" 5 | android:viewportHeight="24"> 6 | 7 | <path 8 | android:fillColor="#FF000000" 9 | android:pathData="M4,8h4L8,4L4,4v4zM10,20h4v-4h-4v4zM4,20h4v-4L4,16v4zM4,14h4v-4L4,10v4zM10,14h4v-4h-4v4zM16,4v4h4L20,4h-4zM10,8h4L14,4h-4v4zM16,14h4v-4h-4v4zM16,20h4v-4h-4v4z" /> 10 | 11 | </vector> 12 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable/ic_play_24dp.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:viewportWidth="1024" 5 | android:viewportHeight="1024"> 6 | <path 7 | android:fillColor="#FFFFFFFF" 8 | android:pathData="M213.333333 789.461333V234.538667C213.333333 168.533333 285.013333 127.530667 341.930667 160.981333l471.68 277.461334c56.106667 32.981333 56.106667 114.133333 0 147.114666L341.930667 863.018667C285.056 896.469333 213.333333 855.466667 213.333333 789.461333z" /> 9 | </vector> 10 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable/ic_privacy_24dp.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:viewportWidth="1024" 5 | android:viewportHeight="1024"> 6 | <path 7 | android:fillColor="#FF000000" 8 | android:pathData="M471.5,77.5a128,128 0,0 1,72.1 -2.6l8.9,2.6 256,85.3a128,128 0,0 1,87.3 113.6l0.3,7.8L896,512c0,101.6 -44.5,186 -103.2,253.1l-8.1,9 -12.1,12.8a618.2,618.2 0,0 1,-25 24.2l-12.8,11.4 -13,11a839.3,839.3 0,0 1,-127.7 86.5l-19.5,10.5 -17.5,9a101.4,101.4 0,0 1,-90.5 0l-18.9,-9.6c-40.1,-21.1 -93.9,-53.2 -145.9,-96.3l-12.9,-11 -12.8,-11.4a618.2,618.2 0,0 1,-24.9 -24.2l-12.1,-12.8 -8.1,-9c-55.9,-63.9 -98.9,-143.4 -102.9,-238.6L128,512L128,284.2A128,128 0,0 1,208.2 165.5l7.3,-2.7 256,-85.3zM512,661.3c-80.2,0 -151.1,40.3 -193.4,101.7 62,57.2 132.2,97.2 176.6,119a37.4,37.4 0,0 0,33.7 0c44.4,-21.9 114.6,-61.9 176.6,-119A234.4,234.4 0,0 0,512 661.3zM491.8,138.2l-256,85.3A64,64 0,0 0,192 284.2L192,512c0,78.5 32.9,146.4 81.5,204.2A298.2,298.2 0,0 1,512 597.3a298.2,298.2 0,0 1,238.5 118.8C799.1,658.4 832,590.5 832,512L832,284.2a64,64 0,0 0,-43.8 -60.7l-256,-85.3a64,64 0,0 0,-40.4 0zM512,298.7a128,128 0,1 1,0 256,128 128,0 0,1 0,-256zM512,362.7a64,64 0,1 0,0 128,64 64,0 0,0 0,-128z" /> 9 | </vector> 10 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable/ic_promotion_24dp.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:viewportWidth="1024" 5 | android:viewportHeight="1024"> 6 | <path 7 | android:fillColor="#FF000000" 8 | android:pathData="M723.9,312c-13.2,-13.2 -34.7,-13.2 -47.9,0 -6.6,6.6 -9.9,15.3 -9.9,23.9 0,8.7 3.3,17.3 9.9,23.9 65.9,65.9 80.9,165.5 37.3,247.8 -4.9,9.2 -10.5,18.2 -16.9,26.8 -6.4,8.7 -12.9,16.4 -20,23.3 -13.4,13.1 -13.7,34.5 -0.6,47.9 13.1,13.4 34.5,13.7 47.9,0.6 9.7,-9.5 18.9,-20.2 27.3,-31.6 8.3,-11.2 15.7,-23 22.2,-35.2 57.5,-108.7 37.7,-240.3 -49.3,-327.4zM507.6,470c-0.2,-0.2 -0.4,-0.3 -0.7,-0.5 -0.8,-0.3 -1.7,-0.1 -2.3,0.5 -0.2,0.2 -0.3,0.4 -0.5,0.7 -0.1,0.3 -0.2,0.5 -0.2,0.8 0,0.6 0.3,1.1 0.6,1.5 0.2,0.2 0.4,0.3 0.7,0.5 0.3,0.1 0.5,0.2 0.8,0.2 0.6,0 1.1,-0.3 1.5,-0.6 0.4,-0.4 0.6,-1 0.6,-1.5 0,-0.3 -0.1,-0.5 -0.2,-0.8 0,-0.4 -0.2,-0.6 -0.3,-0.8z" /> 9 | <path 10 | android:fillColor="#FF000000" 11 | android:pathData="M833.7,209.6c-13.2,-13.2 -34.5,-13.2 -47.6,0 -13.2,13.2 -13.2,34.5 0,47.6 122.3,122.3 140,314.4 42.1,456.6 -12.5,18.1 -26.5,35 -42.1,50.5 -6.6,6.6 -9.9,15.2 -9.9,23.8 0,8.6 3.3,17.2 9.9,23.8 13.2,13.2 34.5,13.2 47.6,0 18.4,-18.4 35.1,-38.5 49.9,-60C1000,583.1 979,355 833.7,209.6zM515.1,166.8c-48,-22.3 -102.9,-15.1 -143.4,19L176.6,349.9h-50.2c-31,0 -63.3,25.2 -63.3,56.3v209.4c0,31 32.2,56.3 63.3,56.3h50.2L371.7,836c24.9,21 55.4,31.8 86.2,31.8 19.3,0 38.7,-4.2 57.2,-12.8 48,-22.3 77.8,-69.1 77.8,-122L592.9,288.8c0,-52.9 -29.8,-99.6 -77.8,-122zM531.1,732.9c0,31.8 -17.2,52.9 -46.1,66.3 -28.9,13.4 -56.7,6.2 -81,-14.3L206.2,623.5c-4.9,-4.2 -11.2,-6.4 -17.6,-6.4h-60.2c-0.8,0 -1.5,-0.7 -1.5,-1.5L126.9,406.2c0,-0.8 0.7,-1.5 1.5,-1.5h60.2c6.5,0 12.7,-2.3 17.6,-6.4L412,237.7c24.4,-20.5 51.2,-24.7 80,-11.3 28.9,13.4 39.1,30.5 39.1,62.3v444.2z" /> 12 | </vector> 13 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable/ic_qu_scan_24dp.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:viewportWidth="1024" 5 | android:viewportHeight="1024"> 6 | <path 7 | android:fillColor="#FFFFFFFF" 8 | android:pathData="M0,512C0,229.23 229.81,0 512,0 794.77,0 1024,229.81 1024,512 1024,794.77 794.19,1024 512,1024 229.23,1024 0,794.19 0,512Z" /> 9 | 10 | <path 11 | android:fillColor="#FF000000" 12 | android:pathData="M780.16 875.52H652.8c-17.92 0-32-14.08-32-32s14.08-32 32-32h127.36c16 0 29.44-13.44 29.44-29.44v-127.36c0-17.92 14.08-32 32-32s32 14.08 32 32v127.36c-0.64 51.2-42.24 93.44-93.44 93.44zM192.64 415.36c-17.92 0-32-14.08-32-32V256c0-51.2 41.6-93.44 93.44-93.44h127.36c17.92 0 32 14.08 32 32s-14.08 32-32 32h-128c-16 0-29.44 13.44-29.44 29.44v127.36c0.64 17.92-14.08 32-31.36 32zM840.96 415.36c-17.92 0-32-14.08-32-32V256c0-16-13.44-29.44-29.44-29.44h-127.36c-17.92 0-32-14.08-32-32s14.08-32 32-32h127.36c51.2 0 93.44 41.6 93.44 93.44v127.36c0 17.92-14.08 32-32 32zM381.44 875.52h-128c-51.2 0-93.44-41.6-93.44-93.44v-127.36c0-17.92 14.08-32 32-32s32 14.08 32 32v127.36c0 16 13.44 29.44 29.44 29.44h127.36c17.92 0 32 14.08 32 32s-14.08 32-31.36 32zM759.04 553.6H274.56c-17.92 0-32-14.08-32-32s14.08-32 32-32h484.48c17.92 0 32 14.08 32 32s-14.72 32-32 32z" /> 13 | </vector> -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable/ic_qu_switch_24dp.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:viewportWidth="1024" 5 | android:viewportHeight="1024"> 6 | <path 7 | android:fillColor="#FFFFFFFF" 8 | android:pathData="M0,512C0,229.23 229.81,0 512,0 794.77,0 1024,229.81 1024,512 1024,794.77 794.19,1024 512,1024 229.23,1024 0,794.19 0,512Z" /> 9 | 10 | <path 11 | android:fillColor="#FF000000" 12 | android:pathData="M742.4 691.2c-12.8-12.8-25.6-12.8-38.4 0-51.2 51.2-115.2 83.2-185.6 83.2-128 0-230.4-89.6-256-204.8l44.8 0C320 569.6 332.8 550.4 320 537.6L243.2 428.8c-6.4-12.8-25.6-12.8-32 0L134.4 537.6c-12.8 12.8 0 32 19.2 32l51.2 0C224 716.8 358.4 832 512 832c89.6 0 166.4-32 230.4-96C748.8 723.2 748.8 704 742.4 691.2L742.4 691.2zM281.6 332.8c12.8 12.8 25.6 12.8 38.4 0C371.2 275.2 441.6 249.6 512 249.6c128 0 230.4 89.6 256 204.8l-44.8 0c-19.2 0-25.6 19.2-19.2 32l76.8 108.8c6.4 12.8 25.6 12.8 32 0l76.8-108.8c12.8-12.8 0-32-19.2-32l-51.2 0C800 307.2 665.6 192 512 192 422.4 192 345.6 230.4 281.6 288 275.2 300.8 275.2 320 281.6 332.8L281.6 332.8zM627.2 556.8c0 25.6-25.6 51.2-51.2 51.2l-128 0c-25.6 0-51.2-25.6-51.2-51.2L396.8 473.6c0-25.6 25.6-51.2 51.2-51.2l128 0c25.6 0 51.2 25.6 51.2 51.2L627.2 556.8 627.2 556.8zM627.2 556.8" /> 13 | </vector> 14 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable/ic_restore_24dp.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:viewportWidth="1024" 5 | android:viewportHeight="1024"> 6 | <path 7 | android:fillColor="#FF000000" 8 | android:pathData="M938.7,512a384,384 0,0 1,-384 384,379.3 379.3,0 0,1 -220.2,-69.5 21.8,21.8 0,0 1,-9 -15.8,21.3 21.3,0 0,1 6,-16.6l30.7,-31.1a21.3,21.3 0,0 1,26.9 -2.6A294.8,294.8 0,0 0,554.7 810.7a298.7,298.7 0,1 0,-298.7 -298.7h100.7a20.9,20.9 0,0 1,15.4 6.4l8.5,8.5a21.3,21.3 0,0 1,0 30.3L230,708.3a21.8,21.8 0,0 1,-30.3 0l-150.6,-151a21.3,21.3 0,0 1,0 -30.3l8.5,-8.5a20.9,20.9 0,0 1,15.4 -6.4H170.7a384,384 0,0 1,768 0z" /> 9 | </vector> 10 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable/ic_rounded_corner_active.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <shape xmlns:android="http://schemas.android.com/apk/res/android"> 3 | <corners android:radius="20dp" /> 4 | <padding 5 | android:bottom="0dp" 6 | android:left="0dp" 7 | android:right="0dp" 8 | android:top="0dp" /> 9 | <solid android:color="@color/color_fab_active" /> 10 | </shape> -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable/ic_rounded_corner_inactive.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <shape xmlns:android="http://schemas.android.com/apk/res/android"> 3 | <corners android:radius="20dp" /> 4 | <padding 5 | android:bottom="0dp" 6 | android:left="0dp" 7 | android:right="0dp" 8 | android:top="0dp" /> 9 | <solid android:color="@color/color_fab_inactive" /> 10 | </shape> -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable/ic_routing_24dp.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:viewportWidth="1024" 5 | android:viewportHeight="1024"> 6 | <path 7 | android:fillColor="#FF000000" 8 | android:pathData="M740,161a112.1,112.1 0,0 0,-33.5 218.9v95.9L320,602.4L320,318.1a112.1,112.1 0,1 0,-148 -106.1c0,49.3 31.8,91 76,106.1v387.9a112.1,112.1 0,1 0,148 106.1c0,-49.2 -31.8,-91 -76,-106.1v-27.8l423.5,-138.7a50.6,50.6 0,0 0,34.9 -48.2L778.4,378.2c42.9,-15.8 73.6,-57 73.6,-105.2 0,-61.8 -50.2,-112 -112,-112zM236,212a48,48 0,1 1,96 0,48 48,0 0,1 -96,0zM332,812a48,48 0,1 1,-96 0,48 48,0 0,1 96,0zM740,321a48,48 0,1 1,0 -96,48 48,0 0,1 0,96z" /> 9 | </vector> 10 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable/ic_save_24dp.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:viewportWidth="24.0" 5 | android:viewportHeight="24.0"> 6 | <path 7 | android:fillColor="#FF000000" 8 | android:pathData="M17,3L5,3c-1.11,0 -2,0.9 -2,2v14c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2L21,7l-4,-4zM12,19c-1.66,0 -3,-1.34 -3,-3s1.34,-3 3,-3 3,1.34 3,3 -1.34,3 -3,3zM15,9L5,9L5,5h10v4z" /> 9 | </vector> 10 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable/ic_scan_24dp.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:viewportWidth="1024" 5 | android:viewportHeight="1024"> 6 | 7 | <path 8 | android:fillColor="#FF000000" 9 | android:pathData="M181.333333 384a32 32 0 0 1-64 0v-111.146667a155.52 155.52 0 0 1 155.52-155.52H384a32 32 0 0 1 0 64h-111.146667a91.52 91.52 0 0 0-91.52 91.52V384zM640 181.333333a32 32 0 0 1 0-64h111.146667a155.52 155.52 0 0 1 155.52 155.52V384a32 32 0 0 1-64 0v-111.146667a91.52 91.52 0 0 0-91.52-91.52H640zM842.666667 640a32 32 0 0 1 64 0v111.146667a155.52 155.52 0 0 1-155.52 155.52H640a32 32 0 0 1 0-64h111.146667a91.52 91.52 0 0 0 91.52-91.52V640zM384 842.666667a32 32 0 0 1 0 64h-111.146667a155.52 155.52 0 0 1-155.52-155.52V640a32 32 0 0 1 64 0v111.146667a91.52 91.52 0 0 0 91.52 91.52H384z m-192-298.666667a32 32 0 0 1 0-64h640a32 32 0 0 1 0 64H192z" /> 10 | </vector> -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable/ic_select_all_24dp.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8" standalone="no"?> 2 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 3 | android:width="24dp" 4 | android:height="24dp" 5 | android:viewportWidth="24.0" 6 | android:viewportHeight="24.0"> 7 | <path 8 | android:fillColor="#000000" 9 | android:pathData="M3,5h2L5,3c-1.1,0 -2,0.9 -2,2zM3,13h2v-2L3,11v2zM7,21h2v-2L7,19v2zM3,9h2L5,7L3,7v2zM13,3h-2v2h2L13,3zM19,3v2h2c0,-1.1 -0.9,-2 -2,-2zM5,21v-2L3,19c0,1.1 0.9,2 2,2zM3,17h2v-2L3,15v2zM9,3L7,3v2h2L9,3zM11,21h2v-2h-2v2zM19,13h2v-2h-2v2zM19,21c1.1,0 2,-0.9 2,-2h-2v2zM19,9h2L21,7h-2v2zM19,17h2v-2h-2v2zM15,21h2v-2h-2v2zM15,5h2L17,3h-2v2zM7,17h10L17,7L7,7v10zM9,9h6v6L9,15L9,9z" /> 10 | </vector> 11 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable/ic_settings_24dp.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:viewportWidth="1024" 5 | android:viewportHeight="1024"> 6 | <path 7 | android:fillColor="#000000" 8 | android:pathData="M924.8,625.7l-65.5,-56c3.1,-19 4.7,-38.4 4.7,-57.8s-1.6,-38.8 -4.7,-57.8l65.5,-56c10.1,-8.6 13.8,-22.6 9.3,-35.2l-0.9,-2.6c-18.1,-50.5 -44.9,-96.9 -79.7,-137.9l-1.8,-2.1c-8.6,-10.1 -22.5,-13.9 -35.1,-9.5l-81.3,28.9c-30,-24.6 -63.5,-44 -99.7,-57.6l-15.7,-85c-2.4,-13.1 -12.7,-23.3 -25.8,-25.7l-2.7,-0.5c-52.1,-9.4 -106.9,-9.4 -159,0l-2.7,0.5c-13.1,2.4 -23.4,12.6 -25.8,25.7l-15.8,85.4c-35.9,13.6 -69.2,32.9 -99,57.4l-81.9,-29.1c-12.5,-4.4 -26.5,-0.7 -35.1,9.5l-1.8,2.1c-34.8,41.1 -61.6,87.5 -79.7,137.9l-0.9,2.6c-4.5,12.5 -0.8,26.5 9.3,35.2l66.3,56.6c-3.1,18.8 -4.6,38 -4.6,57.1 0,19.2 1.5,38.4 4.6,57.1L99,625.5c-10.1,8.6 -13.8,22.6 -9.3,35.2l0.9,2.6c18.1,50.4 44.9,96.9 79.7,137.9l1.8,2.1c8.6,10.1 22.5,13.9 35.1,9.5l81.9,-29.1c29.8,24.5 63.1,43.9 99,57.4l15.8,85.4c2.4,13.1 12.7,23.3 25.8,25.7l2.7,0.5c26.1,4.7 52.8,7.1 79.5,7.1 26.7,0 53.5,-2.4 79.5,-7.1l2.7,-0.5c13.1,-2.4 23.4,-12.6 25.8,-25.7l15.7,-85c36.2,-13.6 69.7,-32.9 99.7,-57.6l81.3,28.9c12.5,4.4 26.5,0.7 35.1,-9.5l1.8,-2.1c34.8,-41.1 61.6,-87.5 79.7,-137.9l0.9,-2.6c4.5,-12.3 0.8,-26.3 -9.3,-35zM788.3,465.9c2.5,15.1 3.8,30.6 3.8,46.1s-1.3,31 -3.8,46.1l-6.6,40.1 74.7,63.9c-11.3,26.1 -25.6,50.7 -42.6,73.6L721,702.8l-31.4,25.8c-23.9,19.6 -50.5,35 -79.3,45.8l-38.1,14.3 -17.9,97c-28.1,3.2 -56.8,3.2 -85,0l-17.9,-97.2 -37.8,-14.5c-28.5,-10.8 -55,-26.2 -78.7,-45.7l-31.4,-25.9 -93.4,33.2c-17,-22.9 -31.2,-47.6 -42.6,-73.6l75.5,-64.5 -6.5,-40c-2.4,-14.9 -3.7,-30.3 -3.7,-45.5 0,-15.3 1.2,-30.6 3.7,-45.5l6.5,-40 -75.5,-64.5c11.3,-26.1 25.6,-50.7 42.6,-73.6l93.4,33.2 31.4,-25.9c23.7,-19.5 50.2,-34.9 78.7,-45.7l37.9,-14.3 17.9,-97.2c28.1,-3.2 56.8,-3.2 85,0l17.9,97 38.1,14.3c28.7,10.8 55.4,26.2 79.3,45.8l31.4,25.8 92.8,-32.9c17,22.9 31.2,47.6 42.6,73.6L781.8,426l6.5,39.9z" /> 9 | <path 10 | android:fillColor="#000000" 11 | android:pathData="M512,326c-97.2,0 -176,78.8 -176,176s78.8,176 176,176 176,-78.8 176,-176 -78.8,-176 -176,-176zM591.2,581.2C570,602.3 541.9,614 512,614c-29.9,0 -58,-11.7 -79.2,-32.8C411.7,560 400,531.9 400,502c0,-29.9 11.7,-58 32.8,-79.2C454,401.6 482.1,390 512,390c29.9,0 58,11.6 79.2,32.8C612.3,444 624,472.1 624,502c0,29.9 -11.7,58 -32.8,79.2z" /> 12 | </vector> 13 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable/ic_share_24dp.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:viewportWidth="24.0" 5 | android:viewportHeight="24.0"> 6 | <path 7 | android:fillColor="#FF000000" 8 | android:pathData="M18,16.08c-0.76,0 -1.44,0.3 -1.96,0.77L8.91,12.7c0.05,-0.23 0.09,-0.46 0.09,-0.7s-0.04,-0.47 -0.09,-0.7l7.05,-4.11c0.54,0.5 1.25,0.81 2.04,0.81 1.66,0 3,-1.34 3,-3s-1.34,-3 -3,-3 -3,1.34 -3,3c0,0.24 0.04,0.47 0.09,0.7L8.04,9.81C7.5,9.31 6.79,9 6,9c-1.66,0 -3,1.34 -3,3s1.34,3 3,3c0.79,0 1.5,-0.31 2.04,-0.81l7.12,4.16c-0.05,0.21 -0.08,0.43 -0.08,0.65 0,1.61 1.31,2.92 2.92,2.92 1.61,0 2.92,-1.31 2.92,-2.92s-1.31,-2.92 -2.92,-2.92z" /> 9 | </vector> 10 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable/ic_source_code_24dp.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:viewportWidth="1024" 5 | android:viewportHeight="1024"> 6 | <path 7 | android:fillColor="#FF000000" 8 | android:pathData="M469.2,802.1l-81.7,-24.6L554.8,221.9l81.7,24.6L469.2,802.1zM362.7,654.5l-124.7,-141.7 124.8,-143.5 -64.4,-56 -173.8,199.8 174,197.7 64.1,-56.3zM899.4,513.1l-173.8,-199.8 -64.4,56 124.8,143.5 -124.7,141.7 64.1,56.4 174,-197.7z" /> 9 | </vector> 10 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable/ic_stop_24dp.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:viewportWidth="1024" 5 | android:viewportHeight="1024"> 6 | <path 7 | android:fillColor="#FFFFFFFF" 8 | android:pathData="M256 192h512c35.392 0 64 28.608 64 64v512c0 35.392-28.608 64-64 64H256c-35.392 0-64-28.608-64-64V256c0-35.392 28.608-64 64-64z" /> 9 | </vector> 10 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable/ic_subscriptions_24dp.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:viewportWidth="1024" 5 | android:viewportHeight="1024"> 6 | <path 7 | android:fillColor="#FF000000" 8 | android:pathData="M170.6,256h682.7v85.3L170.6,341.3L170.6,256zM256,85.3h512v85.4L256,170.7L256,85.3zM853.3,426.7L170.6,426.7c-46.9,0 -85.3,38.4 -85.3,85.3v341.3c0,47 38.4,85.4 85.3,85.4h682.7c46.9,0 85.3,-38.4 85.3,-85.4L938.6,512c0,-46.9 -38.4,-85.3 -85.3,-85.3zM853.3,853.3L170.6,853.3L170.6,512h682.7v341.3z" /> 9 | </vector> 10 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable/ic_telegram_24dp.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:viewportWidth="1024" 5 | android:viewportHeight="1024"> 6 | <path 7 | android:fillColor="#FF000000" 8 | android:pathData="M912.2,154A85.3,85.3 0,0 0,853.3 128a85.3,85.3 0,0 0,-33.3 6.8l-708.3,306.8a42.7,42.7 0,0 0,-26.5 42.7V512a42.7,42.7 0,0 0,29.4 42.7L298.7,616.1l55.5,187.3a75.9,75.9 0,0 0,56.3 53.3,62.7 62.7,0 0,0 15.4,0 73.8,73.8 0,0 0,50.8 -20.5l67.8,-64 131.4,103.7a85.3,85.3 0,0 0,90 9.4l14.1,-7.3a88.3,88.3 0,0 0,46.5 -62.7L938.7,235.1a90,90 0,0 0,-26.5 -81.1zM763.7,805.1a25.2,25.2 0,0 1,-12.8 17.5l-14.1,7.3a19.6,19.6 0,0 1,-9 2.1,19.6 19.6,0 0,1 -12.4,-4.7l-160.4,-128a20.9,20.9 0,0 0,-27.7 0l-94.7,89.2a11.1,11.1 0,0 1,-6 2.1V640a21.8,21.8 0,0 1,6.8 -15.8c136.1,-128 217.6,-199.7 266.2,-240.6a15.8,15.8 0,0 0,5.1 -11.1,13.7 13.7,0 0,0 -4.3,-11.1 14.9,14.9 0,0 0,-17.9 -4.3l-322.6,203.5a21.3,21.3 0,0 1,-18.3 0L149.3,494.9l694.2,-301.2a16.6,16.6 0,0 1,7.7 0,22.2 22.2,0 0,1 16.2,7.7 26.9,26.9 0,0 1,6.8 23.5z" /> 9 | </vector> 10 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable/license_24px.xml: -------------------------------------------------------------------------------- 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 | android:width="24dp" 3 | android:height="24dp" 4 | android:tint="?attr/colorControlNormal" 5 | android:viewportWidth="960" 6 | android:viewportHeight="960"> 7 | <path 8 | android:fillColor="@android:color/white" 9 | android:pathData="M480,520Q430,520 395,485Q360,450 360,400Q360,350 395,315Q430,280 480,280Q530,280 565,315Q600,350 600,400Q600,450 565,485Q530,520 480,520ZM240,920L240,611Q202,569 181,515Q160,461 160,400Q160,266 253,173Q346,80 480,80Q614,80 707,173Q800,266 800,400Q800,461 779,515Q758,569 720,611L720,920L480,840L240,920ZM480,640Q580,640 650,570Q720,500 720,400Q720,300 650,230Q580,160 480,160Q380,160 310,230Q240,300 240,400Q240,500 310,570Q380,640 480,640ZM320,801L480,760L640,801L640,677Q605,697 564.5,708.5Q524,720 480,720Q436,720 395.5,708.5Q355,697 320,677L320,801ZM480,739L480,739Q480,739 480,739Q480,739 480,739Q480,739 480,739Q480,739 480,739L480,739L480,739Z" /> 10 | </vector> 11 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/drawable/nav_header_bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/2dust/v2rayNG/680832614bd4ff9952d2009b9edeb2dd891ec2f7/V2rayNG/app/src/main/res/drawable/nav_header_bg.png -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/font/montserrat_thin.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/2dust/v2rayNG/680832614bd4ff9952d2009b9edeb2dd891ec2f7/V2rayNG/app/src/main/res/font/montserrat_thin.ttf -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/layout/activity_logcat.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 | xmlns:app="http://schemas.android.com/apk/res-auto" 4 | xmlns:tools="http://schemas.android.com/tools" 5 | android:layout_width="match_parent" 6 | android:layout_height="match_parent" 7 | android:fitsSystemWindows="true" 8 | tools:context=".ui.LogcatActivity"> 9 | 10 | <androidx.swiperefreshlayout.widget.SwipeRefreshLayout 11 | android:id="@+id/refreshLayout" 12 | android:layout_width="match_parent" 13 | android:layout_height="match_parent"> 14 | 15 | <androidx.recyclerview.widget.RecyclerView 16 | android:id="@+id/recycler_view" 17 | android:layout_width="match_parent" 18 | android:layout_height="match_parent" 19 | android:scrollbars="vertical" 20 | app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" /> 21 | 22 | </androidx.swiperefreshlayout.widget.SwipeRefreshLayout> 23 | 24 | </RelativeLayout> 25 | 26 | 27 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/layout/activity_none.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 | android:layout_width="match_parent" 4 | android:layout_height="match_parent"></RelativeLayout> 5 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/layout/activity_server_shadowsocks.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 3 | xmlns:tools="http://schemas.android.com/tools" 4 | android:layout_width="match_parent" 5 | android:layout_height="match_parent" 6 | android:fitsSystemWindows="true" 7 | tools:context=".ui.ServerActivity"> 8 | 9 | <LinearLayout 10 | android:layout_width="match_parent" 11 | android:layout_height="wrap_content" 12 | android:orientation="vertical" 13 | android:padding="@dimen/padding_spacing_dp16"> 14 | 15 | <include layout="@layout/layout_address_port" /> 16 | 17 | <LinearLayout 18 | android:layout_width="match_parent" 19 | android:layout_height="wrap_content" 20 | android:layout_marginTop="@dimen/padding_spacing_dp16" 21 | android:orientation="vertical"> 22 | 23 | <TextView 24 | android:layout_width="wrap_content" 25 | android:layout_height="wrap_content" 26 | android:text="@string/server_lab_id3" /> 27 | 28 | <EditText 29 | android:id="@+id/et_id" 30 | android:layout_width="match_parent" 31 | android:layout_height="wrap_content" 32 | android:inputType="text" /> 33 | 34 | </LinearLayout> 35 | 36 | 37 | <LinearLayout 38 | android:layout_width="match_parent" 39 | android:layout_height="wrap_content" 40 | android:layout_marginTop="@dimen/padding_spacing_dp16" 41 | android:orientation="vertical"> 42 | 43 | <TextView 44 | android:layout_width="wrap_content" 45 | android:layout_height="wrap_content" 46 | android:text="@string/server_lab_security3" /> 47 | 48 | <Spinner 49 | android:id="@+id/sp_security" 50 | android:layout_width="match_parent" 51 | android:layout_height="wrap_content" 52 | android:layout_marginTop="@dimen/padding_spacing_dp8" 53 | android:layout_marginBottom="@dimen/padding_spacing_dp8" 54 | android:entries="@array/ss_securitys" /> 55 | </LinearLayout> 56 | 57 | <include layout="@layout/layout_transport" /> 58 | 59 | <include layout="@layout/layout_tls" /> 60 | 61 | <LinearLayout 62 | android:layout_width="match_parent" 63 | android:layout_height="wrap_content" 64 | android:layout_marginTop="@dimen/padding_spacing_dp16" 65 | android:layout_marginBottom="@dimen/padding_spacing_dp16" 66 | android:orientation="vertical" /> 67 | 68 | </LinearLayout> 69 | </ScrollView> 70 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/layout/activity_server_socks.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 3 | xmlns:tools="http://schemas.android.com/tools" 4 | android:layout_width="match_parent" 5 | android:layout_height="match_parent" 6 | android:fitsSystemWindows="true" 7 | tools:context=".ui.ServerActivity"> 8 | 9 | <LinearLayout 10 | android:layout_width="match_parent" 11 | android:layout_height="wrap_content" 12 | android:orientation="vertical" 13 | android:padding="@dimen/padding_spacing_dp16"> 14 | 15 | <include layout="@layout/layout_address_port" /> 16 | 17 | <LinearLayout 18 | android:layout_width="match_parent" 19 | android:layout_height="wrap_content" 20 | android:layout_marginTop="@dimen/padding_spacing_dp16" 21 | android:orientation="vertical"> 22 | 23 | <TextView 24 | android:layout_width="wrap_content" 25 | android:layout_height="wrap_content" 26 | android:text="@string/server_lab_security4" /> 27 | 28 | 29 | <EditText 30 | android:id="@+id/et_security" 31 | android:layout_width="match_parent" 32 | android:layout_height="wrap_content" 33 | android:inputType="text" /> 34 | 35 | </LinearLayout> 36 | 37 | <LinearLayout 38 | android:layout_width="match_parent" 39 | android:layout_height="wrap_content" 40 | android:layout_marginTop="@dimen/padding_spacing_dp16" 41 | android:orientation="vertical"> 42 | 43 | <TextView 44 | android:layout_width="wrap_content" 45 | android:layout_height="wrap_content" 46 | android:text="@string/server_lab_id4" /> 47 | 48 | <EditText 49 | android:id="@+id/et_id" 50 | android:layout_width="match_parent" 51 | android:layout_height="wrap_content" 52 | android:inputType="text" /> 53 | 54 | </LinearLayout> 55 | 56 | <LinearLayout 57 | android:layout_width="match_parent" 58 | android:layout_height="wrap_content" 59 | android:layout_marginTop="@dimen/padding_spacing_dp16" 60 | android:layout_marginBottom="@dimen/padding_spacing_dp16" 61 | android:orientation="vertical" /> 62 | 63 | </LinearLayout> 64 | </ScrollView> -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/layout/activity_server_trojan.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 3 | xmlns:tools="http://schemas.android.com/tools" 4 | android:layout_width="match_parent" 5 | android:layout_height="match_parent" 6 | android:fitsSystemWindows="true" 7 | tools:context=".ui.ServerActivity"> 8 | 9 | <LinearLayout 10 | android:layout_width="match_parent" 11 | android:layout_height="wrap_content" 12 | android:orientation="vertical" 13 | android:padding="@dimen/padding_spacing_dp16"> 14 | 15 | <include layout="@layout/layout_address_port" /> 16 | 17 | <LinearLayout 18 | android:layout_width="match_parent" 19 | android:layout_height="wrap_content" 20 | android:layout_marginTop="@dimen/padding_spacing_dp16" 21 | android:orientation="vertical"> 22 | 23 | <TextView 24 | android:layout_width="wrap_content" 25 | android:layout_height="wrap_content" 26 | android:text="@string/server_lab_id3" /> 27 | 28 | <EditText 29 | android:id="@+id/et_id" 30 | android:layout_width="match_parent" 31 | android:layout_height="wrap_content" 32 | android:inputType="text" /> 33 | 34 | </LinearLayout> 35 | 36 | <include layout="@layout/layout_transport" /> 37 | 38 | <include layout="@layout/layout_tls" /> 39 | 40 | <LinearLayout 41 | android:layout_width="match_parent" 42 | android:layout_height="wrap_content" 43 | android:layout_marginTop="@dimen/padding_spacing_dp16" 44 | android:layout_marginBottom="@dimen/padding_spacing_dp16" 45 | android:orientation="vertical" /> 46 | 47 | </LinearLayout> 48 | </ScrollView> -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/layout/activity_server_vmess.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 3 | xmlns:tools="http://schemas.android.com/tools" 4 | android:layout_width="match_parent" 5 | android:layout_height="match_parent" 6 | android:fitsSystemWindows="true" 7 | tools:context=".ui.ServerActivity"> 8 | 9 | <LinearLayout 10 | android:layout_width="match_parent" 11 | android:layout_height="wrap_content" 12 | android:orientation="vertical" 13 | android:padding="@dimen/padding_spacing_dp16"> 14 | 15 | <include layout="@layout/layout_address_port" /> 16 | 17 | <LinearLayout 18 | android:layout_width="match_parent" 19 | android:layout_height="wrap_content" 20 | android:layout_marginTop="@dimen/padding_spacing_dp16" 21 | android:orientation="vertical"> 22 | 23 | <TextView 24 | android:layout_width="wrap_content" 25 | android:layout_height="wrap_content" 26 | android:text="@string/server_lab_id" /> 27 | 28 | <EditText 29 | android:id="@+id/et_id" 30 | android:layout_width="match_parent" 31 | android:layout_height="wrap_content" 32 | android:inputType="text" /> 33 | 34 | </LinearLayout> 35 | 36 | <LinearLayout 37 | android:layout_width="match_parent" 38 | android:layout_height="wrap_content" 39 | android:layout_marginTop="@dimen/padding_spacing_dp16" 40 | android:orientation="vertical"> 41 | 42 | <TextView 43 | android:layout_width="wrap_content" 44 | android:layout_height="wrap_content" 45 | android:text="@string/server_lab_security" /> 46 | 47 | <Spinner 48 | android:id="@+id/sp_security" 49 | android:layout_width="match_parent" 50 | android:layout_height="wrap_content" 51 | android:layout_marginTop="@dimen/padding_spacing_dp8" 52 | android:layout_marginBottom="@dimen/padding_spacing_dp8" 53 | android:entries="@array/securitys" /> 54 | </LinearLayout> 55 | 56 | <include layout="@layout/layout_transport" /> 57 | 58 | <include layout="@layout/layout_tls" /> 59 | 60 | <LinearLayout 61 | android:layout_width="match_parent" 62 | android:layout_height="wrap_content" 63 | android:layout_marginTop="@dimen/padding_spacing_dp16" 64 | android:layout_marginBottom="@dimen/padding_spacing_dp16" 65 | android:orientation="vertical" /> 66 | 67 | </LinearLayout> 68 | </ScrollView> 69 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/layout/activity_settings.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 | xmlns:tools="http://schemas.android.com/tools" 4 | android:layout_width="match_parent" 5 | android:layout_height="match_parent" 6 | android:fitsSystemWindows="true" 7 | android:orientation="vertical" 8 | tools:context=".ui.SettingsActivity"> 9 | 10 | <androidx.fragment.app.FragmentContainerView 11 | android:id="@+id/fragment_settings" 12 | android:name="com.v2ray.ang.ui.SettingsActivity$SettingsFragment" 13 | android:layout_width="match_parent" 14 | android:layout_height="match_parent" /> 15 | 16 | </LinearLayout> -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/layout/activity_sub_setting.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 | xmlns:app="http://schemas.android.com/apk/res-auto" 4 | xmlns:tools="http://schemas.android.com/tools" 5 | android:layout_width="match_parent" 6 | android:layout_height="match_parent" 7 | android:fitsSystemWindows="true" 8 | tools:context=".ui.SubSettingActivity"> 9 | 10 | <com.google.android.material.progressindicator.LinearProgressIndicator 11 | android:id="@+id/pb_waiting" 12 | android:layout_width="match_parent" 13 | android:layout_height="wrap_content" 14 | android:indeterminate="true" 15 | android:visibility="invisible" 16 | app:indicatorColor="@color/color_fab_active" /> 17 | 18 | <androidx.recyclerview.widget.RecyclerView 19 | android:id="@+id/recycler_view" 20 | android:layout_width="match_parent" 21 | android:layout_height="match_parent" 22 | tools:listitem="@layout/item_recycler_sub_setting" /> 23 | 24 | 25 | </RelativeLayout> -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/layout/activity_tasker.xml: -------------------------------------------------------------------------------- 1 | <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 | xmlns:app="http://schemas.android.com/apk/res-auto" 3 | xmlns:tools="http://schemas.android.com/tools" 4 | android:layout_width="match_parent" 5 | android:layout_height="match_parent" 6 | android:fitsSystemWindows="true" 7 | android:orientation="vertical" 8 | android:padding="@dimen/padding_spacing_dp16" 9 | tools:context=".ui.TaskerActivity"> 10 | 11 | <RelativeLayout 12 | android:layout_width="match_parent" 13 | android:layout_height="wrap_content" 14 | android:padding="@dimen/padding_spacing_dp8"> 15 | 16 | <androidx.appcompat.widget.SwitchCompat 17 | android:id="@+id/switch_start_service" 18 | android:layout_width="wrap_content" 19 | android:layout_height="wrap_content" 20 | android:layout_alignParentEnd="true" 21 | android:layout_centerVertical="true" 22 | android:checked="true" 23 | app:theme="@style/BrandedSwitch" /> 24 | 25 | <androidx.appcompat.widget.AppCompatTextView 26 | android:layout_width="wrap_content" 27 | android:layout_height="wrap_content" 28 | android:layout_alignParentStart="true" 29 | android:layout_centerVertical="true" 30 | android:layout_toStartOf="@id/switch_start_service" 31 | android:text="@string/tasker_start_service" 32 | android:textAppearance="@style/TextAppearance.AppCompat.Medium" /> 33 | 34 | </RelativeLayout> 35 | 36 | <LinearLayout 37 | android:layout_width="match_parent" 38 | android:layout_height="0dp" 39 | android:layout_weight="1" 40 | android:orientation="vertical"> 41 | 42 | <ListView 43 | android:id="@+id/listview" 44 | android:layout_width="match_parent" 45 | android:layout_height="match_parent" 46 | android:choiceMode="singleChoice" /> 47 | </LinearLayout> 48 | 49 | </LinearLayout> -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/layout/dialog_config_filter.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 3 | android:layout_width="match_parent" 4 | android:layout_height="match_parent"> 5 | 6 | <LinearLayout 7 | android:layout_width="match_parent" 8 | android:layout_height="wrap_content" 9 | android:orientation="vertical" 10 | android:padding="@dimen/padding_spacing_dp16"> 11 | 12 | <LinearLayout 13 | android:layout_width="match_parent" 14 | android:layout_height="wrap_content" 15 | android:layout_marginTop="@dimen/padding_spacing_dp16" 16 | android:orientation="vertical"> 17 | 18 | <Spinner 19 | android:id="@+id/sp_subscriptionId" 20 | android:layout_width="match_parent" 21 | android:layout_height="wrap_content" 22 | android:layout_marginTop="@dimen/padding_spacing_dp8" 23 | android:layout_marginBottom="@dimen/padding_spacing_dp8" /> 24 | </LinearLayout> 25 | 26 | 27 | <LinearLayout 28 | android:layout_width="match_parent" 29 | android:layout_height="wrap_content" 30 | android:layout_marginTop="@dimen/padding_spacing_dp16" 31 | android:orientation="vertical"> 32 | 33 | <TextView 34 | android:layout_width="wrap_content" 35 | android:layout_height="wrap_content" 36 | android:text="@string/server_lab_remarks" /> 37 | 38 | <EditText 39 | android:id="@+id/et_keyword" 40 | android:layout_width="match_parent" 41 | android:layout_height="wrap_content" 42 | android:inputType="text" /> 43 | </LinearLayout> 44 | 45 | </LinearLayout> 46 | </ScrollView> 47 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/layout/item_qrcode.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 | xmlns:app="http://schemas.android.com/apk/res-auto" 4 | android:layout_width="match_parent" 5 | android:layout_height="match_parent" 6 | android:layout_gravity="center" 7 | android:gravity="center" 8 | android:orientation="horizontal"> 9 | 10 | <ImageView 11 | android:id="@+id/iv_qcode" 12 | android:layout_width="336dp" 13 | android:layout_height="336dp" 14 | android:scaleType="fitXY" 15 | app:srcCompat="@drawable/ic_fab_check" /> 16 | </LinearLayout> 17 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/layout/item_recycler_bypass_list.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 | android:layout_width="match_parent" 4 | android:layout_height="wrap_content" 5 | android:background="?attr/selectableItemBackground" 6 | android:clickable="true" 7 | android:focusable="true" 8 | android:gravity="center_vertical" 9 | android:padding="@dimen/padding_spacing_dp8"> 10 | 11 | <androidx.appcompat.widget.AppCompatImageView 12 | android:id="@+id/icon" 13 | android:layout_width="@dimen/view_height_dp48" 14 | android:layout_height="@dimen/view_height_dp48" 15 | android:padding="@dimen/padding_spacing_dp8" /> 16 | 17 | <LinearLayout 18 | android:layout_width="0dp" 19 | android:layout_height="wrap_content" 20 | android:layout_weight="1.0" 21 | android:gravity="center" 22 | android:orientation="vertical"> 23 | 24 | <androidx.appcompat.widget.AppCompatTextView 25 | android:id="@+id/name" 26 | android:layout_width="match_parent" 27 | android:layout_height="wrap_content" 28 | android:maxLines="1" 29 | android:textAppearance="@style/TextAppearance.AppCompat.Subhead" /> 30 | 31 | <androidx.appcompat.widget.AppCompatTextView 32 | android:id="@+id/package_name" 33 | android:layout_width="match_parent" 34 | android:layout_height="wrap_content" 35 | android:maxLines="3" 36 | android:paddingTop="@dimen/padding_spacing_dp8" 37 | android:textAppearance="@style/TextAppearance.AppCompat.Small" /> 38 | </LinearLayout> 39 | 40 | <androidx.appcompat.widget.AppCompatCheckBox 41 | android:id="@+id/check_box" 42 | android:layout_width="wrap_content" 43 | android:layout_height="wrap_content" 44 | android:clickable="false" 45 | android:focusable="false" 46 | android:padding="@dimen/padding_spacing_dp8" /> 47 | 48 | </LinearLayout> -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/layout/item_recycler_footer.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 | android:id="@+id/item_bg" 4 | android:layout_width="match_parent" 5 | android:layout_height="wrap_content" 6 | android:gravity="center_vertical"> 7 | 8 | <LinearLayout 9 | android:id="@+id/layout_edit" 10 | android:layout_width="match_parent" 11 | android:layout_height="wrap_content" 12 | android:layout_gravity="center" 13 | android:gravity="center" 14 | android:orientation="horizontal" 15 | android:padding="@dimen/padding_spacing_dp16" 16 | android:visibility="invisible"> 17 | 18 | <LinearLayout 19 | android:layout_width="match_parent" 20 | android:layout_height="match_parent" 21 | android:gravity="center|left" 22 | android:orientation="vertical"> 23 | 24 | <TextView 25 | android:layout_width="wrap_content" 26 | android:layout_height="wrap_content" 27 | android:text="@string/summary_pref_promotion" 28 | android:textAppearance="@style/TextAppearance.AppCompat.Tooltip" 29 | android:textColor="@color/color_secondary" /> 30 | </LinearLayout> 31 | </LinearLayout> 32 | </LinearLayout> -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/layout/item_recycler_logcat.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 | android:layout_width="match_parent" 4 | android:layout_height="wrap_content" 5 | android:background="?attr/selectableItemBackground" 6 | android:clickable="true" 7 | android:focusable="true" 8 | android:gravity="center_vertical" 9 | android:orientation="vertical"> 10 | 11 | <LinearLayout 12 | android:layout_width="match_parent" 13 | android:layout_height="wrap_content" 14 | android:orientation="vertical" 15 | android:padding="@dimen/padding_spacing_dp8"> 16 | 17 | <androidx.appcompat.widget.AppCompatTextView 18 | android:id="@+id/log_tag" 19 | android:layout_width="match_parent" 20 | android:layout_height="wrap_content" 21 | android:textAppearance="@style/TextAppearance.AppCompat.Small" /> 22 | 23 | <androidx.appcompat.widget.AppCompatTextView 24 | android:id="@+id/log_content" 25 | android:layout_width="match_parent" 26 | android:layout_height="wrap_content" 27 | android:paddingTop="@dimen/padding_spacing_dp8" 28 | android:textAppearance="@style/TextAppearance.AppCompat.Small" /> 29 | 30 | </LinearLayout> 31 | 32 | </LinearLayout> -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/layout/layout_address_port.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 | android:layout_width="match_parent" 4 | android:layout_height="wrap_content" 5 | android:orientation="vertical"> 6 | 7 | <LinearLayout 8 | android:layout_width="match_parent" 9 | android:layout_height="wrap_content" 10 | android:orientation="vertical"> 11 | 12 | <TextView 13 | android:layout_width="wrap_content" 14 | android:layout_height="wrap_content" 15 | android:text="@string/title_server" 16 | android:textAppearance="@style/TextAppearance.AppCompat.Subhead" /> 17 | </LinearLayout> 18 | 19 | <LinearLayout 20 | android:layout_width="match_parent" 21 | android:layout_height="wrap_content" 22 | android:layout_marginTop="@dimen/padding_spacing_dp16" 23 | android:orientation="vertical"> 24 | 25 | <TextView 26 | android:layout_width="wrap_content" 27 | android:layout_height="wrap_content" 28 | android:text="@string/server_lab_remarks" /> 29 | 30 | <EditText 31 | android:id="@+id/et_remarks" 32 | android:layout_width="match_parent" 33 | android:layout_height="wrap_content" 34 | android:inputType="text" /> 35 | 36 | </LinearLayout> 37 | 38 | <LinearLayout 39 | android:layout_width="match_parent" 40 | android:layout_height="wrap_content" 41 | android:layout_marginTop="@dimen/padding_spacing_dp16" 42 | android:orientation="vertical"> 43 | 44 | <TextView 45 | android:layout_width="match_parent" 46 | android:layout_height="wrap_content" 47 | android:text="@string/server_lab_address3" /> 48 | 49 | <EditText 50 | android:id="@+id/et_address" 51 | android:layout_width="match_parent" 52 | android:layout_height="wrap_content" 53 | android:inputType="text" /> 54 | 55 | </LinearLayout> 56 | 57 | <LinearLayout 58 | android:layout_width="match_parent" 59 | android:layout_height="wrap_content" 60 | android:layout_marginTop="@dimen/padding_spacing_dp16" 61 | android:orientation="vertical"> 62 | 63 | <TextView 64 | android:layout_width="wrap_content" 65 | android:layout_height="wrap_content" 66 | android:text="@string/server_lab_port3" /> 67 | 68 | <EditText 69 | android:id="@+id/et_port" 70 | android:layout_width="match_parent" 71 | android:layout_height="wrap_content" 72 | android:inputType="number" /> 73 | </LinearLayout> 74 | 75 | </LinearLayout> -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/layout/nav_header.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 | android:layout_width="match_parent" 4 | android:layout_height="@dimen/view_height_dp160" 5 | android:background="@drawable/nav_header_bg" 6 | android:gravity="center" 7 | android:orientation="vertical" 8 | android:padding="@dimen/padding_spacing_dp16"> 9 | 10 | <TextView 11 | android:layout_width="match_parent" 12 | android:layout_height="wrap_content" 13 | android:layout_gravity="center" 14 | android:fontFamily="@font/montserrat_thin" 15 | android:gravity="center" 16 | android:paddingTop="@dimen/padding_spacing_dp8" 17 | android:text="@string/app_name" 18 | android:textAppearance="@style/TextAppearance.AppCompat.Display1" /> 19 | 20 | 21 | </LinearLayout> 22 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/layout/preference_with_help_link.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <Button xmlns:android="http://schemas.android.com/apk/res/android" 3 | xmlns:tools="http://schemas.android.com/tools" 4 | style="@style/Widget.AppCompat.Button.Borderless" 5 | android:layout_width="match_parent" 6 | android:layout_height="match_parent" 7 | android:onClick="onModeHelpClicked" 8 | android:text="@string/title_mode_help" 9 | android:textAlignment="textStart" 10 | android:textStyle="italic" 11 | tools:ignore="UsingOnClickInXml" /> 12 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/layout/widget_switch.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 | xmlns:app="http://schemas.android.com/apk/res-auto" 4 | android:id="@+id/layout_switch" 5 | android:layout_width="wrap_content" 6 | android:layout_height="wrap_content" 7 | android:layout_gravity="center" 8 | android:gravity="center" 9 | android:orientation="vertical"> 10 | 11 | <LinearLayout 12 | android:id="@+id/layout_background" 13 | android:layout_width="wrap_content" 14 | android:layout_height="wrap_content" 15 | android:layout_gravity="center"> 16 | 17 | <ImageView 18 | android:id="@+id/image_switch" 19 | android:layout_width="45dp" 20 | android:layout_height="45dp" 21 | android:padding="@dimen/padding_spacing_dp16" 22 | app:srcCompat="@drawable/ic_stat_name" /> 23 | </LinearLayout> 24 | 25 | <TextView 26 | android:layout_width="wrap_content" 27 | android:layout_height="wrap_content" 28 | android:text="@string/app_name" 29 | android:textAppearance="@style/TextAppearance.AppCompat.Small" 30 | android:textColor="@android:color/white" /> 31 | </LinearLayout> 32 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/menu/action_server.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <menu xmlns:android="http://schemas.android.com/apk/res/android" 3 | xmlns:app="http://schemas.android.com/apk/res-auto"> 4 | <item 5 | android:id="@+id/del_config" 6 | android:icon="@drawable/ic_delete_24dp" 7 | android:title="@string/menu_item_del_config" 8 | app:showAsAction="ifRoom" /> 9 | <item 10 | android:id="@+id/save_config" 11 | android:icon="@drawable/ic_action_done" 12 | android:title="@string/menu_item_save_config" 13 | app:showAsAction="ifRoom" /> 14 | </menu> -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/menu/action_sub_setting.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <menu xmlns:android="http://schemas.android.com/apk/res/android" 3 | xmlns:app="http://schemas.android.com/apk/res-auto"> 4 | <item 5 | android:id="@+id/add_config" 6 | android:icon="@drawable/ic_add_24dp" 7 | android:title="@string/menu_item_add_config" 8 | app:showAsAction="ifRoom" /> 9 | <item 10 | android:id="@+id/sub_update" 11 | android:icon="@drawable/ic_restore_24dp" 12 | android:title="@string/title_sub_update" 13 | app:showAsAction="ifRoom" /> 14 | </menu> -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/menu/menu_asset.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <menu xmlns:android="http://schemas.android.com/apk/res/android" 3 | xmlns:app="http://schemas.android.com/apk/res-auto"> 4 | <item 5 | android:icon="@drawable/ic_add_24dp" 6 | android:title="@string/menu_item_add_asset" 7 | app:showAsAction="ifRoom"> 8 | <menu> 9 | <item 10 | android:id="@+id/add_file" 11 | android:title="@string/menu_item_add_file" 12 | app:showAsAction="never" /> 13 | <item 14 | android:id="@+id/add_url" 15 | android:title="@string/menu_item_add_url" 16 | app:showAsAction="never" /> 17 | <item 18 | android:id="@+id/add_qrcode" 19 | android:title="@string/menu_item_scan_qrcode" 20 | app:showAsAction="never" /> 21 | </menu> 22 | </item> 23 | <item 24 | android:id="@+id/download_file" 25 | android:icon="@drawable/ic_cloud_download_24dp" 26 | android:title="@string/menu_item_download_file" 27 | app:showAsAction="ifRoom" /> 28 | </menu> -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/menu/menu_bypass_list.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <menu xmlns:android="http://schemas.android.com/apk/res/android" 3 | xmlns:app="http://schemas.android.com/apk/res-auto"> 4 | <item 5 | android:id="@+id/search_view" 6 | android:icon="@drawable/ic_description_24dp" 7 | android:title="@string/menu_item_search" 8 | app:actionViewClass="androidx.appcompat.widget.SearchView" 9 | app:showAsAction="ifRoom" /> 10 | <item 11 | android:id="@+id/select_all" 12 | android:icon="@drawable/ic_select_all_24dp" 13 | android:title="@string/menu_item_select_all" 14 | app:showAsAction="withText" /> 15 | 16 | <item 17 | android:id="@+id/select_proxy_app" 18 | android:icon="@drawable/ic_description_24dp" 19 | android:title="@string/menu_item_select_proxy_app" 20 | app:showAsAction="withText" /> 21 | 22 | <item 23 | android:id="@+id/import_proxy_app" 24 | android:icon="@drawable/ic_description_24dp" 25 | android:title="@string/menu_item_import_proxy_app" 26 | app:showAsAction="withText" /> 27 | 28 | <item 29 | android:id="@+id/export_proxy_app" 30 | android:icon="@drawable/ic_description_24dp" 31 | android:title="@string/menu_item_export_proxy_app" 32 | app:showAsAction="withText" /> 33 | 34 | </menu> 35 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/menu/menu_drawer.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <menu xmlns:android="http://schemas.android.com/apk/res/android" 3 | xmlns:tools="http://schemas.android.com/tools" 4 | tools:showIn="navigation_view"> 5 | 6 | <group android:id="@+id/group_main"> 7 | <item 8 | android:id="@+id/sub_setting" 9 | android:icon="@drawable/ic_subscriptions_24dp" 10 | android:title="@string/title_sub_setting" /> 11 | <item 12 | android:id="@+id/per_app_proxy_settings" 13 | android:icon="@drawable/ic_per_apps_24dp" 14 | android:title="@string/per_app_proxy_settings" /> 15 | <item 16 | android:id="@+id/routing_setting" 17 | android:icon="@drawable/ic_routing_24dp" 18 | android:title="@string/routing_settings_title" /> 19 | <item 20 | android:id="@+id/user_asset_setting" 21 | android:icon="@drawable/ic_file_24dp" 22 | android:title="@string/title_user_asset_setting" /> 23 | <item 24 | android:id="@+id/settings" 25 | android:icon="@drawable/ic_settings_24dp" 26 | android:title="@string/title_settings" /> 27 | </group> 28 | 29 | <group android:id="@+id/group_id2"> 30 | <item 31 | android:id="@+id/promotion" 32 | android:icon="@drawable/ic_promotion_24dp" 33 | android:title="@string/title_pref_promotion" /> 34 | <item 35 | android:id="@+id/logcat" 36 | android:icon="@drawable/ic_logcat_24dp" 37 | android:title="@string/title_logcat" /> 38 | <item 39 | android:id="@+id/check_for_update" 40 | android:icon="@drawable/ic_check_update_24dp" 41 | android:title="@string/update_check_for_update" /> 42 | <item 43 | android:id="@+id/about" 44 | android:icon="@drawable/ic_about_24dp" 45 | android:title="@string/title_about" /> 46 | <!-- place holder for version text at the bottom --> 47 | <item 48 | android:id="@+id/placeholder" 49 | android:enabled="false" 50 | android:title="" /> 51 | </group> 52 | </menu> 53 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/menu/menu_logcat.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <menu xmlns:android="http://schemas.android.com/apk/res/android" 3 | xmlns:app="http://schemas.android.com/apk/res-auto"> 4 | <item 5 | android:id="@+id/search_view" 6 | android:icon="@drawable/ic_outline_filter_alt_24" 7 | android:title="@string/menu_item_search" 8 | app:actionViewClass="androidx.appcompat.widget.SearchView" 9 | app:showAsAction="always|collapseActionView" /> 10 | <item 11 | android:id="@+id/clear_all" 12 | android:icon="@drawable/ic_delete_24dp" 13 | android:title="@string/logcat_clear" 14 | app:showAsAction="ifRoom" /> 15 | <item 16 | android:id="@+id/copy_all" 17 | android:icon="@drawable/ic_copy" 18 | android:title="@string/logcat_copy" 19 | app:showAsAction="ifRoom" /> 20 | </menu> -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/menu/menu_routing_setting.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <menu xmlns:android="http://schemas.android.com/apk/res/android" 3 | xmlns:app="http://schemas.android.com/apk/res-auto"> 4 | <item 5 | android:id="@+id/add_rule" 6 | android:icon="@drawable/ic_add_24dp" 7 | android:title="@string/routing_settings_add_rule" 8 | app:showAsAction="ifRoom" /> 9 | <item 10 | android:id="@+id/import_predefined_rulesets" 11 | android:title="@string/routing_settings_import_predefined_rulesets" 12 | app:showAsAction="never" /> 13 | <item 14 | android:id="@+id/import_rulesets_from_clipboard" 15 | android:title="@string/routing_settings_import_rulesets_from_clipboard" 16 | app:showAsAction="never" /> 17 | <item 18 | android:id="@+id/import_rulesets_from_qrcode" 19 | android:title="@string/routing_settings_import_rulesets_from_qrcode" 20 | app:showAsAction="never" /> 21 | <item 22 | android:id="@+id/export_rulesets_to_clipboard" 23 | android:title="@string/routing_settings_export_rulesets_to_clipboard" 24 | app:showAsAction="never" /> 25 | 26 | </menu> -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/menu/menu_scanner.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <menu xmlns:android="http://schemas.android.com/apk/res/android" 3 | xmlns:app="http://schemas.android.com/apk/res-auto"> 4 | <item 5 | android:id="@+id/scan_code" 6 | android:icon="@drawable/ic_scan_24dp" 7 | android:title="" 8 | app:showAsAction="ifRoom" /> 9 | <item 10 | android:id="@+id/select_photo" 11 | android:icon="@drawable/ic_image_24dp" 12 | android:title="" 13 | app:showAsAction="ifRoom" /> 14 | </menu> -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/mipmap-anydpi-v26/ic_banner.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> 3 | <background android:drawable="@color/ic_banner_background" /> 4 | <foreground> 5 | <inset 6 | android:drawable="@mipmap/ic_banner_foreground" 7 | android:inset="10%" /> 8 | </foreground> 9 | </adaptive-icon> -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> 3 | <background android:drawable="@color/ic_launcher_background" /> 4 | <foreground android:drawable="@mipmap/ic_launcher_foreground" /> 5 | <monochrome android:drawable="@mipmap/ic_launcher_foreground" /> 6 | </adaptive-icon> -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> 3 | <background android:drawable="@color/ic_launcher_background" /> 4 | <foreground android:drawable="@mipmap/ic_launcher_foreground" /> 5 | </adaptive-icon> -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/2dust/v2rayNG/680832614bd4ff9952d2009b9edeb2dd891ec2f7/V2rayNG/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/2dust/v2rayNG/680832614bd4ff9952d2009b9edeb2dd891ec2f7/V2rayNG/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/2dust/v2rayNG/680832614bd4ff9952d2009b9edeb2dd891ec2f7/V2rayNG/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/2dust/v2rayNG/680832614bd4ff9952d2009b9edeb2dd891ec2f7/V2rayNG/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/2dust/v2rayNG/680832614bd4ff9952d2009b9edeb2dd891ec2f7/V2rayNG/app/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/mipmap-xhdpi/ic_banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/2dust/v2rayNG/680832614bd4ff9952d2009b9edeb2dd891ec2f7/V2rayNG/app/src/main/res/mipmap-xhdpi/ic_banner.png -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/mipmap-xhdpi/ic_banner_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/2dust/v2rayNG/680832614bd4ff9952d2009b9edeb2dd891ec2f7/V2rayNG/app/src/main/res/mipmap-xhdpi/ic_banner_foreground.png -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/2dust/v2rayNG/680832614bd4ff9952d2009b9edeb2dd891ec2f7/V2rayNG/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/2dust/v2rayNG/680832614bd4ff9952d2009b9edeb2dd891ec2f7/V2rayNG/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/2dust/v2rayNG/680832614bd4ff9952d2009b9edeb2dd891ec2f7/V2rayNG/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/2dust/v2rayNG/680832614bd4ff9952d2009b9edeb2dd891ec2f7/V2rayNG/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/2dust/v2rayNG/680832614bd4ff9952d2009b9edeb2dd891ec2f7/V2rayNG/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/2dust/v2rayNG/680832614bd4ff9952d2009b9edeb2dd891ec2f7/V2rayNG/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/2dust/v2rayNG/680832614bd4ff9952d2009b9edeb2dd891ec2f7/V2rayNG/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/2dust/v2rayNG/680832614bd4ff9952d2009b9edeb2dd891ec2f7/V2rayNG/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/2dust/v2rayNG/680832614bd4ff9952d2009b9edeb2dd891ec2f7/V2rayNG/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/raw/licenses.xml: -------------------------------------------------------------------------------- 1 | <notices> 2 | <notice> 3 | <name>Android Compatibility Library v4</name> 4 | <url>http://source.android.com</url> 5 | <copyright>Copyright(C) 2008-2011 The Android Open Source Project</copyright> 6 | <license>Apache Software License 2.0</license> 7 | </notice> 8 | <notice> 9 | <name>Android Compatibility Library v7</name> 10 | <url>http://source.android.com</url> 11 | <copyright>Copyright(C) 2008-2011 The Android Open Source Project</copyright> 12 | <license>Apache Software License 2.0</license> 13 | </notice> 14 | <notice> 15 | <name>Android Design Library</name> 16 | <url>http://source.android.com</url> 17 | <copyright>Copyright(C) 2008-2011 The Android Open Source Project</copyright> 18 | <license>Apache Software License 2.0</license> 19 | </notice> 20 | <notice> 21 | <name>Google Gson</name> 22 | <url>https://github.com/google/gson</url> 23 | <copyright>Copyright 2008-2011 Google Inc.</copyright> 24 | <license>Apache Software License 2.0</license> 25 | </notice> 26 | <notice> 27 | <name>kotlin</name> 28 | <url>http://kotlinlang.org/</url> 29 | <copyright>Copyright 2010-2016 JetBrains s.r.o.</copyright> 30 | <license>Apache Software License 2.0</license> 31 | </notice> 32 | <notice> 33 | <name>LeakCanary</name> 34 | <url>https://github.com/square/leakcanary</url> 35 | <copyright>Copyright 2015 Square, Inc.</copyright> 36 | <license>Apache Software License 2.0</license> 37 | </notice> 38 | <notice> 39 | <name>RxPermissions</name> 40 | <url>https://github.com/tbruyelle/RxPermissions</url> 41 | <license>Apache Software License 2.0</license> 42 | </notice> 43 | </notices> 44 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/values-night/colors.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <resources> 3 | <color name="color_fab_active">#f97910</color> 4 | <color name="color_fab_inactive">#646464</color> 5 | <color name="color_secondary">#BDBDBD</color> 6 | <color name="divider_color_light">#424242</color> 7 | 8 | <color name="colorPrimary">#212121</color> 9 | <color name="colorAccent">#FFFFFF</color> 10 | </resources> 11 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/values-night/themes.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <resources> 3 | 4 | <style name="AppThemeDayNight" parent="Theme.AppCompat.DayNight.DarkActionBar"> 5 | <item name="colorPrimary">@color/colorPrimary</item> 6 | <item name="colorPrimaryDark">@color/colorPrimary</item> 7 | <item name="colorAccent">@color/colorAccent</item> 8 | <item name="android:statusBarColor">@color/colorPrimary</item> 9 | <item name="android:navigationBarColor">@android:color/transparent</item> 10 | <item name="colorControlNormal">@color/colorAccent</item> 11 | </style> 12 | 13 | </resources> -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/values-sw360dp-v13/values-preference.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <resources xmlns:tools="http://schemas.android.com/tools"> 3 | <bool name="config_materialPreferenceIconSpaceReserved" tools:ignore="MissingDefaultResource,PrivateResource">false</bool> 4 | <dimen name="preference_category_padding_start" tools:ignore="MissingDefaultResource,PrivateResource">0dp</dimen> 5 | </resources> 6 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/values/attrs.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <resources> 3 | 4 | <style name="TabLayoutTextStyle" parent="TextAppearance.Design.Tab"> 5 | <item name="textAllCaps">false</item> 6 | </style> 7 | </resources> -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <resources> 3 | <color name="colorPing">#009966</color> 4 | <color name="colorPingRed">#FF0099</color> 5 | <color name="colorConfigType">#f97910</color> 6 | 7 | <color name="color_fab_active">#f97910</color> 8 | <color name="color_fab_inactive">#9C9C9C</color> 9 | <color name="color_secondary">#727272</color> 10 | <color name="divider_color_light">#E0E0E0</color> 11 | 12 | <color name="colorPrimary">#F5F5F5</color> 13 | <color name="colorAccent">#000000</color> 14 | </resources> 15 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <resources> 3 | <dimen name="padding_spacing_dp4">4dp</dimen> 4 | <dimen name="padding_spacing_dp8">8dp</dimen> 5 | <dimen name="padding_spacing_dp16">16dp</dimen> 6 | <dimen name="image_size_dp24">24dp</dimen> 7 | <dimen name="view_height_dp36">36dp</dimen> 8 | <dimen name="view_height_dp48">48dp</dimen> 9 | <dimen name="view_height_dp64">64dp</dimen> 10 | <dimen name="view_height_dp160">160dp</dimen> 11 | </resources> 12 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/values/ic_banner_background.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <resources> 3 | <color name="ic_banner_background">#FFFFFF</color> 4 | </resources> -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/values/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <resources> 3 | <color name="ic_launcher_background">#FFFFFF</color> 4 | </resources> -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/values/themes.xml: -------------------------------------------------------------------------------- 1 | <resources> 2 | 3 | <style name="AppThemeDayNight" parent="Theme.AppCompat.DayNight"> 4 | <item name="colorPrimary">@color/colorPrimary</item> 5 | <item name="colorPrimaryDark">@color/colorPrimary</item> 6 | <item name="colorAccent">@color/colorAccent</item> 7 | <item name="android:statusBarColor">@color/colorPrimary</item> 8 | <item name="android:navigationBarColor">@android:color/transparent</item> 9 | <item name="colorControlNormal">@color/colorAccent</item> 10 | </style> 11 | 12 | <style name="AppThemeDayNight.NoActionBar" parent="AppThemeDayNight"> 13 | <item name="windowActionBar">false</item> 14 | <item name="windowNoTitle">true</item> 15 | </style> 16 | 17 | <!-- Base application theme. --> 18 | <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar" /> 19 | 20 | <style name="AppTheme.NoActionBar"> 21 | <item name="windowActionBar">false</item> 22 | <item name="windowNoTitle">true</item> 23 | <item name="android:statusBarColor">@android:color/transparent</item> 24 | </style> 25 | 26 | <style name="AppTheme.NoActionBar.Translucent"> 27 | <item name="android:windowBackground">@android:color/transparent</item> 28 | <item name="android:colorBackgroundCacheHint">@null</item> 29 | <item name="android:windowIsTranslucent">true</item> 30 | </style> 31 | 32 | <style name="BrandedSwitch" parent="AppTheme"> 33 | <item name="colorAccent">@color/color_fab_active</item> 34 | </style> 35 | </resources> 36 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/xml/app_widget_provider.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" 3 | android:initialLayout="@layout/widget_switch" 4 | android:minWidth="20dp" 5 | android:minHeight="20dp" 6 | android:widgetCategory="home_screen|keyguard" /> -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/xml/cache_paths.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <paths> 3 | <cache-path 4 | name="cache" 5 | path="/" /> 6 | </paths> 7 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/xml/network_security_config.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <network-security-config xmlns:tools="http://schemas.android.com/tools"> 3 | <base-config cleartextTrafficPermitted="true"> 4 | <trust-anchors> 5 | <certificates src="system" /> 6 | <certificates 7 | src="user" 8 | tools:ignore="AcceptsUserCertificates" /> 9 | </trust-anchors> 10 | </base-config> 11 | </network-security-config> 12 | -------------------------------------------------------------------------------- /V2rayNG/app/src/main/res/xml/shortcuts.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <shortcuts xmlns:android="http://schemas.android.com/apk/res/android"> 3 | <shortcut 4 | android:enabled="true" 5 | android:icon="@drawable/ic_qu_switch_24dp" 6 | android:shortcutDisabledMessage="@string/app_widget_name" 7 | android:shortcutId="shortcuts_switch" 8 | android:shortcutLongLabel="@string/app_widget_name" 9 | android:shortcutShortLabel="@string/app_widget_name"> 10 | 11 | <intent 12 | android:action="android.intent.action.VIEW" 13 | android:targetClass="com.v2ray.ang.ui.ScSwitchActivity" 14 | android:targetPackage="com.v2ray.ang" /> 15 | <categories android:name="android.shortcut.conversation" /> 16 | </shortcut> 17 | <shortcut 18 | android:enabled="true" 19 | android:icon="@drawable/ic_qu_scan_24dp" 20 | android:shortcutDisabledMessage="@string/menu_item_import_config_qrcode" 21 | android:shortcutId="shortcuts_scan" 22 | android:shortcutLongLabel="@string/menu_item_import_config_qrcode" 23 | android:shortcutShortLabel="@string/menu_item_import_config_qrcode"> 24 | 25 | <intent 26 | android:action="android.intent.action.VIEW" 27 | android:targetClass="com.v2ray.ang.ui.ScScannerActivity" 28 | android:targetPackage="com.v2ray.ang" /> 29 | <categories android:name="android.shortcut.conversation" /> 30 | </shortcut> 31 | </shortcuts> -------------------------------------------------------------------------------- /V2rayNG/app/src/pre_release/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <resources> 3 | <string name="app_name" translatable="false">v2rayNG (PR)</string> 4 | </resources> -------------------------------------------------------------------------------- /V2rayNG/app/src/test/java/com/v2ray/ang/HttpUtilTest.kt: -------------------------------------------------------------------------------- 1 | package com.v2ray.ang 2 | 3 | import com.v2ray.ang.util.HttpUtil 4 | import org.junit.Assert.assertEquals 5 | import org.junit.Test 6 | 7 | class HttpUtilTest { 8 | 9 | @Test 10 | fun testIdnToASCII() { 11 | // Regular URL remains unchanged 12 | val regularUrl = "https://example.com/path" 13 | assertEquals(regularUrl, HttpUtil.toIdnUrl(regularUrl)) 14 | 15 | // Non-ASCII URL converts to ASCII (Punycode) 16 | val nonAsciiUrl = "https://例子.测试/path" 17 | val expectedNonAscii = "https://xn--fsqu00a.xn--0zwm56d/path" 18 | assertEquals(expectedNonAscii, HttpUtil.toIdnUrl(nonAsciiUrl)) 19 | 20 | // Mixed URL only converts the host part 21 | val mixedUrl = "https://例子.com/测试" 22 | val expectedMixed = "https://xn--fsqu00a.com/测试" 23 | assertEquals(expectedMixed, HttpUtil.toIdnUrl(mixedUrl)) 24 | 25 | // URL with Basic Authentication using regular domain 26 | val basicAuthUrl = "https://user:password@example.com/path" 27 | assertEquals(basicAuthUrl, HttpUtil.toIdnUrl(basicAuthUrl)) 28 | 29 | // URL with Basic Authentication using non-ASCII domain 30 | val basicAuthNonAscii = "https://user:password@例子.测试/path" 31 | val expectedBasicAuthNonAscii = "https://user:password@xn--fsqu00a.xn--0zwm56d/path" 32 | assertEquals(expectedBasicAuthNonAscii, HttpUtil.toIdnUrl(basicAuthNonAscii)) 33 | 34 | // URL with non-ASCII username and password 35 | val nonAsciiAuth = "https://用户:密码@example.com/path" 36 | // Basic auth credentials should remain unchanged as they're percent-encoded separately 37 | assertEquals(nonAsciiAuth, HttpUtil.toIdnUrl(nonAsciiAuth)) 38 | } 39 | 40 | 41 | } -------------------------------------------------------------------------------- /V2rayNG/app/src/test/java/com/v2ray/ang/UtilsTest.kt: -------------------------------------------------------------------------------- 1 | package com.v2ray.ang 2 | 3 | import com.v2ray.ang.util.Utils 4 | import org.junit.Assert.assertEquals 5 | import org.junit.Assert.assertFalse 6 | import org.junit.Assert.assertTrue 7 | import org.junit.Test 8 | 9 | /** 10 | * Example local unit test, which will execute on the development machine (host). 11 | * 12 | * See [testing documentation](http://d.android.com/tools/testing). 13 | */ 14 | class UtilsTest { 15 | 16 | @Test 17 | fun test_parseInt() { 18 | assertEquals(Utils.parseInt("1234"), 1234) 19 | } 20 | 21 | @Test 22 | fun test_isIpAddress() { 23 | assertFalse(Utils.isIpAddress("114.113.112.266")) 24 | assertFalse(Utils.isIpAddress("666.666.666.666")) 25 | assertFalse(Utils.isIpAddress("256.0.0.0")) 26 | assertFalse(Utils.isIpAddress("::ffff:127.0.0.0.1")) 27 | assertFalse(Utils.isIpAddress("baidu.com")) 28 | assertFalse(Utils.isIpAddress("")) 29 | 30 | assertTrue(Utils.isIpAddress("127.0.0.1")) 31 | assertTrue(Utils.isIpAddress("127.0.0.1:80")) 32 | assertTrue(Utils.isIpAddress("0.0.0.0/0")) 33 | assertTrue(Utils.isIpAddress("::1")) 34 | assertTrue(Utils.isIpAddress("[::1]:80")) 35 | assertTrue(Utils.isIpAddress("2605:2700:0:3::4713:93e3")) 36 | assertTrue(Utils.isIpAddress("[2605:2700:0:3::4713:93e3]:80")) 37 | assertTrue(Utils.isIpAddress("::ffff:192.168.173.22")) 38 | assertTrue(Utils.isIpAddress("[::ffff:192.168.173.22]:80")) 39 | assertTrue(Utils.isIpAddress("1::")) 40 | assertTrue(Utils.isIpAddress("::")) 41 | assertTrue(Utils.isIpAddress("::/0")) 42 | assertTrue(Utils.isIpAddress("10.24.56.0/24")) 43 | assertTrue(Utils.isIpAddress("2001:4321::1")) 44 | assertTrue(Utils.isIpAddress("240e:1234:abcd:12::6666")) 45 | assertTrue(Utils.isIpAddress("240e:1234:abcd:12::/64")) 46 | } 47 | 48 | @Test 49 | fun test_IsIpInCidr() { 50 | assertTrue(Utils.isIpInCidr("192.168.1.1", "192.168.1.0/24")) 51 | assertTrue(Utils.isIpInCidr("192.168.1.254", "192.168.1.0/24")) 52 | assertFalse(Utils.isIpInCidr("192.168.2.1", "192.168.1.0/24")) 53 | 54 | assertTrue(Utils.isIpInCidr("10.0.0.0", "10.0.0.0/8")) 55 | assertTrue(Utils.isIpInCidr("10.255.255.255", "10.0.0.0/8")) 56 | assertFalse(Utils.isIpInCidr("11.0.0.0", "10.0.0.0/8")) 57 | 58 | assertFalse(Utils.isIpInCidr("invalid-ip", "192.168.1.0/24")) 59 | assertFalse(Utils.isIpInCidr("192.168.1.1", "invalid-cidr")) 60 | } 61 | 62 | } -------------------------------------------------------------------------------- /V2rayNG/build.gradle.kts: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | plugins { 3 | alias(libs.plugins.android.application) apply false 4 | alias(libs.plugins.android.library) apply false 5 | alias(libs.plugins.kotlin.android) apply false 6 | } 7 | 8 | buildscript { 9 | dependencies { 10 | classpath(libs.gradle.license.plugin) 11 | } 12 | } 13 | 14 | -------------------------------------------------------------------------------- /V2rayNG/gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | # IDE (e.g. Android Studio) users: 3 | # Gradle settings configured through the IDE *will override* 4 | # any settings specified in this file. 5 | # For more details on how to configure your build environment visit 6 | # http://www.gradle.org/docs/current/userguide/build_environment.html 7 | # Specifies the JVM arguments used for the daemon process. 8 | # The setting is particularly useful for tweaking memory settings. 9 | org.gradle.jvmargs=-Xmx4096m -Dfile.encoding=UTF-8 10 | # When configured, Gradle will run in incubating parallel mode. 11 | # This option should only be used with decoupled projects. For more details, visit 12 | # https://developer.android.com/r/tools/gradle-multi-project-decoupled-projects 13 | # org.gradle.parallel=true 14 | # AndroidX package structure to make it clearer which packages are bundled with the 15 | # Android operating system, and which are packaged with your app's APK 16 | # https://developer.android.com/topic/libraries/support-library/androidx-rn 17 | android.useAndroidX=true 18 | # Kotlin code style for this project: "official" or "obsolete": 19 | kotlin.code.style=official 20 | # Enables namespacing of each library's R class so that its R class includes only the 21 | # resources declared in the library itself and none from the library's dependencies, 22 | # thereby reducing the size of the R class for that library 23 | android.nonTransitiveRClass=true 24 | kotlin.incremental=true -------------------------------------------------------------------------------- /V2rayNG/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/2dust/v2rayNG/680832614bd4ff9952d2009b9edeb2dd891ec2f7/V2rayNG/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /V2rayNG/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Thu Nov 14 12:42:51 BDT 2024 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.1-bin.zip 5 | zipStoreBase=GRADLE_USER_HOME 6 | zipStorePath=wrapper/dists 7 | -------------------------------------------------------------------------------- /V2rayNG/gradlew.bat: -------------------------------------------------------------------------------- 1 | @rem 2 | @rem Copyright 2015 the original author or authors. 3 | @rem 4 | @rem Licensed under the Apache License, Version 2.0 (the "License"); 5 | @rem you may not use this file except in compliance with the License. 6 | @rem You may obtain a copy of the License at 7 | @rem 8 | @rem https://www.apache.org/licenses/LICENSE-2.0 9 | @rem 10 | @rem Unless required by applicable law or agreed to in writing, software 11 | @rem distributed under the License is distributed on an "AS IS" BASIS, 12 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | @rem See the License for the specific language governing permissions and 14 | @rem limitations under the License. 15 | @rem 16 | 17 | @if "%DEBUG%" == "" @echo off 18 | @rem ########################################################################## 19 | @rem 20 | @rem Gradle startup script for Windows 21 | @rem 22 | @rem ########################################################################## 23 | 24 | @rem Set local scope for the variables with windows NT shell 25 | if "%OS%"=="Windows_NT" setlocal 26 | 27 | set DIRNAME=%~dp0 28 | if "%DIRNAME%" == "" set DIRNAME=. 29 | set APP_BASE_NAME=%~n0 30 | set APP_HOME=%DIRNAME% 31 | 32 | @rem Resolve any "." and ".." in APP_HOME to make it shorter. 33 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi 34 | 35 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 36 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" 37 | 38 | @rem Find java.exe 39 | if defined JAVA_HOME goto findJavaFromJavaHome 40 | 41 | set JAVA_EXE=java.exe 42 | %JAVA_EXE% -version >NUL 2>&1 43 | if "%ERRORLEVEL%" == "0" goto execute 44 | 45 | echo. 46 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 47 | echo. 48 | echo Please set the JAVA_HOME variable in your environment to match the 49 | echo location of your Java installation. 50 | 51 | goto fail 52 | 53 | :findJavaFromJavaHome 54 | set JAVA_HOME=%JAVA_HOME:"=% 55 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 56 | 57 | if exist "%JAVA_EXE%" goto execute 58 | 59 | echo. 60 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 61 | echo. 62 | echo Please set the JAVA_HOME variable in your environment to match the 63 | echo location of your Java installation. 64 | 65 | goto fail 66 | 67 | :execute 68 | @rem Setup the command line 69 | 70 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 71 | 72 | 73 | @rem Execute Gradle 74 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* 75 | 76 | :end 77 | @rem End local scope for the variables with windows NT shell 78 | if "%ERRORLEVEL%"=="0" goto mainEnd 79 | 80 | :fail 81 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 82 | rem the _cmd.exe /c_ return code! 83 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 84 | exit /b 1 85 | 86 | :mainEnd 87 | if "%OS%"=="Windows_NT" endlocal 88 | 89 | :omega 90 | -------------------------------------------------------------------------------- /V2rayNG/settings.gradle.kts: -------------------------------------------------------------------------------- 1 | pluginManagement { 2 | repositories { 3 | google { 4 | content { 5 | includeGroupByRegex("com\\.android.*") 6 | includeGroupByRegex("com\\.google.*") 7 | includeGroupByRegex("androidx.*") 8 | } 9 | } 10 | mavenCentral() 11 | gradlePluginPortal() 12 | } 13 | } 14 | dependencyResolutionManagement { 15 | repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) 16 | repositories { 17 | google() 18 | mavenCentral() 19 | maven { url = uri("https://jitpack.io") } 20 | } 21 | } 22 | 23 | rootProject.name = "v2rayNG" 24 | include(":app") 25 | -------------------------------------------------------------------------------- /compile-tun2socks.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -o errexit 3 | set -o pipefail 4 | set -o nounset 5 | # Set magic variables for current file & dir 6 | __dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" 7 | __file="${__dir}/$(basename "${BASH_SOURCE[0]}")" 8 | __base="$(basename ${__file} .sh)" 9 | if [[ ! -d $NDK_HOME ]]; then 10 | echo "Android NDK: NDK_HOME not found. please set env \$NDK_HOME" 11 | exit 1 12 | fi 13 | TMPDIR=$(mktemp -d) 14 | clear_tmp () { 15 | rm -rf $TMPDIR 16 | } 17 | trap 'echo -e "Aborted, error $? in command: $BASH_COMMAND"; trap ERR; clear_tmp; exit 1' ERR INT 18 | install -m644 $__dir/tun2socks.mk $TMPDIR/ 19 | pushd $TMPDIR 20 | ln -s $__dir/badvpn badvpn 21 | ln -s $__dir/libancillary libancillary 22 | $NDK_HOME/ndk-build \ 23 | NDK_PROJECT_PATH=. \ 24 | APP_BUILD_SCRIPT=./tun2socks.mk \ 25 | APP_ABI=all \ 26 | APP_PLATFORM=android-21 \ 27 | NDK_LIBS_OUT=$TMPDIR/libs \ 28 | NDK_OUT=$TMPDIR/tmp \ 29 | APP_SHORT_COMMANDS=false LOCAL_SHORT_COMMANDS=false -B -j4 30 | cp -r $TMPDIR/libs $__dir/ 31 | popd 32 | rm -rf $TMPDIR 33 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/full_description.txt: -------------------------------------------------------------------------------- 1 | <p>A V2Ray client for Android, support <a href="https://github.com/XTLS/Xray-core">Xray core</a> and <a href="https://github.com/v2fly/v2ray-core">v2fly core</a></p> 2 | 3 | <h3>Telegram Channel</h3> 4 | 5 | <p><a href="https://t.me/github_2dust">github_2dust</a></p> 6 | 7 | <h3>Usage</h3> 8 | 9 | <h4>Geoip and Geosite</h4> 10 | 11 | <ul> 12 | <li>geoip.dat and geosite.dat files are in <code>Android/data/com.v2ray.ang/files/assets</code> (path may differ on some Android device)</li> 13 | <li>download feature will get enhanced version in this <a href="https://github.com/Loyalsoldier/v2ray-rules-dat">repo</a> (Note it need a working proxy)</li> 14 | <li>latest official <a href="https://github.com/v2fly/domain-list-community">domain list</a> and <a href="https://github.com/v2fly/geoip">ip list</a> can be imported manually</li> 15 | <li>possible to use third party dat file in the same folder, like <a href="https://guide.v2fly.org/routing/sitedata.html#%E5%A4%96%E7%BD%AE%E7%9A%84%E5%9F%9F%E5%90%8D%E6%96%87%E4%BB%B6">h2y</a></li> 16 | </ul> 17 | 18 | <h3>More in our <a href="https://github.com/2dust/v2rayNG/wiki">wiki</a></h3> 19 | 20 | <h3>Development guide</h3> 21 | 22 | <p>Android project under V2rayNG folder can be compiled directly in Android Studio, or using Gradle wrapper. But the v2ray core inside the aar is (probably) outdated. 23 | The aar can be compiled from the Golang project <a href="https://github.com/2dust/AndroidLibV2rayLite">AndroidLibV2rayLite</a> or <a href="https://github.com/2dust/AndroidLibXrayLite">AndroidLibXrayLite</a>. 24 | For a quick start, read guide for <a href="https://github.com/golang/go/wiki/Mobile">Go Mobile</a> and <a href="https://tutorialedge.net/golang/makefiles-for-go-developers/">Makefiles for Go Developers</a></p> 25 | 26 | <p>v2rayNG can run on Android Emulators. For WSA, VPN permission need to be granted via 27 | <code>appops set [package name] ACTIVATE_VPN allow</code></p> 28 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/2dust/v2rayNG/680832614bd4ff9952d2009b9edeb2dd891ec2f7/fastlane/metadata/android/en-US/images/icon.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/short_description.txt: -------------------------------------------------------------------------------- 1 | A V2Ray client for Android, support Xray core and v2fly core 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/title.txt: -------------------------------------------------------------------------------- 1 | v2rayNG 2 | -------------------------------------------------------------------------------- /libhysteria2.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | targets=( 4 | "aarch64-linux-android21 arm64 arm64-v8a" 5 | "armv7a-linux-androideabi21 arm armeabi-v7a" 6 | "x86_64-linux-android21 amd64 x86_64" 7 | "i686-linux-android21 386 x86" 8 | ) 9 | 10 | cd "hysteria" || exit 11 | 12 | for target in "${targets[@]}"; do 13 | IFS=' ' read -r ndk_target goarch abi <<< "$target" 14 | 15 | echo "Building for ${abi} with ${ndk_target} (${goarch})" 16 | 17 | CC="${NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/bin/${ndk_target}-clang" CGO_ENABLED=1 GOOS=android GOARCH=$goarch go build -o libs/$abi/libhysteria2.so -trimpath -ldflags "-s -w -buildid=" -buildvcs=false ./app 18 | 19 | echo "Built libhysteria2.so for ${abi}" 20 | done 21 | --------------------------------------------------------------------------------