From 45b9c4f26c781da5e6460dd264747b0f27e17118 Mon Sep 17 00:00:00 2001 From: Christian Pauly Date: Tue, 22 Dec 2020 14:23:23 +0100 Subject: [PATCH] chore: Update SDK and logviewer --- lib/components/matrix.dart | 2 - lib/views/log_view.dart | 183 +++++++++++++++++++++++++++++++++++++ lib/views/settings.dart | 10 +- pubspec.lock | 18 +--- pubspec.yaml | 1 - 5 files changed, 187 insertions(+), 27 deletions(-) create mode 100644 lib/views/log_view.dart diff --git a/lib/components/matrix.dart b/lib/components/matrix.dart index a07ca360..2d527b7b 100644 --- a/lib/components/matrix.dart +++ b/lib/components/matrix.dart @@ -15,7 +15,6 @@ import 'package:flushbar/flushbar.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:logger_flutter/logger_flutter.dart'; import 'package:universal_html/prefer_universal/html.dart' as html; import 'package:url_launcher/url_launcher.dart'; import 'package:path_provider/path_provider.dart'; @@ -308,7 +307,6 @@ class MatrixState extends State { } void initMatrix() { - LogConsole.init(); clientName = '${AppConfig.applicationName} ${kIsWeb ? 'Web' : Platform.operatingSystem}'; final Set verificationMethods = { diff --git a/lib/views/log_view.dart b/lib/views/log_view.dart new file mode 100644 index 00000000..e205473f --- /dev/null +++ b/lib/views/log_view.dart @@ -0,0 +1,183 @@ +import 'package:famedlysdk/famedlysdk.dart'; +import 'package:flutter/material.dart'; +import 'package:logger/logger.dart'; + +class LogViewer extends StatefulWidget { + @override + _LogViewerState createState() => _LogViewerState(); +} + +class _LogViewerState extends State { + Level logLevel = Level.debug; + double fontSize = 14; + @override + Widget build(BuildContext context) { + final outputEvents = Logs() + .outputEvents + .where((e) => e.level.index >= logLevel.index) + .toList(); + return Scaffold( + backgroundColor: Colors.black, + appBar: AppBar( + title: Text(logLevel.toString()), + leading: BackButton(), + actions: [ + IconButton( + icon: Icon(Icons.zoom_in_outlined), + onPressed: () => setState(() => fontSize++), + ), + IconButton( + icon: Icon(Icons.zoom_out_outlined), + onPressed: () => setState(() => fontSize--), + ), + PopupMenuButton( + itemBuilder: (context) => Level.values + .map((level) => PopupMenuItem( + child: Text(level.toString()), + value: level, + )) + .toList(), + onSelected: (Level level) => setState(() => logLevel = level), + ), + ], + ), + body: ListView.builder( + itemCount: outputEvents.length, + itemBuilder: (context, i) => SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: RichText( + text: TextSpan( + style: TextStyle(fontSize: fontSize), + children: _AnsiParser(outputEvents[i].lines.join('\n')).spans, + ), + ), + ), + ), + ); + } +} + +class _AnsiParser { + static const TEXT = 0, BRACKET = 1, CODE = 2; + final String text; + + Color foreground; + Color background; + List spans; + + _AnsiParser(this.text) { + final s = this.text; + spans = []; + var state = TEXT; + StringBuffer buffer; + var text = StringBuffer(); + var code = 0; + List codes; + + for (var i = 0, n = s.length; i < n; i++) { + var c = s[i]; + + switch (state) { + case TEXT: + if (c == '\u001b') { + state = BRACKET; + buffer = StringBuffer(c); + code = 0; + codes = []; + } else { + text.write(c); + } + break; + + case BRACKET: + buffer.write(c); + if (c == '[') { + state = CODE; + } else { + state = TEXT; + text.write(buffer); + } + break; + + case CODE: + buffer.write(c); + var codeUnit = c.codeUnitAt(0); + if (codeUnit >= 48 && codeUnit <= 57) { + code = code * 10 + codeUnit - 48; + continue; + } else if (c == ';') { + codes.add(code); + code = 0; + continue; + } else { + if (text.isNotEmpty) { + spans.add(createSpan(text.toString())); + text.clear(); + } + state = TEXT; + if (c == 'm') { + codes.add(code); + handleCodes(codes); + } else { + text.write(buffer); + } + } + + break; + } + } + + spans.add(createSpan(text.toString())); + } + + void handleCodes(List codes) { + if (codes.isEmpty) { + codes.add(0); + } + + switch (codes[0]) { + case 0: + foreground = getColor(0, true); + background = getColor(0, false); + break; + case 38: + foreground = getColor(codes[2], true); + break; + case 39: + foreground = getColor(0, true); + break; + case 48: + background = getColor(codes[2], false); + break; + case 49: + background = getColor(0, false); + } + } + + Color getColor(int colorCode, bool foreground) { + switch (colorCode) { + case 0: + return foreground ? Colors.black : Colors.transparent; + case 12: + return Colors.lightBlue[300]; + case 208: + return Colors.orange[300]; + case 196: + return Colors.red[300]; + case 199: + return Colors.pink[300]; + default: + return Colors.white; + } + } + + TextSpan createSpan(String text) { + return TextSpan( + text: text, + style: TextStyle( + color: foreground, + backgroundColor: background, + ), + ); + } +} diff --git a/lib/views/settings.dart b/lib/views/settings.dart index f52fd380..e832d848 100644 --- a/lib/views/settings.dart +++ b/lib/views/settings.dart @@ -1,5 +1,6 @@ import 'package:adaptive_dialog/adaptive_dialog.dart'; import 'package:fluffychat/components/dialogs/bootstrap_dialog.dart'; +import 'package:fluffychat/views/log_view.dart'; import 'package:fluffychat/views/settings_3pid.dart'; import 'package:fluffychat/views/settings_notifications.dart'; import 'package:fluffychat/views/settings_style.dart'; @@ -17,7 +18,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:image_picker/image_picker.dart'; import 'package:url_launcher/url_launcher.dart'; -import 'package:logger_flutter/logger_flutter.dart'; import '../components/adaptive_page_layout.dart'; import '../components/content_banner.dart'; @@ -599,13 +599,7 @@ class _SettingsState extends State { ), ), onTap: () => Navigator.of(context).push( - AppRoute.defaultRoute( - context, - LogConsole( - showCloseButton: true, - dark: true, - ), - ), + AppRoute.defaultRoute(context, LogViewer()), ), ), ListTile( diff --git a/pubspec.lock b/pubspec.lock index ca9b113b..6c1d7f0b 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -195,7 +195,7 @@ packages: description: path: "." ref: main - resolved-ref: b5cf8cacb6d9f96f04d110091e879e88249ec3ca + resolved-ref: "0ed5c449190362b1334bdc586c0a672881703053" url: "https://gitlab.com/famedly/famedlysdk.git" source: git version: "0.0.1" @@ -526,14 +526,7 @@ packages: name: logger url: "https://pub.dartlang.org" source: hosted - version: "0.7.0" - logger_flutter: - dependency: "direct main" - description: - name: logger_flutter - url: "https://pub.dartlang.org" - source: hosted - version: "0.7.1" + version: "0.9.4" logging: dependency: transitive description: @@ -858,13 +851,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.6" - sensors: - dependency: transitive - description: - name: sensors - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.2+6" sentry: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index df66a2a1..82dc7cad 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -64,7 +64,6 @@ dependencies: flutter_cache_manager: ^2.0.0 open_noti_settings: ^0.0.4 emoji_picker: ^0.1.0 - logger_flutter: ^0.7.1 dev_dependencies: flutter_test: