v1.7.9: Bug report system with Telegram integration - stable state before auto-diagnostics
Some checks failed
Upload store MSIX to release / upload-store-msix-to-release (push) Has been cancelled
CI / run (push) Has been cancelled

This commit is contained in:
Umbrix Developer
2026-01-22 14:16:14 +03:00
parent 96aec0a3da
commit 58cce2e83c
6 changed files with 161 additions and 6 deletions

View File

@@ -0,0 +1,125 @@
🐛 БАГРЕПОРТ UMBRIX
═══════════════════════════════
📝 ОПИСАНИЕ ПРОБЛЕМЫ:
test3
═══════════════════════════════
💻 УСТРОЙСТВО:
Android AP3A.240905.015.A2.G998BXXSIHYK1
🔌 СТАТУС ПОДКЛЮЧЕНИЯ:
CONNECTED
🌐 ПРОКСИ:
Тип: ProxyType.urltest, Тег: auto, Пинг: 48ms
Задержка: 48ms (✅ Отлично)
🕐 ВРЕМЯ:
2026-01-22T08:09:01.776559
═══════════════════════════════
📋 CORE LOGS (ПОЛНЫЕ):
📋 APP LOGS (ПОЛНЫЕ):
08:07:54.148257 - [D] PreferencesEntry<bool, bool>: getting persisted preference [auto_check_ip](bool)
08:08:07.932215 - [D] PreferencesEntry<bool, dynamic>: getting persisted preference [disable_experimental_feature_notice](bool)
08:08:07.939310 - [D] PreferencesEntry<bool, bool>: getting persisted preference [started_by_user](bool)
08:08:07.939579 - [D] PreferencesEntry<bool, bool>: updating preference [started_by_user](bool) to [true]
08:08:07.948091 - [D] PreferencesEntry<bool, bool>: getting persisted preference [disable_memory_limit](bool)
08:08:07.958412 - [I] ConnectionRepositoryImpl: config options: {
"region": "ru",
"block-ads": false,
"use-xray-core-when-possible": false,
"execute-config-as-is": false,
"log-level": "warn",
"resolve-destination": false,
"ipv6-mode": "ipv4_only",
"remote-dns-address": "udp://1.1.1.1",
"remote-dns-domain-strategy": "",
"direct-dns-address": "1.1.1.1",
"direct-dns-domain-strategy": "",
"mixed-port": 12334,
"tproxy-port": 12335,
"local-dns-port": 16450,
"tun-implementation": "gvisor",
"mtu": 9000,
"strict-route": true,
"connection-test-url": "http://cp.cloudflare.com",
"url-test-interval": 600,
"enable-clash-api": true,
"clash-api-port": 16756,
"enable-tun": true,
"enable-tun-service": false,
"set-system-proxy": false,
"bypass-lan": false,
"allow-connection-from-lan": false,
"enable-fake-dns": false,
"enable-dns-routing": true,
"independent-dns-cache": true,
"rules": [],
"mux": {
"enable": false,
"padding": false,
"max-streams": 8,
"protocol": "h2mux"
},
"tls-tricks": {
"enable-fragment": false,
"fragment-size": "10-30",
"fragment-sleep": "2-8",
"mixed-sni-case": false,
"enable-padding": false,
"padding-size": "1-1500"
},
"warp": {
"enable": false,
"mode": "proxy_over_warp",
"wireguard-config": "",
"license-key": "",
"account-id": "",
"access-token": "",
"clean-ip": "auto",
"clean-port": 0,
"noise": "1-3",
"noise-size": "10-30",
"noise-delay": "10-30",
"noise-mode": "m4"
},
"warp2": {
"enable": false,
"mode": "proxy_over_warp",
"wireguard-config": "",
"license-key": "",
"account-id": "",
"access-token": "",
"clean-ip": "auto",
"clean-port": 0,
"noise": "1-3",
"noise-size": "10-30",
"noise-delay": "10-30",
"noise-mode": "m4"
},
"per-app-proxy-mode": "off",
"included-applications": [],
"excluded-applications": []
}
Memory Limit: true
08:08:07.963095 - [D] ConnectionRepositoryImpl: setting up singbox
08:08:07.966368 - [D] PlatformSingboxService: changing options
08:08:07.969445 - [D] PlatformSingboxService: starting
08:08:09.624780 - [I] ConnectionNotifier: connection status: DISCONNECTED
08:08:10.488389 - [I] ConnectionNotifier: connection status: CONNECTING
08:08:11.299915 - [I] ConnectionNotifier: connection status: CONNECTED
08:08:11.304006 - [D] IpInfoNotifier: disposing
08:08:11.319044 - [D] ProxyRepositoryImpl: getting current ip info using [https://ipwho.is/]
08:08:11.321248 - [D] PlatformSingboxService: watching active groups
08:08:11.328357 - [D] PlatformSingboxService: watching stats
08:08:11.335624 - [D] PreferencesEntry<bool, bool>: getting persisted preference [store_reviewed_by_user](bool)
08:08:11.601832 - [D] PreferencesEntry<bool, bool>: updating preference [store_reviewed_by_user](bool) to [true]
08:08:28.427748 - [E] app: Flutter Error: A RenderFlex overflowed by 31 pixels on the right.
A RenderFlex overflowed by 31 pixels on the right.
08:08:29.908294 - [E] app: Flutter Error: A RenderFlex overflowed by 60 pixels on the bottom.
A RenderFlex overflowed by 60 pixels on the bottom.
08:08:54.476924 - [D] AddProfile: disposing

View File

@@ -502,5 +502,9 @@
"close": "Exit",
"alertMessage": "Hide or Exit the application?",
"remember": "Remember my choice"
},
"bugReport": {
"title": "Report a Problem",
"description": "Send bug report to support with automatic logs"
}
}

View File

@@ -502,5 +502,9 @@
"close": "Закрыть",
"alertMessage": "Скрыть приложение или выйти?",
"remember": "Запомнить выбор"
},
"bugReport": {
"title": "Сообщить о проблеме",
"description": "Отправить багрепорт в техподдержку с автоматическими логами"
}
}

View File

@@ -17,12 +17,9 @@ class AppInfoEntity with _$AppInfoEntity {
required Environment environment,
}) = _AppInfoEntity;
String get userAgent =>
"Umbrix/$version ($operatingSystem) like ClashMeta v2ray sing-box";
String get userAgent => "Umbrix/$version ($operatingSystem) like ClashMeta v2ray sing-box";
String get presentVersion => environment == Environment.prod
? version
: "$version ${environment.name}";
String get presentVersion => environment == Environment.prod ? version : "$version ${environment.name}";
/// formats app info for sharing
String format() => '''

View File

@@ -15,7 +15,7 @@ class BugReportDialog extends HookConsumerWidget {
Widget build(BuildContext context, WidgetRef ref) {
final t = ref.watch(translationsProvider);
final theme = Theme.of(context);
final descriptionController = useTextEditingController();
final isSending = useState(false);
final includeLogs = useState(true);

View File

@@ -12,6 +12,7 @@ import 'package:umbrix/core/theme/app_theme_mode.dart';
import 'package:umbrix/core/localization/locale_preferences.dart';
import 'package:umbrix/core/localization/locale_extensions.dart';
import 'package:umbrix/utils/utils.dart';
import 'package:umbrix/features/bug_report/widget/bug_report_dialog.dart';
abstract interface class RootScaffold {
static final stateKey = GlobalKey<ScaffoldState>();
@@ -206,6 +207,7 @@ class _CustomAdaptiveScaffold extends HookConsumerWidget {
),
const SizedBox(height: 16),
const Divider(),
const _DrawerBugReportItem(),
const _DrawerThemeItem(),
const _DrawerLanguageItem(),
const _DrawerLicensesItem(),
@@ -374,3 +376,26 @@ class _DrawerLicensesItem extends ConsumerWidget {
);
}
}
// Виджет для отправки багрепорта
class _DrawerBugReportItem extends ConsumerWidget {
const _DrawerBugReportItem();
@override
Widget build(BuildContext context, WidgetRef ref) {
final t = ref.watch(translationsProvider);
return ListTile(
leading: const Icon(FluentIcons.bug_20_regular, size: 24),
title: Text(t.bugReport.title),
subtitle: Text(
t.bugReport.description,
style: Theme.of(context).textTheme.bodySmall,
),
onTap: () {
RootScaffold.stateKey.currentState?.closeDrawer();
BugReportDialog.show(context);
},
);
}
}