feat: mobile-like window size and always-visible stats

- Changed window size to mobile phone format (400x800)
- Removed width condition for ActiveProxyFooter - now always visible
- Added run-umbrix.sh launch script with icon copying
- Stats cards now display on all screen sizes
This commit is contained in:
Umbrix Developer
2026-01-17 13:09:20 +03:00
parent ec5ebbd54b
commit 76a374950f
245 changed files with 7931 additions and 1315 deletions

View File

@@ -2,10 +2,10 @@
import 'package:fluentui_system_icons/fluentui_system_icons.dart';
import 'package:flutter/material.dart';
import 'package:gap/gap.dart';
import 'package:hiddify/core/localization/translations.dart';
import 'package:hiddify/core/widget/animated_visibility.dart';
import 'package:hiddify/core/widget/shimmer_skeleton.dart';
import 'package:hiddify/features/proxy/active/active_proxy_notifier.dart';
import 'package:umbrix/core/localization/translations.dart';
import 'package:umbrix/core/widget/animated_visibility.dart';
import 'package:umbrix/core/widget/shimmer_skeleton.dart';
import 'package:umbrix/features/proxy/active/active_proxy_notifier.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
class ActiveProxyDelayIndicator extends HookConsumerWidget {

View File

@@ -2,15 +2,15 @@ import 'package:dartx/dartx.dart';
import 'package:fluentui_system_icons/fluentui_system_icons.dart';
import 'package:flutter/material.dart';
import 'package:gap/gap.dart';
import 'package:hiddify/core/localization/translations.dart';
import 'package:hiddify/core/widget/animated_visibility.dart';
import 'package:hiddify/core/widget/shimmer_skeleton.dart';
import 'package:hiddify/features/proxy/active/active_proxy_notifier.dart';
import 'package:hiddify/features/proxy/active/ip_widget.dart';
import 'package:hiddify/features/proxy/model/proxy_failure.dart';
import 'package:hiddify/features/stats/notifier/stats_notifier.dart';
import 'package:hiddify/gen/fonts.gen.dart';
import 'package:hiddify/utils/utils.dart';
import 'package:umbrix/core/localization/translations.dart';
import 'package:umbrix/core/widget/animated_visibility.dart';
import 'package:umbrix/core/widget/shimmer_skeleton.dart';
import 'package:umbrix/features/proxy/active/active_proxy_notifier.dart';
import 'package:umbrix/features/proxy/active/ip_widget.dart';
import 'package:umbrix/features/proxy/model/proxy_failure.dart';
import 'package:umbrix/features/stats/notifier/stats_notifier.dart';
import 'package:umbrix/gen/fonts.gen.dart';
import 'package:umbrix/utils/utils.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
class ActiveProxyFooter extends HookConsumerWidget {

View File

@@ -1,16 +1,16 @@
import 'dart:async';
import 'package:dio/dio.dart';
import 'package:hiddify/core/haptic/haptic_service.dart';
import 'package:hiddify/core/preferences/general_preferences.dart';
import 'package:hiddify/core/utils/throttler.dart';
import 'package:hiddify/features/connection/notifier/connection_notifier.dart';
import 'package:hiddify/features/proxy/data/proxy_data_providers.dart';
import 'package:hiddify/features/proxy/model/ip_info_entity.dart';
import 'package:hiddify/features/proxy/model/proxy_entity.dart';
import 'package:hiddify/features/proxy/model/proxy_failure.dart';
import 'package:hiddify/utils/riverpod_utils.dart';
import 'package:hiddify/utils/utils.dart';
import 'package:umbrix/core/haptic/haptic_service.dart';
import 'package:umbrix/core/preferences/general_preferences.dart';
import 'package:umbrix/core/utils/throttler.dart';
import 'package:umbrix/features/connection/notifier/connection_notifier.dart';
import 'package:umbrix/features/proxy/data/proxy_data_providers.dart';
import 'package:umbrix/features/proxy/model/ip_info_entity.dart';
import 'package:umbrix/features/proxy/model/proxy_entity.dart';
import 'package:umbrix/features/proxy/model/proxy_failure.dart';
import 'package:umbrix/utils/riverpod_utils.dart';
import 'package:umbrix/utils/utils.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
part 'active_proxy_notifier.g.dart';
@@ -19,7 +19,7 @@ part 'active_proxy_notifier.g.dart';
class IpInfoNotifier extends _$IpInfoNotifier with AppLogger {
@override
Future<IpInfo> build() async {
ref.disposeDelay(const Duration(seconds: 20));
ref.disposeDelay(const Duration(seconds: 120));
final cancelToken = CancelToken();
Timer? timer;
ref.onDispose(() {
@@ -48,13 +48,12 @@ class IpInfoNotifier extends _$IpInfoNotifier with AppLogger {
final info = await ref.watch(proxyRepositoryProvider).getCurrentIpInfo(cancelToken).getOrElse(
(err) {
loggy.warning("error getting proxy ip info", err, StackTrace.current);
// throw err; //hiddify: remove exception to be logged
throw const UnknownIp();
},
).run();
timer = Timer(
const Duration(seconds: 10),
const Duration(seconds: 60),
() {
loggy.debug("entering idle mode");
_idle = true;

View File

@@ -1,10 +1,10 @@
import 'package:circle_flags/circle_flags.dart';
import 'package:flutter/material.dart';
import 'package:hiddify/core/haptic/haptic_service.dart';
import 'package:hiddify/core/localization/translations.dart';
import 'package:hiddify/core/utils/ip_utils.dart';
import 'package:hiddify/gen/fonts.gen.dart';
import 'package:hiddify/utils/riverpod_utils.dart';
import 'package:umbrix/core/haptic/haptic_service.dart';
import 'package:umbrix/core/localization/translations.dart';
import 'package:umbrix/core/utils/ip_utils.dart';
import 'package:umbrix/gen/fonts.gen.dart';
import 'package:umbrix/utils/riverpod_utils.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
final _showIp = StateProvider.autoDispose((ref) {