Add debug export to clipboard

This commit is contained in:
problematicconsumer
2023-10-06 23:42:06 +03:30
parent 9f711cd666
commit 6f35dc2201
10 changed files with 64 additions and 11 deletions

View File

@@ -10,7 +10,8 @@
"disable": "Disable" "disable": "Disable"
}, },
"sort": "Sort", "sort": "Sort",
"sortBy": "Sort by" "sortBy": "Sort by",
"addToClipboard": "Add to clipboard"
}, },
"intro": { "intro": {
"termsAndPolicyCaution(rich)": "by continuing you agree with ${tap(@:about.termsAndConditions)}", "termsAndPolicyCaution(rich)": "by continuing you agree with ${tap(@:about.termsAndConditions)}",
@@ -167,7 +168,7 @@
}, },
"pageTitle": "Config Options", "pageTitle": "Config Options",
"executeConfigAsIs": "Execute Config As Is", "executeConfigAsIs": "Execute Config As Is",
"executeConfigAsIsMsg": "Executes the SingBox configs with minimal changes.", "executeConfigAsIsMsg": "Executes the SingBox configs with minimal changes. Can cause problems.",
"logLevel": "Log Level", "logLevel": "Log Level",
"resolveDestination": "Resolve Destination", "resolveDestination": "Resolve Destination",
"ipv6Mode": "IPv6 Route", "ipv6Mode": "IPv6 Route",

View File

@@ -10,7 +10,8 @@
"disable": "غیر فعال" "disable": "غیر فعال"
}, },
"sort": "مرتب‌سازی", "sort": "مرتب‌سازی",
"sortBy": "مرتب‌سازی براساس" "sortBy": "مرتب‌سازی براساس",
"addToClipboard": "افزودن به کلیپ‌بورد"
}, },
"intro": { "intro": {
"termsAndPolicyCaution(rich)": "در صورت ادامه با ${tap(@:about.termsAndConditions)} موافقت میکنید", "termsAndPolicyCaution(rich)": "در صورت ادامه با ${tap(@:about.termsAndConditions)} موافقت میکنید",
@@ -256,4 +257,4 @@
"short_description": "Auto, SSH, VLESS, Vmess, Trojan, Reality, Sing-Box, Clash, Xray, Shadowsocks", "short_description": "Auto, SSH, VLESS, Vmess, Trojan, Reality, Sing-Box, Clash, Xray, Shadowsocks",
"full_description": "هدف اصلی HiddifyNext ارائه یک کلاینت تونل زنی ایمن، کاربرپسند و کارآمد است. این به شما امکان می دهد تا با استفاده از مجوز VPN-Service، تمام ترافیک یا ترافیک برنامه انتخابی را به یک سرور راه دور مورد نظر خود هدایت کنید.\n\nتوجه: ما هیچ سروری ارائه نمی دهیم. کاربران موظفند با استفاده از سرورهای خود میزبان یا سرورهای مورد اعتماد، فعالیت‌های آنلاین خود را خصوصی نگه دارند.\n \nما از سرورهایی با موارد زیر پشتیبانی می کنیم:\n- لینک اشتراک V2ray/Xray معمولی\n- لینک اشتراک کلش\n- لینک اشتراک Sing-Box\n\nویژگی های منحصر به فرد ما چیست؟\n - کاربر پسند\n - بهینه و سریع\n - به طور خودکار LowestPing را انتخاب کنید\n - نمایش اطلاعات استفاده کاربر\n - به راحتی لینک فرعی را با یک کلیک با استفاده از دیپ لینک وارد کنید\n - رایگان و بدون تبلیغات\n - به راحتی پیوندهای فرعی کاربر را تغییر دهید\n - بیشتر و بیشتر\n\nحمایت کردن:\n- تمام پروتکل های پشتیبانی شده توسط Sing-Box\n- VLESS + xtls \n- VMESS\n- تروجان\n- ShoadowSocks\n- ریالیتی\n- V2ray\n- هیستریا 2\n- TUIC\n- SSH\n- ShadowTLS\n\n\nکد منبع در https://github.com/hiddify/Hiddify-Next وجود دارد\nهسته برنامه بر اساس sing-box منبع باز است.\n\nتوضیحات مجوز:\n- سرویس VPN: از آنجا که هدف این برنامه ارائه یک کلاینت تونل زنی ایمن، کاربر پسند و کارآمد است، ما به این مجوز نیاز داریم تا بتوانیم ترافیک را از طریق تونل به سرور راه دور هدایت کنیم.\n- QUERY ALL PACKAGES: این مجوز برای اجازه دادن به کاربران برای گنجاندن یا حذف برنامه های کاربردی خاص برای تونل زدن استفاده می شود.\n- دریافت بوت تکمیل شد: این مجوز را می توان از تنظیمات برنامه فعال یا غیرفعال کرد تا این برنامه پس از بوت شدن دستگاه فعال شود.\n- اعلان های ارسالی: این مجوز ضروری است زیرا ما از یک سرویس پیش زمینه برای اطمینان از عملکرد مداوم سرویس VPN استفاده می کنیم.\n- این برنامه بدون تبلیغات است. تجزیه و تحلیل و داده های اشکال فقط با رضایت صریح کاربر در اولین استفاده از برنامه اتفاق می افتد." "full_description": "هدف اصلی HiddifyNext ارائه یک کلاینت تونل زنی ایمن، کاربرپسند و کارآمد است. این به شما امکان می دهد تا با استفاده از مجوز VPN-Service، تمام ترافیک یا ترافیک برنامه انتخابی را به یک سرور راه دور مورد نظر خود هدایت کنید.\n\nتوجه: ما هیچ سروری ارائه نمی دهیم. کاربران موظفند با استفاده از سرورهای خود میزبان یا سرورهای مورد اعتماد، فعالیت‌های آنلاین خود را خصوصی نگه دارند.\n \nما از سرورهایی با موارد زیر پشتیبانی می کنیم:\n- لینک اشتراک V2ray/Xray معمولی\n- لینک اشتراک کلش\n- لینک اشتراک Sing-Box\n\nویژگی های منحصر به فرد ما چیست؟\n - کاربر پسند\n - بهینه و سریع\n - به طور خودکار LowestPing را انتخاب کنید\n - نمایش اطلاعات استفاده کاربر\n - به راحتی لینک فرعی را با یک کلیک با استفاده از دیپ لینک وارد کنید\n - رایگان و بدون تبلیغات\n - به راحتی پیوندهای فرعی کاربر را تغییر دهید\n - بیشتر و بیشتر\n\nحمایت کردن:\n- تمام پروتکل های پشتیبانی شده توسط Sing-Box\n- VLESS + xtls \n- VMESS\n- تروجان\n- ShoadowSocks\n- ریالیتی\n- V2ray\n- هیستریا 2\n- TUIC\n- SSH\n- ShadowTLS\n\n\nکد منبع در https://github.com/hiddify/Hiddify-Next وجود دارد\nهسته برنامه بر اساس sing-box منبع باز است.\n\nتوضیحات مجوز:\n- سرویس VPN: از آنجا که هدف این برنامه ارائه یک کلاینت تونل زنی ایمن، کاربر پسند و کارآمد است، ما به این مجوز نیاز داریم تا بتوانیم ترافیک را از طریق تونل به سرور راه دور هدایت کنیم.\n- QUERY ALL PACKAGES: این مجوز برای اجازه دادن به کاربران برای گنجاندن یا حذف برنامه های کاربردی خاص برای تونل زدن استفاده می شود.\n- دریافت بوت تکمیل شد: این مجوز را می توان از تنظیمات برنامه فعال یا غیرفعال کرد تا این برنامه پس از بوت شدن دستگاه فعال شود.\n- اعلان های ارسالی: این مجوز ضروری است زیرا ما از یک سرویس پیش زمینه برای اطمینان از عملکرد مداوم سرویس VPN استفاده می کنیم.\n- این برنامه بدون تبلیغات است. تجزیه و تحلیل و داده های اشکال فقط با رضایت صریح کاربر در اولین استفاده از برنامه اتفاق می افتد."
} }
} }

View File

@@ -10,7 +10,8 @@
"disable": "Выключить" "disable": "Выключить"
}, },
"sort": "Сортировать", "sort": "Сортировать",
"sortBy": "Сортировать по" "sortBy": "Сортировать по",
"addToClipboard": ""
}, },
"intro": { "intro": {
"termsAndPolicyCaution(rich)": "продолжая, вы соглашаетесь с ${tap(@:about.termsAndConditions)}", "termsAndPolicyCaution(rich)": "продолжая, вы соглашаетесь с ${tap(@:about.termsAndConditions)}",
@@ -256,4 +257,4 @@
"short_description": "Auto, SSH, VLESS, Vmess, Trojan, Reality, Sing-Box, Clash, Xray, Shadowsocks", "short_description": "Auto, SSH, VLESS, Vmess, Trojan, Reality, Sing-Box, Clash, Xray, Shadowsocks",
"full_description": "Основная цель HiddifyNext — предоставить безопасный, удобный и эффективный клиент туннелирования. Он позволяет вам направлять весь трафик или трафик выбранного приложения на выбранный вами удаленный сервер, используя разрешение VPN-сервиса.\n\nПримечание. Мы не предоставляем сервер; пользователи обязаны обеспечивать конфиденциальность своих действий в Интернете, используя собственный сервер или доверенные серверы.\n \nМы поддерживаем серверы с:\n- Обычная ссылка на подписку V2ray/Xray\n- Ссылка на подписку Clash\n- Ссылка на подписку на Sing-Box\n\nВ чем наши уникальные особенности?\n - Удобный\n - Оптимизированный и быстрый\n - Автоматически выбирать LowestPing\n - Показать информацию об использовании пользователя\n - Легко импортируйте подссылку одним щелчком мыши, используя диплинкинг.\n - Бесплатно и без рекламы\n - Легко переключать пользовательские подссылки\n - все больше и больше\n\nПоддерживать:\n- Все протоколы поддерживаются Sing-Box\n- VLESS + xtls реальность, видение\n- ВМЭСС\n- Троян\n- Носки Шоадоу\n- Реальность\n- В2рей\n- Гистрия2\n- ТУИК\n- SSH\n- ТеньTLS\n\n\nИсходный код доступен по адресу https://github.com/hiddify/Hiddify-Next.\nЯдро приложения основано на Sing-Box с открытым исходным кодом.\n\nОписание разрешения:\n- Служба VPN: поскольку целью этого приложения является предоставление безопасного, удобного и эффективного клиента туннелирования, нам нужно это разрешение, чтобы иметь возможность направлять трафик через туннель на удаленный сервер.\n- ЗАПРОС ВСЕХ ПАКЕТОВ: это разрешение позволяет пользователям включать или исключать определенные приложения для туннелирования.\n- ПОЛУЧИТЬ ЗАГРУЗКУ ЗАВЕРШЕНА: это разрешение можно включить или отключить в настройках приложения, чтобы активировать это приложение при загрузке устройства.\n- ПОСТ-УВЕДОМЛЕНИЯ: это разрешение необходимо, поскольку мы используем приоритетную службу для обеспечения непрерывной работы службы VPN.\n- Это приложение свободно от рекламы. Аналитика и данные о сбоях происходят только с явного согласия пользователя при первом использовании приложения." "full_description": "Основная цель HiddifyNext — предоставить безопасный, удобный и эффективный клиент туннелирования. Он позволяет вам направлять весь трафик или трафик выбранного приложения на выбранный вами удаленный сервер, используя разрешение VPN-сервиса.\n\nПримечание. Мы не предоставляем сервер; пользователи обязаны обеспечивать конфиденциальность своих действий в Интернете, используя собственный сервер или доверенные серверы.\n \nМы поддерживаем серверы с:\n- Обычная ссылка на подписку V2ray/Xray\n- Ссылка на подписку Clash\n- Ссылка на подписку на Sing-Box\n\nВ чем наши уникальные особенности?\n - Удобный\n - Оптимизированный и быстрый\n - Автоматически выбирать LowestPing\n - Показать информацию об использовании пользователя\n - Легко импортируйте подссылку одним щелчком мыши, используя диплинкинг.\n - Бесплатно и без рекламы\n - Легко переключать пользовательские подссылки\n - все больше и больше\n\nПоддерживать:\n- Все протоколы поддерживаются Sing-Box\n- VLESS + xtls реальность, видение\n- ВМЭСС\n- Троян\n- Носки Шоадоу\n- Реальность\n- В2рей\n- Гистрия2\n- ТУИК\n- SSH\n- ТеньTLS\n\n\nИсходный код доступен по адресу https://github.com/hiddify/Hiddify-Next.\nЯдро приложения основано на Sing-Box с открытым исходным кодом.\n\nОписание разрешения:\n- Служба VPN: поскольку целью этого приложения является предоставление безопасного, удобного и эффективного клиента туннелирования, нам нужно это разрешение, чтобы иметь возможность направлять трафик через туннель на удаленный сервер.\n- ЗАПРОС ВСЕХ ПАКЕТОВ: это разрешение позволяет пользователям включать или исключать определенные приложения для туннелирования.\n- ПОЛУЧИТЬ ЗАГРУЗКУ ЗАВЕРШЕНА: это разрешение можно включить или отключить в настройках приложения, чтобы активировать это приложение при загрузке устройства.\n- ПОСТ-УВЕДОМЛЕНИЯ: это разрешение необходимо, поскольку мы используем приоритетную службу для обеспечения непрерывной работы службы VPN.\n- Это приложение свободно от рекламы. Аналитика и данные о сбоях происходят только с явного согласия пользователя при первом использовании приложения."
} }
} }

View File

@@ -10,7 +10,8 @@
"disable": "停用" "disable": "停用"
}, },
"sort": "排序", "sort": "排序",
"sortBy": "排序方式" "sortBy": "排序方式",
"addToClipboard": ""
}, },
"intro": { "intro": {
"termsAndPolicyCaution(rich)": "继续即表示您同意 ${tap(@:about.termsAndConditions)}", "termsAndPolicyCaution(rich)": "继续即表示您同意 ${tap(@:about.termsAndConditions)}",
@@ -256,4 +257,4 @@
"short_description": "自动SSH, VLESS, Vmess, Trojan, Reality, Sing-Box, Clash, Xray, Shadowsocks", "short_description": "自动SSH, VLESS, Vmess, Trojan, Reality, Sing-Box, Clash, Xray, Shadowsocks",
"full_description": "HiddifyNext 的主要目标是提供安全、用户友好且高效的隧道客户端。它使您能够利用 VPN 服务权限将所有流量或选定的应用程序流量路由到您选择的远程服务器。\n\n注我们不提供任何服务器用户需要使用自己的自托管服务器或受信任的服务器来确保其在线活动的私密性。\n \n我们支持以下类型的服务器\n- 普通V2ray/Xray订阅链接\n- Clash订阅链接\n- Sing-Box 订阅链接\n\n我们的独特特点是什么\n\n-用户友好\n-优化和高速\n-自动选择最低延迟\n-显示用户使用信息\n-通过一键深度链接轻松导入子链接\n-免费且无广告\n-轻松切换用户子链接\n-等等\n\n支持\n- Sing-Box 支持的所有协议\n- VLESS + xtls 现实、愿景\n- VMESS\n- Trojan\n- ShoadowSocks\n- Reality\n-V2ray\n- Hystria2\n- TUIC\n- SSH\n- ShadowTLS\n\n\n源代码位于https://github.com/hiddify/Hiddify-Next\n应用程序核心基于开源的Sing-Box。\n\n权限说明\n\nVPN服务由于此应用程序的目标是提供安全、用户友好和高效的隧道客户端我们需要此权限以能够通过隧道将流量路由到远程服务器。\n查询所有包此权限用于允许用户包括或排除特定应用程序以进行隧道传输。\n接收启动完成此权限可以从应用程序设置中启用或禁用以在设备启动时激活此应用程序。\n发送通知此权限是必需的因为我们使用前台服务来确保VPN服务的持续运行。\n此应用程序没有广告。分析和崩溃数据仅在用户在首次使用应用程序时明确同意的情况下发生。" "full_description": "HiddifyNext 的主要目标是提供安全、用户友好且高效的隧道客户端。它使您能够利用 VPN 服务权限将所有流量或选定的应用程序流量路由到您选择的远程服务器。\n\n注我们不提供任何服务器用户需要使用自己的自托管服务器或受信任的服务器来确保其在线活动的私密性。\n \n我们支持以下类型的服务器\n- 普通V2ray/Xray订阅链接\n- Clash订阅链接\n- Sing-Box 订阅链接\n\n我们的独特特点是什么\n\n-用户友好\n-优化和高速\n-自动选择最低延迟\n-显示用户使用信息\n-通过一键深度链接轻松导入子链接\n-免费且无广告\n-轻松切换用户子链接\n-等等\n\n支持\n- Sing-Box 支持的所有协议\n- VLESS + xtls 现实、愿景\n- VMESS\n- Trojan\n- ShoadowSocks\n- Reality\n-V2ray\n- Hystria2\n- TUIC\n- SSH\n- ShadowTLS\n\n\n源代码位于https://github.com/hiddify/Hiddify-Next\n应用程序核心基于开源的Sing-Box。\n\n权限说明\n\nVPN服务由于此应用程序的目标是提供安全、用户友好和高效的隧道客户端我们需要此权限以能够通过隧道将流量路由到远程服务器。\n查询所有包此权限用于允许用户包括或排除特定应用程序以进行隧道传输。\n接收启动完成此权限可以从应用程序设置中启用或禁用以在设备启动时激活此应用程序。\n发送通知此权限是必需的因为我们使用前台服务来确保VPN服务的持续运行。\n此应用程序没有广告。分析和崩溃数据仅在用户在首次使用应用程序时明确同意的情况下发生。"
} }
} }

View File

@@ -88,9 +88,7 @@ Future<void> _lazyBootstrap(
await filesEditor.init(); await filesEditor.init();
initLoggers(container.read, debug); initLoggers(container.read, debug);
_logger.info( _logger.info(container.read(appInfoProvider).format());
"os: [${Platform.operatingSystem}](${Platform.operatingSystemVersion}), processor count [${Platform.numberOfProcessors}]",
);
final silentStart = container.read(silentStartNotifierProvider); final silentStart = container.read(silentStartNotifierProvider);
if (silentStart) { if (silentStart) {

View File

@@ -25,6 +25,7 @@ class AppRepositoryImpl
release: Release.read(), release: Release.read(),
installerMedia: packageInfo.installerStore, installerMedia: packageInfo.installerStore,
operatingSystem: Platform.operatingSystem, operatingSystem: Platform.operatingSystem,
operatingSystemVersion: Platform.operatingSystemVersion,
environment: environment, environment: environment,
); );
} }

View File

@@ -16,6 +16,7 @@ class AppInfo with _$AppInfo {
required Release release, required Release release,
String? installerMedia, String? installerMedia,
required String operatingSystem, required String operatingSystem,
required String operatingSystemVersion,
required Environment environment, required Environment environment,
}) = _AppInfo; }) = _AppInfo;
@@ -25,6 +26,12 @@ class AppInfo with _$AppInfo {
? version ? version
: "$version ${environment.name}"; : "$version ${environment.name}";
/// formats app info for sharing
String format() => '''
$name v$version ($buildNumber) ${environment.name}
${release.name} release ${installerMedia != null ? "via $installerMedia" : ""}
$operatingSystem [$operatingSystemVersion]''';
factory AppInfo.fromJson(Map<String, dynamic> json) => factory AppInfo.fromJson(Map<String, dynamic> json) =>
_$AppInfoFromJson(json); _$AppInfoFromJson(json);
} }

View File

@@ -1,3 +1,5 @@
import 'dart:convert';
import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:hiddify/core/prefs/prefs.dart'; import 'package:hiddify/core/prefs/prefs.dart';
import 'package:hiddify/utils/platform_utils.dart'; import 'package:hiddify/utils/platform_utils.dart';
@@ -7,6 +9,8 @@ part 'config_options.g.dart';
@freezed @freezed
class ConfigOptions with _$ConfigOptions { class ConfigOptions with _$ConfigOptions {
const ConfigOptions._();
@JsonSerializable(fieldRename: FieldRename.kebab) @JsonSerializable(fieldRename: FieldRename.kebab)
const factory ConfigOptions({ const factory ConfigOptions({
@Default(false) bool executeConfigAsIs, @Default(false) bool executeConfigAsIs,
@@ -36,6 +40,11 @@ class ConfigOptions with _$ConfigOptions {
setSystemProxy: PlatformUtils.isDesktop, setSystemProxy: PlatformUtils.isDesktop,
); );
String format() {
const encoder = JsonEncoder.withIndent(' ');
return encoder.convert(toJson());
}
factory ConfigOptions.fromJson(Map<String, dynamic> json) => factory ConfigOptions.fromJson(Map<String, dynamic> json) =>
_$ConfigOptionsFromJson(json); _$ConfigOptionsFromJson(json);
} }

View File

@@ -1,4 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:gap/gap.dart'; import 'package:gap/gap.dart';
import 'package:hiddify/core/core_providers.dart'; import 'package:hiddify/core/core_providers.dart';
import 'package:hiddify/domain/constants.dart'; import 'package:hiddify/domain/constants.dart';
@@ -45,6 +46,22 @@ class AboutPage extends HookConsumerWidget {
slivers: [ slivers: [
SliverAppBar( SliverAppBar(
title: Text(t.about.pageTitle), title: Text(t.about.pageTitle),
actions: [
PopupMenuButton(
itemBuilder: (context) {
return [
PopupMenuItem(
child: Text(t.general.addToClipboard),
onTap: () {
Clipboard.setData(
ClipboardData(text: appInfo.format()),
);
},
),
];
},
),
],
), ),
SliverToBoxAdapter( SliverToBoxAdapter(
child: Padding( child: Padding(

View File

@@ -1,4 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:gap/gap.dart'; import 'package:gap/gap.dart';
import 'package:hiddify/core/core_providers.dart'; import 'package:hiddify/core/core_providers.dart';
import 'package:hiddify/core/prefs/prefs.dart'; import 'package:hiddify/core/prefs/prefs.dart';
@@ -23,6 +24,22 @@ class ConfigOptionsPage extends HookConsumerWidget {
return Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBar(
title: Text(t.settings.config.pageTitle), title: Text(t.settings.config.pageTitle),
actions: [
PopupMenuButton(
itemBuilder: (context) {
return [
PopupMenuItem(
child: Text(t.general.addToClipboard),
onTap: () {
Clipboard.setData(
ClipboardData(text: options.format()),
);
},
),
];
},
),
],
), ),
body: ListView( body: ListView(
children: [ children: [