Support desktop hotkey

Support android ipv6 inbound

Support android system dns

fix some bugs
This commit is contained in:
chen08209
2024-09-08 21:21:21 +08:00
parent 61bd4e4549
commit e6da643186
125 changed files with 5898 additions and 4435 deletions
+83 -8
View File
@@ -295,6 +295,10 @@ class AppController {
}
init() async {
final isDisclaimerAccepted = await handlerDisclaimer();
if (!isDisclaimerAccepted) {
system.exit();
}
updateLogStatus();
if (!config.silentLaunch) {
window?.show();
@@ -311,14 +315,6 @@ class AppController {
autoCheckUpdate();
}
updateTray() {
globalState.updateTray(
appState: appState,
config: config,
clashConfig: clashConfig,
);
}
setDelay(Delay delay) {
appState.setDelay(delay);
}
@@ -381,6 +377,47 @@ class AppController {
globalState.showSnackBar(context, message: message);
}
Future<bool> showDisclaimer() async {
return await globalState.showCommonDialog<bool>(
dismissible: false,
child: AlertDialog(
title: Text(appLocalizations.disclaimer),
content: Container(
width: dialogCommonWidth,
constraints: const BoxConstraints(maxHeight: 200),
child: SingleChildScrollView(
child: SelectableText(
appLocalizations.disclaimerDesc,
),
),
),
actions: [
TextButton(
onPressed: () {
Navigator.of(context).pop<bool>(false);
},
child: Text(appLocalizations.exit),
),
TextButton(
onPressed: () {
config.isDisclaimerAccepted = true;
Navigator.of(context).pop<bool>(true);
},
child: Text(appLocalizations.agree),
)
],
),
) ??
false;
}
Future<bool> handlerDisclaimer() async {
if (config.isDisclaimerAccepted) {
return true;
}
return showDisclaimer();
}
addProfileFormURL(String url) async {
if (globalState.navigatorKey.currentState?.canPop() ?? false) {
globalState.navigatorKey.currentState?.popUntil((route) => route.isFirst);
@@ -496,6 +533,44 @@ class AppController {
});
}
updateTun() {
clashConfig.tun = clashConfig.tun.copyWith(
enable: !clashConfig.tun.enable,
);
}
updateSystemProxy() {
config.desktopProps = config.desktopProps.copyWith(
systemProxy: !config.desktopProps.systemProxy,
);
}
updateStart() {
updateStatus(!appState.isStart);
}
updateAutoLaunch() {
config.autoLaunch = !config.autoLaunch;
}
updateVisible() async {
final visible = await window?.isVisible();
if (visible != null && !visible) {
window?.show();
} else {
window?.hide();
}
}
updateMode() {
final index = Mode.values.indexWhere((item) => item == clashConfig.mode);
if (index == -1) {
return;
}
final nextIndex = index + 1 > Mode.values.length - 1 ? 0 : index + 1;
clashConfig.mode = Mode.values[nextIndex];
}
recoveryData(
List<int> data,
RecoveryOption recoveryOption,