From 796676abdc3fe090bc553bbf9039bd8e4c1c5bdd Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Wed, 26 Mar 2025 18:48:14 +0800 Subject: [PATCH] Enable double column display The profile list is displayed in double columns, allowing more content to be displayed on the screen. You need to restart the application to take effect. --- .../src/main/java/com/v2ray/ang/AppConfig.kt | 1 + .../java/com/v2ray/ang/ui/MainActivity.kt | 8 +- .../com/v2ray/ang/ui/MainRecyclerAdapter.kt | 173 +++++++----- .../java/com/v2ray/ang/ui/SettingsActivity.kt | 1 + .../v2ray/ang/ui/SubSettingRecyclerAdapter.kt | 2 + .../v2ray/ang/viewmodel/SettingsViewModel.kt | 1 + .../res/drawable-night/ic_more_vert_24dp.xml | 11 + .../app/src/main/res/drawable/ic_circle.xml | 7 + .../main/res/drawable/ic_more_vert_24dp.xml | 11 + .../main/res/layout/activity_bypass_list.xml | 2 +- .../main/res/layout/item_recycler_footer.xml | 1 + .../main/res/layout/item_recycler_main.xml | 259 ++++++++++-------- .../app/src/main/res/values-ar/strings.xml | 11 + .../app/src/main/res/values-bn/strings.xml | 12 + .../src/main/res/values-bqi-rIR/strings.xml | 11 + .../app/src/main/res/values-fa/strings.xml | 12 + .../app/src/main/res/values-ru/strings.xml | 11 + .../app/src/main/res/values-vi/strings.xml | 11 + .../src/main/res/values-zh-rCN/strings.xml | 11 + .../src/main/res/values-zh-rTW/strings.xml | 11 + V2rayNG/app/src/main/res/values/strings.xml | 11 + .../app/src/main/res/xml/pref_settings.xml | 5 + 22 files changed, 392 insertions(+), 191 deletions(-) create mode 100644 V2rayNG/app/src/main/res/drawable-night/ic_more_vert_24dp.xml create mode 100644 V2rayNG/app/src/main/res/drawable/ic_circle.xml create mode 100644 V2rayNG/app/src/main/res/drawable/ic_more_vert_24dp.xml diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/AppConfig.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/AppConfig.kt index ba45042c..8c110aa2 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/AppConfig.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/AppConfig.kt @@ -42,6 +42,7 @@ object AppConfig { const val PREF_SPEED_ENABLED = "pref_speed_enabled" const val PREF_CONFIRM_REMOVE = "pref_confirm_remove" const val PREF_START_SCAN_IMMEDIATE = "pref_start_scan_immediate" + const val PREF_DOUBLE_COLUMN_DISPLAY = "pref_double_column_display" const val PREF_LANGUAGE = "pref_language" const val PREF_UI_MODE_NIGHT = "pref_ui_mode_night" const val PREF_PREFER_IPV6 = "pref_prefer_ipv6" diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/MainActivity.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/MainActivity.kt index b8ba755b..8356c5ab 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/MainActivity.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/MainActivity.kt @@ -21,8 +21,8 @@ import androidx.core.content.ContextCompat import androidx.core.view.GravityCompat import androidx.core.view.isVisible import androidx.lifecycle.lifecycleScope +import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.ItemTouchHelper -import androidx.recyclerview.widget.LinearLayoutManager import com.google.android.material.navigation.NavigationView import com.google.android.material.tabs.TabLayout import com.v2ray.ang.AppConfig @@ -162,7 +162,11 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList } binding.recyclerView.setHasFixedSize(true) - binding.recyclerView.layoutManager = LinearLayoutManager(this) + if (MmkvManager.decodeSettingsBool(AppConfig.PREF_DOUBLE_COLUMN_DISPLAY, false)) { + binding.recyclerView.layoutManager = GridLayoutManager(this, 2) + } else { + binding.recyclerView.layoutManager = GridLayoutManager(this, 1) + } addCustomDividerToRecyclerView(binding.recyclerView, this, R.drawable.custom_divider) binding.recyclerView.adapter = adapter diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/MainRecyclerAdapter.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/MainRecyclerAdapter.kt index 638d7240..4c92456e 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/MainRecyclerAdapter.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/MainRecyclerAdapter.kt @@ -24,7 +24,6 @@ import com.v2ray.ang.handler.MmkvManager import com.v2ray.ang.helper.ItemTouchHelperAdapter import com.v2ray.ang.helper.ItemTouchHelperViewHolder import com.v2ray.ang.service.V2RayServiceManager -import com.v2ray.ang.util.Utils import kotlinx.coroutines.delay import kotlinx.coroutines.launch @@ -38,7 +37,11 @@ class MainRecyclerAdapter(val activity: MainActivity) : RecyclerView.Adapter by lazy { mActivity.resources.getStringArray(R.array.share_method) } + private val share_method_more: Array by lazy { + mActivity.resources.getStringArray(R.array.share_method_more) + } var isRunning = false + private val doubleColumnDisplay = MmkvManager.decodeSettingsBool(AppConfig.PREF_DOUBLE_COLUMN_DISPLAY, false) override fun getItemCount() = mActivity.mainViewModel.serversCache.size + 1 @@ -46,109 +49,115 @@ class MainRecyclerAdapter(val activity: MainActivity) : RecyclerView.Adapter { - holder.itemMainBinding.tvType.text = mActivity.getString(R.string.server_customize_config) - shareOptions = shareOptions.takeLast(1) + //subscription remarks + val subRemarks = getSubscriptionRemarks(profile) + holder.itemMainBinding.tvSubscription.text = subRemarks + holder.itemMainBinding.layoutSubscription.visibility = if (subRemarks.isEmpty()) View.GONE else View.VISIBLE + + //layout + if (doubleColumnDisplay) { + holder.itemMainBinding.layoutShare.visibility = View.GONE + holder.itemMainBinding.layoutEdit.visibility = View.GONE + holder.itemMainBinding.layoutRemove.visibility = View.GONE + holder.itemMainBinding.layoutMore.visibility = View.VISIBLE + + //share method + val shareOptions = if (isCustom) share_method_more.asList().takeLast(3) else share_method_more.asList() + + holder.itemMainBinding.layoutMore.setOnClickListener { + shareServer(guid, profile, position, shareOptions, if (isCustom) 2 else 0) + } + } else { + holder.itemMainBinding.layoutShare.visibility = View.VISIBLE + holder.itemMainBinding.layoutEdit.visibility = View.VISIBLE + holder.itemMainBinding.layoutRemove.visibility = View.VISIBLE + holder.itemMainBinding.layoutMore.visibility = View.GONE + + //share method + val shareOptions = if (isCustom) share_method.asList().takeLast(1) else share_method.asList() + + holder.itemMainBinding.layoutShare.setOnClickListener { + shareServer(guid, profile, position, shareOptions, if (isCustom) 2 else 0) } - else -> { - holder.itemMainBinding.tvType.text = profile.configType.name + holder.itemMainBinding.layoutEdit.setOnClickListener { + editServer(guid, profile) } - } - - // Hide xxx:xxx:***/xxx.xxx.xxx.*** - val strState = "${ - profile.server?.let { - if (it.contains(":")) - it.split(":").take(2).joinToString(":", postfix = ":***") - else - it.split('.').dropLast(1).joinToString(".", postfix = ".***") + holder.itemMainBinding.layoutRemove.setOnClickListener { + removeServer(guid, position) } - } : ${profile.serverPort}" - - holder.itemMainBinding.tvStatistics.text = strState - - holder.itemMainBinding.layoutShare.setOnClickListener { - shareServer(guid, profile, shareOptions) - } - - holder.itemMainBinding.layoutEdit.setOnClickListener { - editServer(guid, profile) - } - holder.itemMainBinding.layoutRemove.setOnClickListener { - removeServer(guid, position) } holder.itemMainBinding.infoContainer.setOnClickListener { setSelectServer(guid) } } - if (holder is FooterViewHolder) { - if (true) { - holder.itemFooterBinding.layoutEdit.visibility = View.INVISIBLE - } else { - holder.itemFooterBinding.layoutEdit.setOnClickListener { - Utils.openUri(mActivity, "${Utils.decode(AppConfig.PromotionUrl)}?t=${System.currentTimeMillis()}") - } - } - } +// if (holder is FooterViewHolder) { +// if (true) { +// holder.itemFooterBinding.layoutEdit.visibility = View.INVISIBLE +// } else { +// holder.itemFooterBinding.layoutEdit.setOnClickListener { +// Utils.openUri(mActivity, "${Utils.decode(AppConfig.PromotionUrl)}?t=${System.currentTimeMillis()}") +// } +// } +// } } - private fun shareServer(guid: String, profile: ProfileItem, shareOptions: List) { + private fun getAddress(profile: ProfileItem): String { + // Hide xxx:xxx:***/xxx.xxx.xxx.*** + return "${ + profile.server?.let { + if (it.contains(":")) + it.split(":").take(2).joinToString(":", postfix = ":***") + else + it.split('.').dropLast(1).joinToString(".", postfix = ".***") + } + } : ${profile.serverPort}" + } + + private fun getSubscriptionRemarks(profile: ProfileItem): String { + val subRemarks = + if (mActivity.mainViewModel.subscriptionId.isEmpty()) + MmkvManager.decodeSubscription(profile.subscriptionId)?.remarks?.firstOrNull() + else + null + return subRemarks?.toString() ?: "" + } + + private fun shareServer(guid: String, profile: ProfileItem, position: Int, shareOptions: List, skip: Int) { AlertDialog.Builder(mActivity).setItems(shareOptions.toTypedArray()) { _, i -> try { - when (i) { - 0 -> { - if (profile.configType == EConfigType.CUSTOM) { - shareFullContent(guid) - } else { - val ivBinding = ItemQrcodeBinding.inflate(LayoutInflater.from(mActivity)) - ivBinding.ivQcode.setImageBitmap(AngConfigManager.share2QRCode(guid)) - AlertDialog.Builder(mActivity).setView(ivBinding.root).show() - } - } - - 1 -> { - if (AngConfigManager.share2Clipboard(mActivity, guid) == 0) { - mActivity.toast(R.string.toast_success) - } else { - mActivity.toast(R.string.toast_failure) - } - } - + when (i + skip) { + 0 -> showQRCode(guid) + 1 -> share2Clipboard(guid) 2 -> shareFullContent(guid) + 3 -> editServer(guid, profile) + 4 -> removeServer(guid, position) else -> mActivity.toast("else") } } catch (e: Exception) { @@ -157,6 +166,20 @@ class MainRecyclerAdapter(val activity: MainActivity) : RecyclerView.Adapter diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/viewmodel/SettingsViewModel.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/viewmodel/SettingsViewModel.kt index 70db5ef8..995573d1 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/viewmodel/SettingsViewModel.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/viewmodel/SettingsViewModel.kt @@ -73,6 +73,7 @@ class SettingsViewModel(application: Application) : AndroidViewModel(application AppConfig.PREF_BYPASS_APPS, AppConfig.PREF_CONFIRM_REMOVE, AppConfig.PREF_START_SCAN_IMMEDIATE, + AppConfig.PREF_DOUBLE_COLUMN_DISPLAY, AppConfig.SUBSCRIPTION_AUTO_UPDATE, AppConfig.PREF_FRAGMENT_ENABLED, AppConfig.PREF_MUX_ENABLED, diff --git a/V2rayNG/app/src/main/res/drawable-night/ic_more_vert_24dp.xml b/V2rayNG/app/src/main/res/drawable-night/ic_more_vert_24dp.xml new file mode 100644 index 00000000..2a252346 --- /dev/null +++ b/V2rayNG/app/src/main/res/drawable-night/ic_more_vert_24dp.xml @@ -0,0 +1,11 @@ + + + + + diff --git a/V2rayNG/app/src/main/res/drawable/ic_circle.xml b/V2rayNG/app/src/main/res/drawable/ic_circle.xml new file mode 100644 index 00000000..413bb296 --- /dev/null +++ b/V2rayNG/app/src/main/res/drawable/ic_circle.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/V2rayNG/app/src/main/res/drawable/ic_more_vert_24dp.xml b/V2rayNG/app/src/main/res/drawable/ic_more_vert_24dp.xml new file mode 100644 index 00000000..32d39196 --- /dev/null +++ b/V2rayNG/app/src/main/res/drawable/ic_more_vert_24dp.xml @@ -0,0 +1,11 @@ + + + + + diff --git a/V2rayNG/app/src/main/res/layout/activity_bypass_list.xml b/V2rayNG/app/src/main/res/layout/activity_bypass_list.xml index c89e57ba..55db5240 100644 --- a/V2rayNG/app/src/main/res/layout/activity_bypass_list.xml +++ b/V2rayNG/app/src/main/res/layout/activity_bypass_list.xml @@ -83,7 +83,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:scrollbars="vertical" - app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" + app:layoutManager="androidx.recyclerview.widget.GridLayoutManager" tools:context=".ui.PerAppProxyActivity" /> \ No newline at end of file diff --git a/V2rayNG/app/src/main/res/layout/item_recycler_footer.xml b/V2rayNG/app/src/main/res/layout/item_recycler_footer.xml index c350ba58..137427a6 100644 --- a/V2rayNG/app/src/main/res/layout/item_recycler_footer.xml +++ b/V2rayNG/app/src/main/res/layout/item_recycler_footer.xml @@ -11,6 +11,7 @@ android:layout_height="wrap_content" android:layout_gravity="center" android:gravity="center" + android:visibility="invisible" android:orientation="horizontal" android:padding="@dimen/padding_spacing_dp16"> diff --git a/V2rayNG/app/src/main/res/layout/item_recycler_main.xml b/V2rayNG/app/src/main/res/layout/item_recycler_main.xml index 52df89d3..31ac5a6a 100644 --- a/V2rayNG/app/src/main/res/layout/item_recycler_main.xml +++ b/V2rayNG/app/src/main/res/layout/item_recycler_main.xml @@ -19,154 +19,186 @@ android:nextFocusRight="@+id/layout_share" android:orientation="horizontal" android:paddingTop="@dimen/padding_spacing_dp8" - android:paddingEnd="@dimen/padding_spacing_dp8" + android:paddingEnd="@dimen/padding_spacing_dp4" android:paddingStart="@dimen/padding_spacing_dp4" android:paddingBottom="@dimen/padding_spacing_dp8"> + android:orientation="vertical"> - - - - - - - - - - - - - - - - - - - - + android:layout_weight="1" + android:orientation="vertical"> - + android:layout_height="wrap_content" + android:orientation="vertical" + android:paddingStart="@dimen/padding_spacing_dp8"> + + + + + + + + + + + + + + + + android:orientation="horizontal"> - + + + + + + + + + + + + + + + + + + + + + + - - - - - + android:orientation="horizontal" + android:paddingStart="@dimen/padding_spacing_dp8" + android:paddingTop="@dimen/padding_spacing_dp8" + android:paddingEnd="@dimen/padding_spacing_dp8"> + + + diff --git a/V2rayNG/app/src/main/res/values-ar/strings.xml b/V2rayNG/app/src/main/res/values-ar/strings.xml index 2b56f8d9..b604898e 100644 --- a/V2rayNG/app/src/main/res/values-ar/strings.xml +++ b/V2rayNG/app/src/main/res/values-ar/strings.xml @@ -216,6 +216,9 @@ Append HTTP Proxy to VPN HTTP proxy will be used directly from (browser/ some supported apps), without going through the virtual NIC device (Android 10+) + Enable double column display + The profile list is displayed in double columns, allowing more content to be displayed on the screen. You need to restart the application to take effect. + ملاحظات ملاحظات التحسينات أو الأخطاء إلى GitHub @@ -317,6 +320,14 @@ تصدير التكوين الكامل إلى الحافظة + + QRcode + Export to clipboard + Export full configuration to clipboard + Edit + Delete + + رمز استجابة سريعة (QRcode) تصدير إلى الحافظة diff --git a/V2rayNG/app/src/main/res/values-bn/strings.xml b/V2rayNG/app/src/main/res/values-bn/strings.xml index 39a16480..8b1e2296 100644 --- a/V2rayNG/app/src/main/res/values-bn/strings.xml +++ b/V2rayNG/app/src/main/res/values-bn/strings.xml @@ -216,6 +216,9 @@ Append HTTP Proxy to VPN HTTP proxy will be used directly from (browser/ some supported apps), without going through the virtual NIC device (Android 10+) + Enable double column display + The profile list is displayed in double columns, allowing more content to be displayed on the screen. You need to restart the application to take effect. + মতামত মতামত উন্নয়ন বা বাগগুলি GitHub-এ পাঠান @@ -309,12 +312,21 @@ ফ্র্যাগমেন্ট দৈর্ঘ্য (ন্যূনতম-সর্বাধিক) ফ্র্যাগমেন্ট ইন্টারভ্যাল (ন্যূনতম-সর্বাধিক) ফ্র্যাগমেন্ট সক্রিয় করুন + QR কোড ক্লিপবোর্ডে রপ্তানি করুন পূর্ণ কনফিগারেশন ক্লিপবোর্ডে রপ্তানি করুন + + QRcode + Export to clipboard + Export full configuration to clipboard + Edit + Delete + + QR কোড ক্লিপবোর্ডে রপ্তানি করুন diff --git a/V2rayNG/app/src/main/res/values-bqi-rIR/strings.xml b/V2rayNG/app/src/main/res/values-bqi-rIR/strings.xml index a236f416..2127c963 100644 --- a/V2rayNG/app/src/main/res/values-bqi-rIR/strings.xml +++ b/V2rayNG/app/src/main/res/values-bqi-rIR/strings.xml @@ -216,6 +216,9 @@ پروکسی HTTP ن و VPN ازاف کۊنین پروکسی HTTP ن موسقیمن ز (مۊرۊرگر/ی قرد ز برنومیل لادراری بیڌه)، بؽ استفاڌه ز دسگا NIC مجازی (Android 10+) استفاڌه ابۊ. + Enable double column display + The profile list is displayed in double columns, allowing more content to be displayed on the screen. You need to restart the application to take effect. + فشناڌن منشڌ فشناڌن منشڌ یا داسوو موشکلا من Github @@ -325,6 +328,14 @@ و در کشیڌن پوی کانفیگ من کلیپ بورد + + QRcode + Export to clipboard + Export full configuration to clipboard + Edit + Delete + + QRcode و در کشیڌن من کلیپ بورد diff --git a/V2rayNG/app/src/main/res/values-fa/strings.xml b/V2rayNG/app/src/main/res/values-fa/strings.xml index 5e00259d..d3bc008c 100644 --- a/V2rayNG/app/src/main/res/values-fa/strings.xml +++ b/V2rayNG/app/src/main/res/values-fa/strings.xml @@ -214,6 +214,9 @@ پروکسی HTTP را به VPN اضافه کنید پروکسی HTTP مستقیماً از (مرورگر/برخی برنامه‌های پشتیبانی‌شده)، بدون استفاده از دستگاه NIC مجازی (Android 10+) استفاده می‌شود. + Enable double column display + The profile list is displayed in double columns, allowing more content to be displayed on the screen. You need to restart the application to take effect. + بازخورد بازخورد یا گزارش اشکالات در گیت‌ هاب @@ -315,12 +318,21 @@ طول بسته های فرگمنت (حداقل-حداکثر) فاصله بین بسته های فرگمنت (حداقل-حداکثر) فعال کردن فرگمنت + QRcode خروجی گرفتن در کلیپ‌ بورد خروجی گرفتن کانفیگ کامل در کلیپ بورد + + QRcode + Export to clipboard + Export full configuration to clipboard + Edit + Delete + + QRcode خروجی گرفتن در کلیپ‌ بورد diff --git a/V2rayNG/app/src/main/res/values-ru/strings.xml b/V2rayNG/app/src/main/res/values-ru/strings.xml index 95036b7c..4cc097f1 100644 --- a/V2rayNG/app/src/main/res/values-ru/strings.xml +++ b/V2rayNG/app/src/main/res/values-ru/strings.xml @@ -215,6 +215,9 @@ Дополнительный HTTP-прокси HTTP-прокси будет использоваться напрямую (из браузера и других поддерживающих приложений), минуя виртуальный сетевой адаптер (Android 10+) + Enable double column display + The profile list is displayed in double columns, allowing more content to be displayed on the screen. You need to restart the application to take effect. + Обратная связь Предложить улучшение или сообщить об ошибке на GitHub @@ -324,6 +327,14 @@ Экспорт всей конфигурации в буфер обмена + + QRcode + Export to clipboard + Export full configuration to clipboard + Edit + Delete + + QR-код Экспорт в буфер обмена diff --git a/V2rayNG/app/src/main/res/values-vi/strings.xml b/V2rayNG/app/src/main/res/values-vi/strings.xml index 4f3d0294..34f1d0ed 100644 --- a/V2rayNG/app/src/main/res/values-vi/strings.xml +++ b/V2rayNG/app/src/main/res/values-vi/strings.xml @@ -216,6 +216,9 @@ Append HTTP Proxy to VPN HTTP proxy will be used directly from (browser/ some supported apps), without going through the virtual NIC device (Android 10+) + Enable double column display + The profile list is displayed in double columns, allowing more content to be displayed on the screen. You need to restart the application to take effect. + Phản hồi lỗi Phản hồi cải tiến hoặc lỗi lên GitHub @@ -312,6 +315,14 @@ Sao chép thành cấu hình tùy chỉnh + + QRcode + Export to clipboard + Export full configuration to clipboard + Edit + Delete + + Xuất gói ra mã QR (Chụp màn hình để lưu) Xuất gói vào Clipboard diff --git a/V2rayNG/app/src/main/res/values-zh-rCN/strings.xml b/V2rayNG/app/src/main/res/values-zh-rCN/strings.xml index 32e8ef4c..c63b029f 100644 --- a/V2rayNG/app/src/main/res/values-zh-rCN/strings.xml +++ b/V2rayNG/app/src/main/res/values-zh-rCN/strings.xml @@ -213,6 +213,9 @@ 追加 HTTP 代理至 VPN 浏览器 / 一些支持的应用 将直接使用 HTTP 代理, 而不经过虚拟网卡设备 (Android 10+) + 启用双列显示 + 配置文件列表以双列显示,允许在屏幕上显示更多内容。需要重启应用生效。 + 反馈 反馈改进或漏洞至 GitHub @@ -316,6 +319,14 @@ 导出完整配置至剪贴板 + + 二维码 + 导出至剪贴板 + 导出完整配置至剪贴板 + 编辑 + 删除 + + 二维码 导出至剪贴板 diff --git a/V2rayNG/app/src/main/res/values-zh-rTW/strings.xml b/V2rayNG/app/src/main/res/values-zh-rTW/strings.xml index 93876d05..5c21407c 100644 --- a/V2rayNG/app/src/main/res/values-zh-rTW/strings.xml +++ b/V2rayNG/app/src/main/res/values-zh-rTW/strings.xml @@ -214,6 +214,9 @@ 追加 HTTP 代理至 VPN 瀏覽器 / 一些支援的應用 將直接使用 HTTP 代理, 而不經過虛擬網卡設備 (Android 10+) + 啟用雙列顯示 + 設定檔清單以雙列顯示,允許在螢幕上顯示更多內容。需要重啟應用生效。 + 意見回饋 前往 GitHub 回報錯誤 @@ -316,6 +319,14 @@ 匯出完整設定至剪貼簿 + + QR Code + 匯出至剪貼簿 + 匯出完整設定至剪貼簿 + 編輯 + 刪除 + + QR Code 匯出至剪貼簿 diff --git a/V2rayNG/app/src/main/res/values/strings.xml b/V2rayNG/app/src/main/res/values/strings.xml index 7d93c8d9..dfd8240b 100644 --- a/V2rayNG/app/src/main/res/values/strings.xml +++ b/V2rayNG/app/src/main/res/values/strings.xml @@ -217,6 +217,9 @@ Append HTTP Proxy to VPN HTTP proxy will be used directly from (browser/ some supported apps), without going through the virtual NIC device (Android 10+) + Enable double column display + The profile list is displayed in double columns, allowing more content to be displayed on the screen. You need to restart the application to take effect. + Feedback Feedback enhancements or bugs to GitHub @@ -326,6 +329,14 @@ Export full configuration to clipboard + + QRcode + Export to clipboard + Export full configuration to clipboard + Edit + Delete + + QRcode Export to clipboard diff --git a/V2rayNG/app/src/main/res/xml/pref_settings.xml b/V2rayNG/app/src/main/res/xml/pref_settings.xml index 1739a678..8a5f9040 100644 --- a/V2rayNG/app/src/main/res/xml/pref_settings.xml +++ b/V2rayNG/app/src/main/res/xml/pref_settings.xml @@ -75,6 +75,11 @@ android:summary="@string/summary_pref_start_scan_immediate" android:title="@string/title_pref_start_scan_immediate" /> + +