certificate & tab sliding optimization

This commit is contained in:
wanghongenpin
2024-03-13 00:33:08 +08:00
parent 672ca2b53d
commit 632ee8cfbd
12 changed files with 111 additions and 162 deletions

View File

@@ -169,10 +169,10 @@
"install": "Install",
"installCaDescribe": "Install CA Setting > Profile Download > Install",
"trustCaDescribe": "Trust CA Setting > General > About > Certificate Trust Setting",
"androidRoot": "ROOT User: Install to system certificate",
"androidRootMagisk": "For Android ROOT users, a Magisk module ProxyPinCA system certificate has been made, restart the phone after installation.",
"androidRoot": "System Certificate (ROOT Device)",
"androidRootMagisk": "Magisk module: \nAndroid ROOT devices can be used Magisk ProxyPinCA System Certificate Module, After installing and restarting the phone Check the system certificate to see if there is a ProxyPinCA certificate. If there is, it indicates that the certificate has been successfully installed。",
"androidRootRename": "If the module does not take effect, you can install the system root certificate according to the online tutorial, and name the root certificate 243f0bfb.0",
"androidUserCA": "Non-ROOT User: Install to user certificate (many apps will not trust user certificates)",
"androidUserCA": "User certificate (many apps will not trust user certificates)",
"androidUserCAInstall": "Open settings -> Security -> Encryption and credentials -> Install certificate -> CA certificate",
"androidUserXposed": "It is recommended to use the Xposed module for packet capture (no need for ROOT), click to view wiki",
"configWifiProxy": "Configure mobile Wi-Fi proxy",

View File

@@ -170,10 +170,10 @@
"install": "安装",
"installCaDescribe": "安装证书 设置 > 已下载描述文件 > 安装",
"trustCaDescribe": "信任证书 设置 > 通用 > 关于本机 > 证书信任设置",
"androidRoot": "ROOT用户: 安装到系统证书",
"androidRootMagisk": "针对安卓ROOT用户做了个Magisk模块ProxyPinCA系统证书安装完重启手机即可。",
"androidRoot": "系统证书 (ROOT设备)",
"androidRootMagisk": "Magisk模块: \n安卓ROOT设备可以使用Magisk ProxyPinCA系统证书模块, 安装完重启手机后 在系统证书查看是否有ProxyPinCA证书如果有说明证书安装成功。",
"androidRootRename": "模块不生效可以根据网上教程安装系统根证书, 根证书命名成 243f0bfb.0",
"androidUserCA": "非ROOT用户: 安装到用户证书(很多软件不会信任用户证书)",
"androidUserCA": "用户证书 (很多软件不会信任用户证书)",
"androidUserCAInstall": "打开设置 -> 安全 -> 加密和凭据 -> 安装证书 -> CA 证书",
"androidUserXposed": "推荐使用Xposed模块抓包(无需ROOT), 点击查看wiki",
"configWifiProxy": "配置手机Wi-Fi代理",

View File

@@ -29,7 +29,7 @@ class AppConfiguration {
bool upgradeNoticeV8 = true;
/// 是否启用画中画
bool pipEnabled = true;
ValueNotifier<bool> pipEnabled = ValueNotifier(true);
///
bool headerExpanded = true;
@@ -116,7 +116,7 @@ class AppConfiguration {
_theme = ThemeModel(mode: mode, useMaterial3: config['useMaterial3'] ?? true);
upgradeNoticeV8 = config['upgradeNoticeV8'] ?? true;
_language = config['language'] == null ? null : Locale.fromSubtags(languageCode: config['language']);
pipEnabled = config['pipEnabled'] ?? true;
pipEnabled.value = config['pipEnabled'] ?? true;
headerExpanded = config['headerExpanded'] ?? true;
iosVpnBackgroundAudioEnable = config['iosVpnBackgroundAudioEnable'];
} catch (e) {
@@ -142,7 +142,7 @@ class AppConfiguration {
'useMaterial3': _theme.useMaterial3,
'upgradeNoticeV8': upgradeNoticeV8,
"language": _language?.languageCode,
'pipEnabled': pipEnabled,
'pipEnabled': pipEnabled.value,
"headerExpanded": headerExpanded,
"iosVpnBackgroundAudioEnable": iosVpnBackgroundAudioEnable == false ? null : iosVpnBackgroundAudioEnable
};

View File

@@ -225,6 +225,7 @@ class NetworkTabState extends State<NetworkTabController> with SingleTickerProvi
return ListView(
controller: scrollController,
physics: const AlwaysScrollableScrollPhysics(),
children: [rowWidget("URI", path), ...message(widget.request.get(), "Request", scrollController)]);
}
@@ -234,7 +235,7 @@ class NetworkTabState extends State<NetworkTabController> with SingleTickerProvi
}
var scrollController = ScrollController();
return ListView(controller: scrollController, children: [
return ListView(controller: scrollController, physics: const AlwaysScrollableScrollPhysics(), children: [
rowWidget("StatusCode", widget.response.get()?.status.toString()),
...message(widget.response.get(), "Response", scrollController)
]);

View File

@@ -200,24 +200,16 @@ class _DesktopHomePagePageState extends State<DesktopHomePage> implements EventL
isCN
? '提示默认不会开启HTTPS抓包请安装证书后再开启HTTPS抓包。\n'
'点击HTTPS抓包(加锁图标),选择安装根证书,按照提示操作即可。\n\n'
'1. 历史记录支持自动缓存时间设置\n'
'2. 历史记录增加搜索\n'
'3. 增加当前视图导出;\n'
'4. 增加屏蔽请求功能\n'
'5. 支持高亮请求;\n'
'6. Android返回键进入小窗口\n'
'7. Android白名单应用列表展示隐藏图标应用\n'
'8. 修复暗黑主题样式;\n'
'1. 展示请求发起的应用图标\n'
'2. 关键词匹配高亮\n'
'3. 脚本批量操作和导入导出;\n'
'4. 脚本支持日志查看通过console.log()输出\n'
: 'TipsBy 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. History support auto cache time setting\n'
'2. History Add Search;\n'
'3. Add current view export;\n'
'4. Support blocking request\n'
'5. Support highlighting requests\n'
'6. Android Return key to enter the small window\n'
'7. Android Whitelist application list display hidden icon applications\n'
'8. Fix dark theme style\n',
'1. Display the application icon initiated by the request\n'
'2. Keyword matching highlights;\n'
'3. Script batch operations and import/export;\n'
'4. The script supports log viewing, output through console.log()\n',
style: const TextStyle(fontSize: 14)));
});
}

View File

@@ -196,76 +196,82 @@ class _SslState extends State<SslWidget> {
builder: (BuildContext context) {
return AlertDialog(
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10.0)),
contentPadding: const EdgeInsets.all(16),
contentPadding: const EdgeInsets.all(5),
title: Row(children: [
Text("Android ${localizations.caInstallGuide}", style: const TextStyle(fontSize: 16)),
const Expanded(child: Align(alignment: Alignment.topRight, child: CloseButton()))
]),
alignment: Alignment.center,
content: SizedBox(
width: 600,
child: ListView(children: [
ExpansionTile(
title: Text(localizations.androidRoot,
style: const TextStyle(fontWeight: FontWeight.w500, fontSize: 14)),
tilePadding: const EdgeInsets.only(left: 0),
expandedCrossAxisAlignment: CrossAxisAlignment.start,
expandedAlignment: Alignment.topLeft,
childrenPadding: const EdgeInsets.only(left: 20),
initiallyExpanded: true,
shape: const Border(),
children: [
Text(localizations.androidRootMagisk),
TextButton(
child: Text(
"https://${isCN ? 'gitee' : 'github'}.com/wanghongenpin/Magisk-ProxyPinCA/releases"),
onPressed: () {
launchUrl(Uri.parse(
"https://${isCN ? 'gitee' : 'github'}.com/wanghongenpin/Magisk-ProxyPinCA/releases"));
}),
SelectableText(localizations.androidRootRename),
]),
const SizedBox(height: 10),
ExpansionTile(
title: Text(localizations.androidUserCA,
style: const TextStyle(fontWeight: FontWeight.w500, fontSize: 14)),
tilePadding: const EdgeInsets.only(left: 0),
expandedCrossAxisAlignment: CrossAxisAlignment.start,
childrenPadding: const EdgeInsets.only(left: 20),
initiallyExpanded: true,
shape: const Border(),
children: [
SelectableText.rich(TextSpan(
text: "1. ${localizations.configWifiProxy} Host$host Port${widget.proxyServer.port}")),
const SizedBox(height: 10),
Row(
children: [
Text("2. ${localizations.caIosBrowser}\t"),
const SelectableText.rich(TextSpan(
text: "http://proxy.pin/ssl", style: TextStyle(decoration: TextDecoration.underline)))
],
),
const SizedBox(height: 10),
Text("3. ${localizations.androidUserCAInstall}"),
const SizedBox(height: 10),
TextButton(
onPressed: () {
launchUrl(Uri.parse(isCN
? "https://gitee.com/wanghongenpin/network-proxy-flutter/wikis/%E5%AE%89%E5%8D%93%E6%97%A0ROOT%E4%BD%BF%E7%94%A8Xposed%E6%A8%A1%E5%9D%97%E6%8A%93%E5%8C%85"
: "https://github.com/wanghongenpin/network_proxy_flutter/wiki/Android-without-ROOT-uses-Xposed-module-to-capture-packets"));
},
child: Text(" ${localizations.androidUserXposed}")),
ClipRRect(
child: Align(
alignment: Alignment.topCenter,
heightFactor: .7,
child: Image.network(
"https://foruda.gitee.com/images/1689352695624941051/74e3bed6_1073801.png",
height: 550,
)))
],
),
])));
child: DefaultTabController(
length: 2,
child: Scaffold(
appBar: TabBar(
tabs: [
Tab(text: localizations.androidRoot),
Tab(text: localizations.androidUserCA),
] as List<Widget>),
body: Padding(
padding: const EdgeInsets.all(10),
child: TabBarView(children: [
ListView(children: [
Text(localizations.androidRootMagisk),
TextButton(
child: Text(
"https://${isCN ? 'gitee' : 'github'}.com/wanghongenpin/Magisk-ProxyPinCA/releases"),
onPressed: () {
launchUrl(Uri.parse(
"https://${isCN ? 'gitee' : 'github'}.com/wanghongenpin/Magisk-ProxyPinCA/releases"));
}),
const SizedBox(height: 10),
SelectableText(localizations.androidRootRename),
const SizedBox(height: 10),
ClipRRect(
child: Align(
alignment: Alignment.topCenter,
child: Image.network(
scale: 0.5,
"https://foruda.gitee.com/images/1710181660282752846/cb520c0b_1073801.png",
height: 460,
)))
]),
ListView(
children: [
SelectableText.rich(TextSpan(
text:
"1. ${localizations.configWifiProxy} Host$host Port${widget.proxyServer.port}")),
const SizedBox(height: 10),
Row(
children: [
Text("2. ${localizations.caAndroidBrowser}\t"),
const SelectableText.rich(TextSpan(
text: "http://proxy.pin/ssl",
style: TextStyle(decoration: TextDecoration.underline)))
],
),
const SizedBox(height: 10),
Text("3. ${localizations.androidUserCAInstall}"),
const SizedBox(height: 10),
TextButton(
onPressed: () {
launchUrl(Uri.parse(isCN
? "https://gitee.com/wanghongenpin/network-proxy-flutter/wikis/%E5%AE%89%E5%8D%93%E6%97%A0ROOT%E4%BD%BF%E7%94%A8Xposed%E6%A8%A1%E5%9D%97%E6%8A%93%E5%8C%85"
: "https://github.com/wanghongenpin/network_proxy_flutter/wiki/Android-without-ROOT-uses-Xposed-module-to-capture-packets"));
},
child: Text(" ${localizations.androidUserXposed}")),
const SizedBox(height: 10),
ClipRRect(
child: Align(
alignment: Alignment.topCenter,
heightFactor: .7,
child: Image.network(
"https://foruda.gitee.com/images/1689352695624941051/74e3bed6_1073801.png",
height: 530,
)))
],
),
])),
))));
});
}

View File

@@ -69,7 +69,7 @@ class DrawerWidget extends StatelessWidget {
onTap: () => navigator(
context, MobileHistory(proxyServer: proxyServer, container: container, historyTask: historyTask)),
),
const Divider(thickness: 0.3),
const Divider(thickness: 0.3, height: 0),
ListTile(
leading: const Icon(Icons.construction),
title: Text(localizations.toolbox),
@@ -84,7 +84,7 @@ class DrawerWidget extends StatelessWidget {
title: Text(localizations.httpsProxy),
leading: const Icon(Icons.https),
onTap: () => navigator(context, MobileSslWidget(proxyServer: proxyServer))),
const Divider(thickness: 0.3),
const Divider(thickness: 0.3, height: 0),
ListTile(
title: Text(localizations.filter),
leading: const Icon(Icons.filter_alt_outlined),
@@ -122,6 +122,7 @@ class DrawerWidget extends StatelessWidget {
title: Text(localizations.about),
leading: const Icon(Icons.info_outline),
onTap: () => navigator(context, const About())),
const SizedBox(height: 20)
],
));
}
@@ -166,9 +167,9 @@ class SettingMenu extends StatelessWidget {
title: Text(localizations.windowMode),
subtitle: Text(localizations.windowModeSubTitle, style: const TextStyle(fontSize: 12)),
trailing: SwitchWidget(
value: appConfiguration.pipEnabled,
value: appConfiguration.pipEnabled.value,
onChanged: (value) {
appConfiguration.pipEnabled = value;
appConfiguration.pipEnabled.value = value;
appConfiguration.flushConfig();
})),
ListTile(

View File

@@ -59,7 +59,7 @@ class MobileHomeState extends State<MobileHomePage> implements EventListener, Li
Future<bool> enterPictureInPicture() async {
if (Vpn.isVpnStarted && !pictureInPictureNotifier.value) {
if (desktop.value.connect || !Platform.isAndroid || !(await (AppConfiguration.instance)).pipEnabled) {
if (desktop.value.connect || !Platform.isAndroid || !(await (AppConfiguration.instance)).pipEnabled.value) {
return false;
}
@@ -170,8 +170,7 @@ class MobileHomeState extends State<MobileHomePage> implements EventListener, Li
}
return Scaffold(
floatingActionButton:
widget.appConfiguration.pipEnabled ? PictureInPictureWindow(proxyServer) : const SizedBox(),
floatingActionButton: PictureInPictureWindow(proxyServer),
body: Scaffold(
appBar: appBar(),
drawer: DrawerWidget(proxyServer: proxyServer, container: container),

View File

@@ -4,6 +4,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:network_proxy/native/pip.dart';
import 'package:network_proxy/network/bin/server.dart';
import 'package:network_proxy/ui/configuration.dart';
import 'package:network_proxy/utils/ip.dart';
class PictureInPictureWindow extends StatefulWidget {
@@ -25,9 +26,17 @@ class _PictureInPictureState extends State<PictureInPictureWindow> {
AppLocalizations get localizations => AppLocalizations.of(context)!;
@override
void initState() {
super.initState();
AppConfiguration.current?.pipEnabled.addListener(() {
setState(() {});
});
}
@override
Widget build(BuildContext context) {
if (Platform.isAndroid) return const SizedBox();
if (Platform.isAndroid || AppConfiguration.current?.pipEnabled.value == false) return const SizedBox();
size ??= MediaQuery.sizeOf(context);
if (size == null || size!.isEmpty) {

View File

@@ -14,7 +14,6 @@ import proxy_manager
import screen_retriever
import share_plus
import url_launcher_macos
import video_player_avfoundation
import window_manager
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
@@ -27,6 +26,5 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
ScreenRetrieverPlugin.register(with: registry.registrar(forPlugin: "ScreenRetrieverPlugin"))
SharePlusMacosPlugin.register(with: registry.registrar(forPlugin: "SharePlusMacosPlugin"))
UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin"))
FVPVideoPlayerPlugin.register(with: registry.registrar(forPlugin: "FVPVideoPlayerPlugin"))
WindowManagerPlugin.register(with: registry.registrar(forPlugin: "WindowManagerPlugin"))
}

View File

@@ -97,14 +97,6 @@ packages:
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.0.3"
csslib:
dependency: transitive
description:
name: csslib
sha256: "706b5707578e0c1b4b7550f64078f0a0f19dec3f50a178ffae7006b0a9ca58fb"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.0.0"
cupertino_icons:
dependency: "direct main"
description:
@@ -350,14 +342,6 @@ packages:
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.2.3"
html:
dependency: transitive
description:
name: html
sha256: "3a7812d5bcd2894edf53dfaf8cd640876cf6cef50a8f238745c8b8120ea74d3a"
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.15.4"
http:
dependency: transitive
description:
@@ -803,47 +787,6 @@ packages:
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.1.4"
video_player:
dependency: "direct main"
description:
path: "packages/video_player/video_player"
ref: "feature/ios-pip"
resolved-ref: b829adec12641d97bef672d8ddbbf0531dd3efe7
url: "https://github.com/icapps/plugins.git"
source: git
version: "2.6.0"
video_player_android:
dependency: transitive
description:
name: video_player_android
sha256: "4dd9b8b86d70d65eecf3dcabfcdfbb9c9115d244d022654aba49a00336d540c2"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.4.12"
video_player_avfoundation:
dependency: transitive
description:
name: video_player_avfoundation
sha256: "309e3962795e761be010869bae65c0b0e45b5230c5cee1bec72197ca7db040ed"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.5.6"
video_player_platform_interface:
dependency: transitive
description:
name: video_player_platform_interface
sha256: "236454725fafcacf98f0f39af0d7c7ab2ce84762e3b63f2cbb3ef9a7e0550bc6"
url: "https://pub.flutter-io.cn"
source: hosted
version: "6.2.2"
video_player_web:
dependency: transitive
description:
name: video_player_web
sha256: "34beb3a07d4331a24f7e7b2f75b8e2b103289038e07e65529699a671b6a6e2cb"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.1.3"
vm_service:
dependency: transitive
description:

View File

@@ -38,11 +38,11 @@ dependencies:
flutter_code_editor:
file_picker: ^6.1.1
flutter_desktop_context_menu: ^0.2.0
video_player:
git:
url: https://github.com/icapps/plugins.git
ref: feature/ios-pip
path: packages/video_player/video_player
# video_player:
# git:
# url: https://github.com/icapps/plugins.git
# ref: feature/ios-pip
# path: packages/video_player/video_player
#dependency_overrides: