diff --git a/lib/l10n/app_zh.arb b/lib/l10n/app_zh.arb index 4646793..8a1bc54 100644 --- a/lib/l10n/app_zh.arb +++ b/lib/l10n/app_zh.arb @@ -316,7 +316,7 @@ "hosts": "Hosts 映射", "toAddress": "映射地址", - "appUpdateCheckVersion": "检测更新", + "appUpdateCheckVersion": "检查更新", "appUpdateNotAvailableMsg": "已是最新版本", "appUpdateDialogTitle": "有可用更新", "appUpdateUpdateMsg": "ProxyPin 的新版本现已推出。您想现在更新吗?", diff --git a/lib/ui/component/toolbox/qr_code_page.dart b/lib/ui/component/toolbox/qr_code_page.dart index c1733e0..2b8fcde 100644 --- a/lib/ui/component/toolbox/qr_code_page.dart +++ b/lib/ui/component/toolbox/qr_code_page.dart @@ -27,6 +27,7 @@ import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:flutter_qr_reader_plus/flutter_qr_reader.dart'; import 'package:flutter_toastr/flutter_toastr.dart'; import 'package:image_pickers/image_pickers.dart'; +import 'package:proxypin/ui/component/app_dialog.dart'; import 'package:proxypin/ui/component/qrcode/qr_scan_view.dart'; import 'package:proxypin/ui/component/text_field.dart'; import 'package:proxypin/utils/platform.dart'; @@ -354,7 +355,7 @@ class _QrEncodeState extends State<_QrEncode> with AutomaticKeepAliveClientMixin path = await DesktopMultiWindow.invokeMethod(0, "saveFile", {"fileName": "qrcode.png"}); WindowController.fromWindowId(widget.windowId!).show(); } else { - path = (await FilePicker.platform.saveFile(fileName: "qrcode.png")); + path = (await FilePicker.platform.saveFile(fileName: "qrcode.png", initialDirectory: "~/Downloads")); } if (path == null) return; @@ -364,7 +365,7 @@ class _QrEncodeState extends State<_QrEncode> with AutomaticKeepAliveClientMixin await File(path).writeAsBytes(imageBytes); if (mounted) { - FlutterToastr.show(localizations.saveSuccess, context, duration: 2); + CustomToast.success(localizations.saveSuccess).show(context); } } diff --git a/lib/ui/configuration.dart b/lib/ui/configuration.dart index 20d3144..15baa1f 100644 --- a/lib/ui/configuration.dart +++ b/lib/ui/configuration.dart @@ -71,7 +71,7 @@ class AppConfiguration { Locale? _language; //是否显示更新内容公告 - bool upgradeNoticeV17 = true; + bool upgradeNoticeV18 = true; /// 是否启用画中画 ValueNotifier pipEnabled = ValueNotifier(Platform.isAndroid); @@ -193,7 +193,7 @@ class AppConfiguration { _theme = ThemeModel(mode: mode, useMaterial3: config['useMaterial3'] ?? true); _theme.color = config['themeColor'] ?? "Blue"; - upgradeNoticeV17 = config['upgradeNoticeV17'] ?? true; + upgradeNoticeV18 = config['upgradeNoticeV18'] ?? true; _language = config['language'] == null ? null : Locale.fromSubtags(languageCode: config['language']); pipEnabled.value = config['pipEnabled'] ?? true; pipIcon.value = config['pipIcon'] ?? false; @@ -238,7 +238,7 @@ class AppConfiguration { 'mode': _theme.mode.name, 'themeColor': _theme.color, 'useMaterial3': _theme.useMaterial3, - 'upgradeNoticeV17': upgradeNoticeV17, + 'upgradeNoticeV18': upgradeNoticeV18, "language": _language?.languageCode, "headerExpanded": headerExpanded, if (memoryCleanupThreshold != null) 'memoryCleanupThreshold': memoryCleanupThreshold, diff --git a/lib/ui/desktop/desktop.dart b/lib/ui/desktop/desktop.dart index d8fc7e8..5afd810 100644 --- a/lib/ui/desktop/desktop.dart +++ b/lib/ui/desktop/desktop.dart @@ -90,7 +90,7 @@ class _DesktopHomePagePageState extends State implements EventL proxyServer.addListener(this); panel = NetworkTabController(tabStyle: const TextStyle(fontSize: 16), proxyServer: proxyServer); - if (widget.appConfiguration.upgradeNoticeV17) { + if (widget.appConfiguration.upgradeNoticeV18) { WidgetsBinding.instance.addPostFrameCallback((_) { showUpgradeNotice(); }); @@ -146,39 +146,39 @@ class _DesktopHomePagePageState extends State implements EventL actions: [ TextButton( onPressed: () { - widget.appConfiguration.upgradeNoticeV17 = false; + widget.appConfiguration.upgradeNoticeV18 = false; widget.appConfiguration.flushConfig(); Navigator.pop(context); }, child: Text(localizations.cancel)) ], - title: Text(isCN ? '更新内容V1.1.7' : "Update content V1.1.7", style: const TextStyle(fontSize: 18)), + title: Text(isCN ? '更新内容V${AppConfiguration.version}' : "Update content V${AppConfiguration.version}", + style: const TextStyle(fontSize: 18)), content: Container( constraints: const BoxConstraints(maxWidth: 600), child: SelectableText( isCN ? '提示:默认不会开启HTTPS抓包,请安装证书后再开启HTTPS抓包。\n' '点击HTTPS抓包(加锁图标),选择安装根证书,按照提示操作即可。\n\n' - '1. 新增socks5代理支持, 可在设置中关闭;\n' - '2. 请求列表增加按时间排序;\n' - '3. 响应新增图片保存;\n' - '4. 请求重写新增json格式化;\n' - '5. 修复安卓首次在画中画开启VPN闪退;\n' - '6. 修复Illegal IPv6 address问题;\n' - '7. 修复Windows历史导入安卓har历史文件崩溃问题;\n' - '8. 修复复制python请求头不全问题;\n' - '9. 修复二维码保存的背景颜色问题;\n' + '1. 新增app检查更新;\n' + '2. 关键词高亮支持持久化;\n' + '3. 修复请求域名和tls域名不一致问题;\n' + '4. 修复IPV6建立链接失败问题;\n' + '5. Windows单例窗口,内置VCLibs;\n' + '6. 脚本支持获取应用目录, 脚本修复字节响应请求异常问题, 脚本支持执行多个;\n' + '7. 工具箱js fetch支持代理;\n' + '8. 修复部分curl导入失败问题;\n' : 'Tips:By default, HTTPS packet capture will not be enabled. Please install the certificate before enabling HTTPS packet capture。\n' 'Click HTTPS Capture packets(Lock icon),Choose to install the root certificate and follow the prompts to proceed。\n\n' - '1. Added support for socks5 proxy, which can be turned off in settings;\n' - '2. Add request list sorted by time;\n' - '3. Response to saving newly added images;\n' - '4. Request rewriting to add json format;\n' - '5. Fixed the issue when opening VPN in Picture-in-Picture mode on Android for the first time;\n' - '6. Fix Illegal IPv6 address issue;\n' - '7. Fix Windows history import Android har history file crash issue;\n' - '8. Fix the problem of incomplete copy of python request header;\n' - '9. Fixed the background color issue when saving QR code;\n' + '1. Added app check update;\n' + '2. Keyword highlighting supports persistence;\n' + '3. Fixed TLS SNI inconsistency;\n' + '4. Fixed the issue of IPV6 link establishment failure;\n' + '5. Windows singleton window with built-in VCLibs;\n' + '6. Fixed Illegal IPv6 address issue;\n' + '7. The script supports obtaining application directories, fixes byte response request exception issues, and supports executing multiple instances;\n' + '8. Toolbox js fetch supports proxy;\n' + '9. Fixed some curl import failure issues;\n' '', style: const TextStyle(fontSize: 14)))); }); diff --git a/lib/ui/desktop/left_menus/favorite.dart b/lib/ui/desktop/left_menus/favorite.dart index 24ce444..b0eca06 100644 --- a/lib/ui/desktop/left_menus/favorite.dart +++ b/lib/ui/desktop/left_menus/favorite.dart @@ -29,6 +29,7 @@ import 'package:proxypin/network/channel/host_port.dart'; import 'package:proxypin/network/http/http.dart'; import 'package:proxypin/network/http/http_client.dart'; import 'package:proxypin/storage/favorites.dart'; +import 'package:proxypin/ui/component/app_dialog.dart'; import 'package:proxypin/ui/component/utils.dart'; import 'package:proxypin/ui/component/widgets.dart'; import 'package:proxypin/ui/content/panel.dart'; @@ -86,7 +87,7 @@ class _FavoritesState extends State { panel: widget.panel, onRemove: (Favorite favorite) { FavoriteStorage.removeFavorite(favorite); - FlutterToastr.show(localizations.deleteFavoriteSuccess, context); + CustomToast.success(localizations.deleteFavoriteSuccess).show(context); setState(() {}); }, ); @@ -208,7 +209,7 @@ class _FavoriteItemState extends State<_FavoriteItem> { HttpClients.proxyRequest(httpRequest, proxyInfo: proxyInfo); if (mounted) { - FlutterToastr.show(localizations.reSendRequest, context); + CustomToast.success(localizations.reSendRequest).show(context); } } diff --git a/lib/ui/desktop/request/request.dart b/lib/ui/desktop/request/request.dart index f743220..8c0e7fb 100644 --- a/lib/ui/desktop/request/request.dart +++ b/lib/ui/desktop/request/request.dart @@ -29,6 +29,7 @@ import 'package:proxypin/network/channel/host_port.dart'; import 'package:proxypin/network/http/http.dart'; import 'package:proxypin/network/http/http_client.dart'; import 'package:proxypin/storage/favorites.dart'; +import 'package:proxypin/ui/component/app_dialog.dart'; import 'package:proxypin/ui/component/utils.dart'; import 'package:proxypin/ui/component/widgets.dart'; import 'package:proxypin/ui/content/panel.dart'; @@ -296,7 +297,7 @@ class _RequestWidgetState extends State { var proxyInfo = widget.proxyServer.isRunning ? ProxyInfo.of("127.0.0.1", widget.proxyServer.port) : null; HttpClients.proxyRequest(request, proxyInfo: proxyInfo); - FlutterToastr.show(localizations.reSendRequest, rootNavigator: true, context); + CustomToast.success(localizations.reSendRequest).show(context); } PopupMenuItem popupItem(String text, {VoidCallback? onTap}) { diff --git a/lib/ui/desktop/request/request_editor.dart b/lib/ui/desktop/request/request_editor.dart index 21e3549..688d3ad 100644 --- a/lib/ui/desktop/request/request_editor.dart +++ b/lib/ui/desktop/request/request_editor.dart @@ -29,6 +29,7 @@ import 'package:proxypin/network/http/http_client.dart'; import 'package:proxypin/network/util/logger.dart'; import 'package:proxypin/ui/component/split_view.dart'; import 'package:proxypin/ui/component/state_component.dart'; +import 'package:proxypin/ui/configuration.dart'; import 'package:proxypin/ui/content/body.dart'; import 'package:proxypin/utils/curl.dart'; import 'package:proxypin/utils/lang.dart'; @@ -276,7 +277,7 @@ class _HttpState extends State<_HttpWidget> { message = widget.message; body = TextEditingController(text: widget.message?.bodyAsString); if (widget.message?.headers == null && !widget.readOnly) { - initHeader["User-Agent"] = ["ProxyPin/1.1.7"]; + initHeader["User-Agent"] = ["ProxyPin/${AppConfiguration.version}"]; initHeader["Accept"] = ["*/*"]; return; } diff --git a/lib/ui/mobile/mobile.dart b/lib/ui/mobile/mobile.dart index 38aea23..06964d7 100644 --- a/lib/ui/mobile/mobile.dart +++ b/lib/ui/mobile/mobile.dart @@ -117,7 +117,7 @@ class MobileHomeState extends State implements EventListener, Li proxyServer.addListener(this); proxyServer.start(); - if (widget.appConfiguration.upgradeNoticeV17) { + if (widget.appConfiguration.upgradeNoticeV18) { WidgetsBinding.instance.addPostFrameCallback((_) { showUpgradeNotice(); }); @@ -276,18 +276,19 @@ class MobileHomeState extends State implements EventListener, Li '9. 修复二维码保存的背景颜色问题;\n' : 'Tips:By default, HTTPS packet capture will not be enabled. Please install the certificate before enabling HTTPS packet capture。\n\n' 'Click HTTPS Capture packets(Lock icon),Choose to install the root certificate and follow the prompts to proceed。\n\n' - '1. Added support for socks5 proxy, which can be turned off in settings;\n' - '2. Add request list sorted by time;\n' - '3. Response to saving newly added images;\n' - '4. Request rewriting to add json format;\n' - '5. Fixed the issue when opening VPN in Picture-in-Picture mode on Android for the first time;\n' - '6. Fix Illegal IPv6 address issue;\n' - '7. Fix Windows history import Android har history file crash issue;\n' - '8. Fix the problem of incomplete copy of python request header;\n' - '9. Fixed the background color issue when saving QR code;\n' + '1. Added app check update;\n' + '2. Keyword highlighting supports persistence;\n' + '3. Fixed TLS SNI inconsistency;\n' + '4. Fixed the issue of IPV6 link establishment failure;\n' + '5. Windows singleton window with built-in VCLibs;\n' + '6. Fixed Illegal IPv6 address issue;\n' + '7. The script supports obtaining application directories, fixes byte response request exception issues, and supports executing multiple instances;\n' + '8. Toolbox js fetch supports proxy;\n' + '9. Fixed some curl import failure issues;\n' ''; - showAlertDialog(isCN ? '更新内容V1.1.7' : "Update content V1.1.7", content, () { - widget.appConfiguration.upgradeNoticeV17 = false; + showAlertDialog(isCN ? '更新内容V${AppConfiguration.version}' : "Update content V${AppConfiguration.version}", content, + () { + widget.appConfiguration.upgradeNoticeV18 = false; widget.appConfiguration.flushConfig(); }); } diff --git a/lib/ui/mobile/request/request.dart b/lib/ui/mobile/request/request.dart index 78c86be..1dadaab 100644 --- a/lib/ui/mobile/request/request.dart +++ b/lib/ui/mobile/request/request.dart @@ -36,7 +36,6 @@ import 'package:proxypin/ui/mobile/request/repeat.dart'; import 'package:proxypin/ui/mobile/request/request_editor.dart'; import 'package:proxypin/ui/mobile/setting/request_rewrite.dart'; import 'package:proxypin/ui/mobile/setting/script.dart'; -import 'package:proxypin/ui/mobile/widgets/highlight.dart'; import 'package:proxypin/utils/curl.dart'; import 'package:proxypin/utils/keyword_highlight.dart'; import 'package:proxypin/utils/lang.dart'; diff --git a/lib/ui/mobile/request/request_editor.dart b/lib/ui/mobile/request/request_editor.dart index 0035606..6cf8a0a 100644 --- a/lib/ui/mobile/request/request_editor.dart +++ b/lib/ui/mobile/request/request_editor.dart @@ -25,6 +25,7 @@ import 'package:proxypin/network/channel/host_port.dart'; import 'package:proxypin/network/http/http.dart'; import 'package:proxypin/network/http/http_headers.dart'; import 'package:proxypin/network/http/http_client.dart'; +import 'package:proxypin/ui/configuration.dart'; import 'package:proxypin/ui/content/body.dart'; import 'package:proxypin/utils/curl.dart'; import 'package:proxypin/utils/lang.dart'; @@ -253,7 +254,7 @@ class _HttpState extends State<_HttpWidget> with AutomaticKeepAliveClientMixin { message = widget.message; body = widget.message?.bodyAsString; if (widget.message?.headers == null && !widget.readOnly) { - initHeader["User-Agent"] = ["ProxyPin/1.1.7"]; + initHeader["User-Agent"] = ["ProxyPin/${AppConfiguration.version}"]; initHeader["Accept"] = ["*/*"]; return; } diff --git a/lib/ui/mobile/request/request_sequence.dart b/lib/ui/mobile/request/request_sequence.dart index ab6e984..598fd4c 100644 --- a/lib/ui/mobile/request/request_sequence.dart +++ b/lib/ui/mobile/request/request_sequence.dart @@ -5,7 +5,6 @@ import 'package:proxypin/network/bin/server.dart'; import 'package:proxypin/network/http/http.dart'; import 'package:proxypin/ui/desktop/request/model/search_model.dart'; import 'package:proxypin/ui/mobile/request/request.dart'; -import 'package:proxypin/ui/mobile/widgets/highlight.dart'; import 'package:proxypin/utils/keyword_highlight.dart'; import 'package:proxypin/utils/listenable_list.dart'; diff --git a/lib/utils/har.dart b/lib/utils/har.dart index 746bae3..49abdc7 100644 --- a/lib/utils/har.dart +++ b/lib/utils/har.dart @@ -21,6 +21,7 @@ import 'package:proxypin/network/http/content_type.dart'; import 'package:proxypin/network/http/http.dart'; import 'package:proxypin/network/http/http_headers.dart'; import 'package:proxypin/network/util/process_info.dart'; +import 'package:proxypin/ui/configuration.dart'; class Har { static int maxBodyLength = 1024 * 1024 * 4; @@ -81,7 +82,7 @@ class Har { title = title.contains("ProxyPin") ? title : "[ProxyPin]$title"; har["log"] = { "version": "1.2", - "creator": {"name": "ProxyPin", "version": "1.1.7"}, + "creator": {"name": "ProxyPin", "version": AppConfiguration.version}, "pages": [ { "title": title, diff --git a/linux/build.sh b/linux/build.sh index eba60d1..c7ca9ed 100644 --- a/linux/build.sh +++ b/linux/build.sh @@ -5,7 +5,7 @@ cd ../build/linux/x64/release rm -rf package mkdir -p package/DEBIAN echo "Package: ProxyPin" >> package/DEBIAN/control -echo "Version: 1.1.7" >> package/DEBIAN/control +echo "Version: 1.1.8" >> package/DEBIAN/control echo "Priority: optional" >> package/DEBIAN/control echo "Architecture: amd64" >> package/DEBIAN/control echo "Depends: ca-certificates" >> package/DEBIAN/control diff --git a/pubspec.yaml b/pubspec.yaml index fcaf938..5f40cda 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -2,7 +2,7 @@ name: proxypin description: ProxyPin publish_to: 'none' # Remove this line if you wish to publish to pub.dev -version: 1.1.8+17 +version: 1.1.8+18 environment: sdk: '>=3.0.2 <4.0.0'