The response has been limited to 50k tokens of the smallest files in the repo. You can remove this limitation by removing the max tokens filter.
├── .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 | [![API](https://img.shields.io/badge/API-21%2B-yellow.svg?style=flat)](https://developer.android.com/about/versions/lollipop)
 6 | [![Kotlin Version](https://img.shields.io/badge/Kotlin-2.1.21-blue.svg)](https://kotlinlang.org)
 7 | [![GitHub commit activity](https://img.shields.io/github/commit-activity/m/2dust/v2rayNG)](https://github.com/2dust/v2rayNG/commits/master)
 8 | [![CodeFactor](https://www.codefactor.io/repository/github/2dust/v2rayng/badge)](https://www.codefactor.io/repository/github/2dust/v2rayng)
 9 | [![GitHub Releases](https://img.shields.io/github/downloads/2dust/v2rayNG/latest/total?logo=github)](https://github.com/2dust/v2rayNG/releases)
10 | [![Chat on Telegram](https://img.shields.io/badge/Chat%20on-Telegram-brightgreen.svg)](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 | 


--------------------------------------------------------------------------------