diff --git a/assets/images/convert_icon.sh b/assets/images/convert_icon.sh new file mode 100644 index 00000000..63e54110 --- /dev/null +++ b/assets/images/convert_icon.sh @@ -0,0 +1,3 @@ +in=$1 +out=$2 +convert -define icon:auto-resize=128,64,48,32,16 -gravity center $in $out \ No newline at end of file diff --git a/assets/images/tray_icon.png b/assets/images/tray_icon.png index 3b317c99..bd81783a 100644 Binary files a/assets/images/tray_icon.png and b/assets/images/tray_icon.png differ diff --git a/assets/images/tray_icon_connected.png b/assets/images/tray_icon_connected.png new file mode 100644 index 00000000..926dea82 Binary files /dev/null and b/assets/images/tray_icon_connected.png differ diff --git a/assets/images/tray_icon_dark.ico b/assets/images/tray_icon_dark.ico index a3484c58..48121a44 100644 Binary files a/assets/images/tray_icon_dark.ico and b/assets/images/tray_icon_dark.ico differ diff --git a/assets/images/tray_icon_dark.png b/assets/images/tray_icon_dark.png index 0867f8ce..0a078c35 100644 Binary files a/assets/images/tray_icon_dark.png and b/assets/images/tray_icon_dark.png differ diff --git a/assets/images/tray_icon_disconnected.png b/assets/images/tray_icon_disconnected.png new file mode 100644 index 00000000..4b5371e5 Binary files /dev/null and b/assets/images/tray_icon_disconnected.png differ diff --git a/lib/features/system_tray/notifier/system_tray_notifier.dart b/lib/features/system_tray/notifier/system_tray_notifier.dart index 24e06302..5ee9817f 100644 --- a/lib/features/system_tray/notifier/system_tray_notifier.dart +++ b/lib/features/system_tray/notifier/system_tray_notifier.dart @@ -8,6 +8,7 @@ import 'package:hiddify/core/router/router.dart'; import 'package:hiddify/features/config_option/data/config_option_repository.dart'; import 'package:hiddify/features/connection/model/connection_status.dart'; import 'package:hiddify/features/connection/notifier/connection_notifier.dart'; +import 'package:hiddify/features/proxy/active/active_proxy_notifier.dart'; import 'package:hiddify/features/window/notifier/window_notifier.dart'; import 'package:hiddify/gen/assets.gen.dart'; import 'package:hiddify/singbox/model/singbox_config_enum.dart'; @@ -22,12 +23,7 @@ class SystemTrayNotifier extends _$SystemTrayNotifier with AppLogger { @override Future build() async { if (!PlatformUtils.isDesktop) return; - - await trayManager.setIcon( - _trayIconPath, - isTemplate: Platform.isMacOS, - ); - if (!Platform.isLinux) await trayManager.setToolTip(Constants.appName); + ref.watch(activeProxyNotifierProvider).whenData((activeProxy) => setDelay(activeProxy.urlTestDelay)); ConnectionStatus connection; try { @@ -36,8 +32,12 @@ class SystemTrayNotifier extends _$SystemTrayNotifier with AppLogger { loggy.warning("error getting connection status", e); connection = const ConnectionStatus.disconnected(); } - final serviceMode = ref.watch(ConfigOptions.serviceMode); + if (connection == Disconnected()) { + setIcon(connection); + } + + if (!Platform.isLinux) await trayManager.setToolTip(Constants.appName); final t = ref.watch(translationsProvider); final destinations = <(String label, String location)>[ @@ -66,51 +66,49 @@ class SystemTrayNotifier extends _$SystemTrayNotifier with AppLogger { Connected() => t.tray.status.disconnect, Disconnecting() => t.tray.status.disconnecting, }, - checked: connection.isConnected, + // checked: connection.isConnected, + checked: false, disabled: connection.isSwitching, onClick: (_) async { - await ref - .read(connectionNotifierProvider.notifier) - .toggleConnection(); + await ref.read(connectionNotifierProvider.notifier).toggleConnection(); }, ), - MenuItem.submenu( + MenuItem.separator(), + MenuItem( label: t.config.serviceMode, - submenu: Menu( - items: [ - ...ServiceMode.values.map( - (e) => MenuItem.checkbox( - checked: e == serviceMode, - key: e.name, - label: e.present(t), - onClick: (menuItem) async { - final newMode = ServiceMode.values.byName(menuItem.key!); - loggy.debug("switching service mode: [$newMode]"); - await ref - .read(ConfigOptions.serviceMode.notifier) - .update(newMode); - }, - ), - ), - ], - ), - ), - MenuItem.submenu( - label: t.tray.open, - submenu: Menu( - items: [ - ...destinations.map( - (e) => MenuItem( - label: e.$1, - onClick: (_) async { - await ref.read(windowNotifierProvider.notifier).open(); - ref.read(routerProvider).go(e.$2); - }, - ), - ), - ], + icon: Assets.images.trayIconIco, + disabled: true, + ), + + ...ServiceMode.values.map( + (e) => MenuItem.checkbox( + checked: e == serviceMode, + key: e.name, + label: e.present(t), + onClick: (menuItem) async { + final newMode = ServiceMode.values.byName(menuItem.key!); + loggy.debug("switching service mode: [$newMode]"); + await ref.read(ConfigOptions.serviceMode.notifier).update(newMode); + }, ), ), + + // MenuItem.submenu( + // label: t.tray.open, + // submenu: Menu( + // items: [ + // ...destinations.map( + // (e) => MenuItem( + // label: e.$1, + // onClick: (_) async { + // await ref.read(windowNotifierProvider.notifier).open(); + // ref.read(routerProvider).go(e.$2); + // }, + // ), + // ), + // ], + // ), + // ), MenuItem.separator(), MenuItem( label: t.tray.quit, @@ -124,17 +122,60 @@ class SystemTrayNotifier extends _$SystemTrayNotifier with AppLogger { await trayManager.setContextMenu(menu); } - static String get _trayIconPath { + static void setDelay(int delay) { + if (delay > 65000 || delay == 0) { + setIcon(const Disconnecting()); + // else if (delay>1000) + // SystemTrayNotifier.setIcon(timeout ? Disconnecting() : Connecting()); + } else { + setIcon(const Connected()); + } + } + + static void setIcon(ConnectionStatus status) { + if (!PlatformUtils.isDesktop) return; + trayManager + .setIcon( + _trayIconPath(status), + isTemplate: Platform.isMacOS, + ) + .asStream(); + } + + static String _trayIconPath(ConnectionStatus status) { if (Platform.isWindows) { final Brightness brightness = WidgetsBinding.instance.platformDispatcher.platformBrightness; - bool isDarkMode = brightness == Brightness.dark; - if (isDarkMode) { - return Assets.images.trayIconIco; - } else { - return Assets.images.trayIconDarkIco; + final isDarkMode = brightness == Brightness.dark; + switch (status) { + case Connected(): + return Assets.images.trayIconConnectedIco; + case Connecting(): + return Assets.images.trayIconDisconnectedIco; + case Disconnecting(): + return Assets.images.trayIconDisconnectedIco; + case Disconnected(): + if (isDarkMode) { + return Assets.images.trayIconIco; + } else { + return Assets.images.trayIconDarkIco; + } } } - - return Assets.images.trayIconPng.path; + final isDarkMode = false; + switch (status) { + case Connected(): + return Assets.images.trayIconConnectedPng.path; + case Connecting(): + return Assets.images.trayIconDisconnectedPng.path; + case Disconnecting(): + return Assets.images.trayIconDisconnectedPng.path; + case Disconnected(): + if (isDarkMode) { + return Assets.images.trayIconDarkPng.path; + } else { + return Assets.images.trayIconPng.path; + } + } + // return Assets.images.trayIconPng.path; } } diff --git a/pubspec.yaml b/pubspec.yaml index a19e5819..f53a8813 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -127,7 +127,9 @@ flutter: - assets/images/tray_icon_dark.ico - assets/images/tray_icon_dark.png - assets/images/tray_icon_connected.ico + - assets/images/tray_icon_connected.png - assets/images/tray_icon_disconnected.ico + - assets/images/tray_icon_disconnected.png - assets/images/connect_norouz.PNG - assets/images/disconnect_norouz.PNG