* refa: log

* upgrade deps
This commit is contained in:
My-Responsitories
2026-05-26 11:44:32 +00:00
committed by GitHub
parent 56756c5c85
commit 41c8e1a538
14 changed files with 144 additions and 302 deletions

View File

@@ -11,8 +11,7 @@ import 'package:flutter/widgets.dart';
/// Adapted from [WidgetsFlutterBinding] /// Adapted from [WidgetsFlutterBinding]
/// ///
class ScaledWidgetsFlutterBinding extends WidgetsFlutterBinding { class ScaledWidgetsFlutterBinding extends WidgetsFlutterBinding {
ScaledWidgetsFlutterBinding._({double scaleFactor = 1.0}) ScaledWidgetsFlutterBinding._({this._scaleFactor = 1.0});
: _scaleFactor = scaleFactor;
/// Calculate scale factor from device size. /// Calculate scale factor from device size.
double _scaleFactor; double _scaleFactor;

View File

@@ -13,6 +13,7 @@ import 'package:PiliPlus/plugin/pl_player/utils/fullscreen.dart';
import 'package:PiliPlus/router/app_pages.dart'; import 'package:PiliPlus/router/app_pages.dart';
import 'package:PiliPlus/services/account_service.dart'; import 'package:PiliPlus/services/account_service.dart';
import 'package:PiliPlus/services/download/download_service.dart'; import 'package:PiliPlus/services/download/download_service.dart';
import 'package:PiliPlus/services/logger.dart';
import 'package:PiliPlus/services/service_locator.dart'; import 'package:PiliPlus/services/service_locator.dart';
import 'package:PiliPlus/utils/cache_manager.dart'; import 'package:PiliPlus/utils/cache_manager.dart';
import 'package:PiliPlus/utils/calc_window_position.dart'; import 'package:PiliPlus/utils/calc_window_position.dart';
@@ -201,32 +202,12 @@ void main() async {
'${NativePlayer.apiVersion >> 16}.${NativePlayer.apiVersion & 0xFFFF}', '${NativePlayer.apiVersion >> 16}.${NativePlayer.apiVersion & 0xFFFF}',
}; };
final fileHandler = await JsonFileHandler.init(); final fileHandler = await JsonFileHandler.init();
final Catcher2Options debugConfig = Catcher2Options(
SilentReportMode(),
[
?fileHandler,
ConsoleHandler(
enableDeviceParameters: false,
enableApplicationParameters: false,
enableCustomParameters: true,
),
],
customParameters: customParameters,
);
final Catcher2Options releaseConfig = Catcher2Options(
SilentReportMode(),
[
?fileHandler,
ConsoleHandler(enableCustomParameters: true),
],
customParameters: customParameters,
);
Catcher2( Catcher2(
debugConfig: debugConfig, [?fileHandler, const ConsoleHandler()],
releaseConfig: releaseConfig, const MyApp(),
rootWidget: const MyApp(), logger: logger,
customParameters: customParameters,
); );
} else { } else {
runApp(const MyApp()); runApp(const MyApp());

View File

@@ -15,7 +15,6 @@ import 'package:PiliPlus/models/dynamics/result.dart';
import 'package:PiliPlus/pages/dynamics/widgets/vote.dart'; import 'package:PiliPlus/pages/dynamics/widgets/vote.dart';
import 'package:PiliPlus/utils/app_scheme.dart'; import 'package:PiliPlus/utils/app_scheme.dart';
import 'package:PiliPlus/utils/extension/num_ext.dart'; import 'package:PiliPlus/utils/extension/num_ext.dart';
import 'package:PiliPlus/utils/extension/string_ext.dart';
import 'package:PiliPlus/utils/extension/theme_ext.dart'; import 'package:PiliPlus/utils/extension/theme_ext.dart';
import 'package:PiliPlus/utils/image_utils.dart'; import 'package:PiliPlus/utils/image_utils.dart';
import 'package:PiliPlus/utils/page_utils.dart'; import 'package:PiliPlus/utils/page_utils.dart';

View File

@@ -56,25 +56,20 @@ class _FavFolderSortPageState extends State<FavFolderSortPage>
); );
} }
void onReorder(int oldIndex, int newIndex) { void onReorderItem(int oldIndex, int newIndex) {
if (oldIndex == 0 || newIndex == 0) { if (oldIndex == 0 || newIndex == 0) {
SmartDialog.showToast('默认收藏夹不支持排序'); SmartDialog.showToast('默认收藏夹不支持排序');
return; return;
} }
if (newIndex > oldIndex) { sortList.insert(newIndex, sortList.removeAt(oldIndex));
newIndex -= 1;
}
final tabsItem = sortList.removeAt(oldIndex);
sortList.insert(newIndex, tabsItem);
setState(() {}); setState(() {});
} }
Widget get _buildBody { Widget get _buildBody {
return ReorderableListView.builder( return ReorderableListView.builder(
onReorder: onReorder, onReorderItem: onReorderItem,
proxyDecorator: proxyDecorator, proxyDecorator: proxyDecorator,
physics: const AlwaysScrollableScrollPhysics(), physics: const AlwaysScrollableScrollPhysics(),
itemCount: sortList.length, itemCount: sortList.length,

View File

@@ -81,11 +81,7 @@ class _FavSortPageState extends State<FavSortPage> with ReorderMixin {
); );
} }
void onReorder(int oldIndex, int newIndex) { void onReorderItem(int oldIndex, int newIndex) {
if (newIndex > oldIndex) {
newIndex -= 1;
}
final oldItem = sortList[oldIndex]; final oldItem = sortList[oldIndex];
final newItem = sortList.getOrNull( final newItem = sortList.getOrNull(
oldIndex > newIndex ? newIndex - 1 : newIndex, // might be Negative oldIndex > newIndex ? newIndex - 1 : newIndex, // might be Negative
@@ -94,15 +90,14 @@ class _FavSortPageState extends State<FavSortPage> with ReorderMixin {
'${newItem == null ? '0:0' : '${newItem.id}:${newItem.type}'}:${oldItem.id}:${oldItem.type}', '${newItem == null ? '0:0' : '${newItem.id}:${newItem.type}'}:${oldItem.id}:${oldItem.type}',
); );
final tabsItem = sortList.removeAt(oldIndex); sortList.insert(newIndex, sortList.removeAt(oldIndex));
sortList.insert(newIndex, tabsItem);
setState(() {}); setState(() {});
} }
Widget get _buildBody { Widget get _buildBody {
final child = ReorderableListView.builder( final child = ReorderableListView.builder(
onReorder: onReorder, onReorderItem: onReorderItem,
proxyDecorator: proxyDecorator, proxyDecorator: proxyDecorator,
physics: const AlwaysScrollableScrollPhysics(), physics: const AlwaysScrollableScrollPhysics(),
padding: padding:

View File

@@ -71,20 +71,14 @@ class _FollowTagSortPageState extends State<FollowTagSortPage>
); );
} }
void onReorder(int oldIndex, int newIndex) { void onReorderItem(int oldIndex, int newIndex) {
if (newIndex > oldIndex) { _customTags.insert(newIndex, _customTags.removeAt(oldIndex));
newIndex -= 1;
}
final tabsItem = _customTags.removeAt(oldIndex);
_customTags.insert(newIndex, tabsItem);
setState(() {}); setState(() {});
} }
Widget get _buildBody { Widget get _buildBody {
return ReorderableListView.builder( return ReorderableListView.builder(
onReorder: onReorder, onReorderItem: onReorderItem,
proxyDecorator: proxyDecorator, proxyDecorator: proxyDecorator,
physics: const AlwaysScrollableScrollPhysics(), physics: const AlwaysScrollableScrollPhysics(),
padding: EdgeInsets.only( padding: EdgeInsets.only(

View File

@@ -52,8 +52,7 @@ class _BarSetPageState extends State<BarSetPage> with ReorderMixin {
SmartDialog.showToast('重置成功,下次启动时生效'); SmartDialog.showToast('重置成功,下次启动时生效');
} }
void onReorder(int oldIndex, int newIndex) { void onReorderItem(int oldIndex, int newIndex) {
if (newIndex > oldIndex) newIndex -= 1;
list.insert(newIndex, list.removeAt(oldIndex)); list.insert(newIndex, list.removeAt(oldIndex));
setState(() {}); setState(() {});
} }
@@ -71,7 +70,7 @@ class _BarSetPageState extends State<BarSetPage> with ReorderMixin {
], ],
), ),
body: ReorderableListView( body: ReorderableListView(
onReorder: onReorder, onReorderItem: onReorderItem,
proxyDecorator: proxyDecorator, proxyDecorator: proxyDecorator,
footer: Padding( footer: Padding(
padding: padding:

View File

@@ -11,8 +11,8 @@ import 'package:PiliPlus/utils/storage.dart';
import 'package:PiliPlus/utils/storage_key.dart'; import 'package:PiliPlus/utils/storage_key.dart';
import 'package:PiliPlus/utils/storage_pref.dart'; import 'package:PiliPlus/utils/storage_pref.dart';
import 'package:PiliPlus/utils/utils.dart'; import 'package:PiliPlus/utils/utils.dart';
import 'package:catcher_2/model/platform_type.dart'; import 'package:catcher_2/catcher_2.dart';
import 'package:catcher_2/model/report.dart' as catcher; import 'package:catcher_2/utils/log_printer.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
@@ -27,25 +27,25 @@ class LogsPage extends StatefulWidget {
} }
class _LogsPageState extends State<LogsPage> { class _LogsPageState extends State<LogsPage> {
List<Report> logsContent = []; List<_ExpandedItem<Report>> logsContent = [];
Report? latestLog; _ExpandedItem<_DeviceInfo>? _deviceInfo;
late bool enableLog = Pref.enableLog; late bool enableLog = Pref.enableLog;
@override @override
void initState() { void initState() {
_initDeviceInfo();
getLog(); getLog();
super.initState(); super.initState();
} }
@override void _initDeviceInfo() {
void dispose() { if (Catcher2.instance case final c?) {
if (latestLog != null) { _deviceInfo = _ExpandedItem((
final time = latestLog!.dateTime; c.deviceParameters,
if (DateTime.now().difference(time) >= const Duration(days: 14)) { c.applicationParameters,
LoggerUtils.clearLogs(); c.customParameters,
} ));
} }
super.dispose();
} }
Future<void> getLog() async { Future<void> getLog() async {
@@ -53,19 +53,18 @@ class _LogsPageState extends State<LogsPage> {
logsContent = (await logsPath.readAsLines()).reversed.map((i) { logsContent = (await logsPath.readAsLines()).reversed.map((i) {
try { try {
final log = Report.fromJson(jsonDecode(i)); final log = Report.fromJson(jsonDecode(i));
latestLog ??= log; return _ExpandedItem(log);
return log;
} catch (e, s) { } catch (e, s) {
return Report( return _ExpandedItem(
'Parse log failed: $e\n\n\n$i', Report(
s, 'Parse log failed: $e\n\n\n$i',
DateTime.now(), s,
const {}, DateTime.now(),
const {}, const {},
const {}, const {},
null, const {},
PlatformType.unknown, null,
null, ),
); );
} }
}).toList(); }).toList();
@@ -119,7 +118,7 @@ class _LogsPageState extends State<LogsPage> {
onTap: () => Timer.periodic( onTap: () => Timer.periodic(
const Duration(milliseconds: 3500), const Duration(milliseconds: 3500),
(timer) { (timer) {
Utils.reportError('Manual'); Utils.reportError('Manual', StackTrace.current);
if (timer.tick > 3) { if (timer.tick > 3) {
timer.cancel(); timer.cancel();
if (mounted) getLog(); if (mounted) getLog();
@@ -146,10 +145,7 @@ class _LogsPageState extends State<LogsPage> {
child: const Text('错误反馈'), child: const Text('错误反馈'),
), ),
PopupMenuItem( PopupMenuItem(
onTap: () { onTap: clearLogs,
latestLog = null;
clearLogs();
},
child: const Text('清空日志'), child: const Text('清空日志'),
), ),
], ],
@@ -157,7 +153,7 @@ class _LogsPageState extends State<LogsPage> {
const SizedBox(width: 6), const SizedBox(width: 6),
], ],
), ),
body: logsContent.isNotEmpty body: logsContent.isNotEmpty || _deviceInfo != null
? Padding( ? Padding(
padding: EdgeInsets.only( padding: EdgeInsets.only(
left: padding.left + 12, left: padding.left + 12,
@@ -165,11 +161,11 @@ class _LogsPageState extends State<LogsPage> {
), ),
child: CustomScrollView( child: CustomScrollView(
slivers: [ slivers: [
if (latestLog != null) if (_deviceInfo != null)
SliverToBoxAdapter( SliverToBoxAdapter(
child: Padding( child: Padding(
padding: const .only(bottom: 12), padding: const .only(bottom: 12),
child: InfoCard(report: latestLog!), child: _InfoCard(info: _deviceInfo!),
), ),
), ),
SliverPadding( SliverPadding(
@@ -177,7 +173,7 @@ class _LogsPageState extends State<LogsPage> {
sliver: SliverList.separated( sliver: SliverList.separated(
itemCount: logsContent.length, itemCount: logsContent.length,
itemBuilder: (context, index) => itemBuilder: (context, index) =>
ReportCard(report: logsContent[index]), _ReportCard(report: logsContent[index]),
separatorBuilder: (_, _) => const SizedBox(height: 12), separatorBuilder: (_, _) => const SizedBox(height: 12),
), ),
), ),
@@ -189,10 +185,16 @@ class _LogsPageState extends State<LogsPage> {
} }
} }
class InfoCard extends StatelessWidget { typedef _DeviceInfo = (
final Report report; Map<String, dynamic>,
Map<String, dynamic>,
Map<String, dynamic>,
);
const InfoCard({super.key, required this.report}); class _InfoCard extends StatelessWidget {
final _ExpandedItem<_DeviceInfo> info;
const _InfoCard({required this.info});
Widget _buildMapSection( Widget _buildMapSection(
Color color, Color color,
@@ -210,11 +212,7 @@ class InfoCard extends StatelessWidget {
const SizedBox(height: 8), const SizedBox(height: 8),
Text( Text(
title, title,
style: TextStyle( style: TextStyle(fontWeight: .bold, color: color, fontSize: 15),
fontWeight: FontWeight.bold,
color: color,
fontSize: 15,
),
), ),
...map.entries.map( ...map.entries.map(
(entry) => Text.rich( (entry) => Text.rich(
@@ -250,58 +248,47 @@ class InfoCard extends StatelessWidget {
const Expanded( const Expanded(
child: Text( child: Text(
'相关信息', '相关信息',
style: TextStyle( style: TextStyle(fontWeight: .bold, fontSize: 15),
fontWeight: FontWeight.bold,
fontSize: 15,
),
maxLines: 1, maxLines: 1,
overflow: TextOverflow.ellipsis, overflow: .ellipsis,
), ),
), ),
iconButton( iconButton(
size: 34, size: 34,
iconSize: 22, iconSize: 22,
tooltip: info.isExpanded ? '收起' : '展开',
icon: Icon( icon: Icon(
report.isExpanded ? Icons.expand_less : Icons.expand_more, info.isExpanded ? Icons.expand_less : Icons.expand_more,
), ),
onPressed: () { onPressed: () {
report.isExpanded = !report.isExpanded; info.isExpanded = !info.isExpanded;
(context as Element).markNeedsBuild(); (context as Element).markNeedsBuild();
}, },
), ),
], ],
), ),
if (report.isExpanded) ...[ if (info.isExpanded) ...[
_buildMapSection( _buildMapSection(colorScheme.primary, '设备信息', info.item.$1),
colorScheme.primary, _buildMapSection(colorScheme.primary, '应用信息', info.item.$2),
'设备信息', _buildMapSection(colorScheme.primary, '编译信息', info.item.$3),
report.deviceParameters,
),
_buildMapSection(
colorScheme.primary,
'应用信息',
report.applicationParameters,
),
_buildMapSection(
colorScheme.primary,
'编译信息',
report.customParameters,
),
], ],
]); ]);
} }
} }
class ReportCard extends StatelessWidget { class _ReportCard extends StatelessWidget {
final Report report; final _ExpandedItem<Report> report;
const ReportCard({super.key, required this.report}); const _ReportCard({required this.report});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final colorScheme = ColorScheme.of(context); final colorScheme = ColorScheme.of(context);
late final stackTrace = report.stackTrace.toString().trim(); late final stackTrace = PrettyLogPrinter.formatStackString(
final dateTime = DateFormatUtils.longFormatDs.format(report.dateTime); report.item.stackTrace?.toString(),
-1,
);
final dateTime = DateFormatUtils.longFormatDs.format(report.item.dateTime);
return _card([ return _card([
Row( Row(
crossAxisAlignment: .start, crossAxisAlignment: .start,
@@ -312,13 +299,10 @@ class ReportCard extends StatelessWidget {
crossAxisAlignment: .start, crossAxisAlignment: .start,
children: [ children: [
Text( Text(
report.error.toString(), report.item.error.toString(),
style: const TextStyle( style: const TextStyle(fontWeight: .bold, fontSize: 15),
fontWeight: FontWeight.bold,
fontSize: 15,
),
maxLines: 2, maxLines: 2,
overflow: TextOverflow.ellipsis, overflow: .ellipsis,
), ),
Text( Text(
dateTime, dateTime,
@@ -334,6 +318,7 @@ class ReportCard extends StatelessWidget {
iconButton( iconButton(
size: 34, size: 34,
iconSize: 22, iconSize: 22,
tooltip: '复制',
onPressed: () { onPressed: () {
Utils.copyText('```\n$report```', needToast: false); Utils.copyText('```\n$report```', needToast: false);
ScaffoldMessenger.of(context).showSnackBar( ScaffoldMessenger.of(context).showSnackBar(
@@ -343,14 +328,12 @@ class ReportCard extends StatelessWidget {
), ),
); );
}, },
icon: const Icon( icon: const Icon(Icons.copy_outlined, size: 16),
Icons.copy_outlined,
size: 16,
),
), ),
iconButton( iconButton(
size: 34, size: 34,
iconSize: 22, iconSize: 22,
tooltip: report.isExpanded ? '收起' : '展开',
icon: Icon( icon: Icon(
report.isExpanded ? Icons.expand_less : Icons.expand_more, report.isExpanded ? Icons.expand_less : Icons.expand_more,
), ),
@@ -373,16 +356,14 @@ class ReportCard extends StatelessWidget {
), ),
const SizedBox(height: 8), const SizedBox(height: 8),
Container( Container(
padding: const EdgeInsets.all(12), padding: const .all(12),
decoration: BoxDecoration( decoration: BoxDecoration(
color: colorScheme.surface, color: colorScheme.surface,
borderRadius: const BorderRadius.all(Radius.circular(8)), borderRadius: const .all(.circular(8)),
border: Border.all( border: .all(color: colorScheme.outline.withValues(alpha: 0.5)),
color: colorScheme.outline.withValues(alpha: 0.5),
),
), ),
child: SelectableText( child: SelectableText(
report.error.toString(), report.item.error.toString(),
style: TextStyle( style: TextStyle(
fontFamily: 'Monospace', fontFamily: 'Monospace',
color: colorScheme.onSurfaceVariant, color: colorScheme.onSurfaceVariant,
@@ -390,7 +371,7 @@ class ReportCard extends StatelessWidget {
), ),
), ),
// stackTrace may be null or String("null") or blank // stackTrace may be null or String("null") or blank
if (stackTrace.isNotEmpty && stackTrace != 'null') ...[ if (stackTrace != null && stackTrace.isNotEmpty) ...[
const SizedBox(height: 16), const SizedBox(height: 16),
Text( Text(
'堆栈跟踪', '堆栈跟踪',
@@ -402,21 +383,29 @@ class ReportCard extends StatelessWidget {
), ),
const SizedBox(height: 8), const SizedBox(height: 8),
Container( Container(
padding: const EdgeInsets.all(12), padding: const .all(12),
decoration: BoxDecoration( decoration: BoxDecoration(
color: colorScheme.surface, color: colorScheme.surface,
borderRadius: const BorderRadius.all(Radius.circular(8)), borderRadius: const .all(.circular(8)),
border: Border.all( border: .all(color: colorScheme.outline.withValues(alpha: 0.5)),
color: colorScheme.outline.withValues(alpha: 0.5),
),
), ),
child: SelectableText( child: SelectableText.rich(
stackTrace, TextSpan(
style: TextStyle( children: stackTrace
fontFamily: 'Monospace', .map(
fontSize: 13, (i) => TextSpan(
color: colorScheme.onSurfaceVariant, text: '$i\n',
style: i.contains('(package:${Constants.appName}')
? TextStyle(
color: colorScheme.onSurface,
fontWeight: .w600,
)
: TextStyle(color: colorScheme.onSurfaceVariant),
),
)
.toList(),
), ),
style: const TextStyle(fontFamily: 'Monospace', fontSize: 13),
), ),
), ),
], ],
@@ -437,45 +426,12 @@ Widget _card(List<Widget> contents) {
); );
} }
class Report extends catcher.Report { class _ExpandedItem<T> {
Report(
super.error,
super.stackTrace,
super.dateTime,
super.deviceParameters,
super.applicationParameters,
super.customParameters,
super.errorDetails,
super.platformType,
super.screenshot,
);
bool isExpanded = false; bool isExpanded = false;
final T item;
factory Report.fromJson(Map<String, dynamic> json) => Report( _ExpandedItem(this.item);
json['error'],
json['stackTrace'],
DateTime.tryParse(json['dateTime'] ?? '') ?? DateTime(1970),
json['deviceParameters'] ?? const {},
json['applicationParameters'] ?? const {},
json['customParameters'] ?? const {},
null,
PlatformType.values.byName(json['platformType']),
null,
);
static String _params2String(Map<String, dynamic> params) {
return params.entries
.map((entry) => '${entry.key}: ${entry.value}\n')
.join();
}
@override @override
String toString() { String toString() => item.toString();
return '------- DEVICE INFO -------\n${_params2String(deviceParameters)}'
'------- APP INFO -------\n${_params2String(applicationParameters)}'
'------- ERROR -------\n$error\n'
'------- STACK TRACE -------\n${stackTrace.toString().trim()}\n'
'------- CUSTOM INFO -------\n${_params2String(customParameters)}';
}
} }

View File

@@ -317,8 +317,8 @@ class _DanmakuTip extends SingleChildRenderObjectWidget {
class _RenderDanmakuTip extends RenderProxyBox { class _RenderDanmakuTip extends RenderProxyBox {
_RenderDanmakuTip({ _RenderDanmakuTip({
required double offset, required this._offset,
}) : _offset = offset; });
double _offset; double _offset;
double get offset => _offset; double get offset => _offset;

View File

@@ -2,30 +2,19 @@ import 'dart:io';
import 'package:PiliPlus/utils/json_file_handler.dart'; import 'package:PiliPlus/utils/json_file_handler.dart';
import 'package:PiliPlus/utils/storage_pref.dart'; import 'package:PiliPlus/utils/storage_pref.dart';
import 'package:catcher_2/catcher_2.dart'; import 'package:catcher_2/utils/log_printer.dart';
import 'package:flutter/foundation.dart';
import 'package:logger/logger.dart'; import 'package:logger/logger.dart';
import 'package:path/path.dart' as p; import 'package:path/path.dart' as p;
import 'package:path_provider/path_provider.dart'; import 'package:path_provider/path_provider.dart';
final logger = PiliLogger(); final logger = Logger(
filter: ProductionFilter(),
class PiliLogger extends Logger { printer: PrettyLogPrinter(
PiliLogger() : super(); dateTimeFormat: PrettyLogPrinter.toEncodableFallback,
),
@override level: kDebugMode ? .trace : .warning,
void log( );
Level level,
dynamic message, {
Object? error,
StackTrace? stackTrace,
DateTime? time,
}) {
if (level == Level.error || level == Level.fatal) {
Catcher2.reportCheckedError(error, stackTrace);
}
super.log(level, message, error: error, stackTrace: stackTrace, time: time);
}
}
abstract final class LoggerUtils { abstract final class LoggerUtils {
static File? _logFile; static File? _logFile;

View File

@@ -49,7 +49,7 @@ class PackageHeaderRes extends PackageHeader {
static PackageHeaderRes? fromBytesData(Uint8List data) { static PackageHeaderRes? fromBytesData(Uint8List data) {
if (data.length < 10) { if (data.length < 10) {
logger.i('数据不足以解析PackageHeader'); logger.w('数据不足以解析PackageHeader');
return null; return null;
} }
final byteData = ByteData.sublistView(data); final byteData = ByteData.sublistView(data);

View File

@@ -1,11 +1,8 @@
import 'dart:convert'; import 'dart:convert';
import 'dart:io'; import 'dart:io';
import 'package:PiliPlus/services/logger.dart' show LoggerUtils; import 'package:PiliPlus/services/logger.dart';
import 'package:catcher_2/model/platform_type.dart'; import 'package:catcher_2/catcher_2.dart';
import 'package:catcher_2/model/report.dart';
import 'package:catcher_2/model/report_handler.dart';
import 'package:flutter/material.dart';
class JsonFileHandler extends ReportHandler { class JsonFileHandler extends ReportHandler {
final bool enableDeviceParameters; final bool enableDeviceParameters;
@@ -48,7 +45,7 @@ class JsonFileHandler extends ReportHandler {
handleWhenRejected: handleWhenRejected, handleWhenRejected: handleWhenRejected,
); );
} catch (e, s) { } catch (e, s) {
debugPrintStack(stackTrace: s, label: e.toString()); logger.e('Init log file', error: e, stackTrace: s);
return null; return null;
} }
} }
@@ -62,18 +59,24 @@ class JsonFileHandler extends ReportHandler {
} }
@override @override
Future<bool> handle(Report report, BuildContext? context) async { Future<bool> handle(Report report) async {
try { try {
await _processReport(report); await _processReport(report);
return true; return true;
} catch (exc, stackTrace) { } catch (exc, stackTrace) {
_printLog('Exception occurred: $exc stack: $stackTrace'); logger.e(
'Write Json Exception occurred',
error: exc,
stackTrace: stackTrace,
);
return false; return false;
} }
} }
Future<void> _processReport(Report report) { Future<void> _processReport(Report report) {
_printLog('Writing report to file'); if (printLogs) {
logger.d('Writing report to file');
}
final json = report.toJson( final json = report.toJson(
enableDeviceParameters: enableDeviceParameters, enableDeviceParameters: enableDeviceParameters,
enableApplicationParameters: enableApplicationParameters, enableApplicationParameters: enableApplicationParameters,
@@ -82,22 +85,4 @@ class JsonFileHandler extends ReportHandler {
); );
return add((raf) => raf.writeString('${jsonEncode(json)}\n')); return add((raf) => raf.writeString('${jsonEncode(json)}\n'));
} }
void _printLog(String log) {
if (printLogs) {
logger.info(log);
}
}
@override
List<PlatformType> getSupportedPlatforms() => const [
PlatformType.android,
PlatformType.iOS,
PlatformType.linux,
PlatformType.macOS,
PlatformType.windows,
];
@override
bool shouldHandleWhenRejected() => handleWhenRejected;
} }

View File

@@ -239,8 +239,8 @@ packages:
description: description:
path: "." path: "."
ref: dev ref: dev
resolved-ref: a20878e9fe5375252c9ea22697d4dc4823544b1a resolved-ref: "9138d8d2aeefc564efd2f35fde3f54ad1b7e89a7"
url: "https://github.com/bggRGjQaUbCoE/catcher_2.git" url: "https://github.com/My-Responsitories/catcher_2.git"
source: git source: git
version: "2.1.9" version: "2.1.9"
characters: characters:
@@ -409,10 +409,10 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: dio_http2_adapter name: dio_http2_adapter
sha256: "79f3d69b155b92a786c8734bd11860390b986210d4e07cbb6a5c8c806a7187b2" sha256: c56522c50bb3bab7e3ca77c153b0f03ae672a87d8c32e46be8f2868693ec9f0a
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.7.0" version: "2.7.1"
dio_web_adapter: dio_web_adapter:
dependency: transitive dependency: transitive
description: description:
@@ -707,14 +707,6 @@ packages:
description: flutter description: flutter
source: sdk source: sdk
version: "0.0.0" version: "0.0.0"
flutter_mailer:
dependency: transitive
description:
name: flutter_mailer
sha256: e1c0b4425e3cc789f8dd914fd08b5da660c3ac46c8ebf3e7db183d39775a8fa6
url: "https://pub.dev"
source: hosted
version: "3.0.2"
flutter_native_splash: flutter_native_splash:
dependency: "direct dev" dependency: "direct dev"
description: description:
@@ -1097,14 +1089,6 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.3.0" version: "1.3.0"
mailer:
dependency: transitive
description:
name: mailer
sha256: "7b8691b080809ea1b2fa2f1b0d49c7c089fb328bd23e68aa5818b9cf5f4b420d"
url: "https://pub.dev"
source: hosted
version: "7.1.0"
matcher: matcher:
dependency: transitive dependency: transitive
description: description:
@@ -1466,14 +1450,6 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.5.0" version: "1.5.0"
punycoder:
dependency: transitive
description:
name: punycoder
sha256: aed79c05986a18782caa9bad649a4a786e840e1baaf6a2e1aa3a25d143d28e6e
url: "https://pub.dev"
source: hosted
version: "0.2.2"
qr: qr:
dependency: transitive dependency: transitive
description: description:
@@ -1499,7 +1475,7 @@ packages:
source: hosted source: hosted
version: "0.6.0" version: "0.6.0"
rxdart: rxdart:
dependency: "direct overridden" dependency: transitive
description: description:
name: rxdart name: rxdart
sha256: "5c3004a4a8dbb94bd4bf5412a4def4acdaa12e12f269737a5751369e12d1a962" sha256: "5c3004a4a8dbb94bd4bf5412a4def4acdaa12e12f269737a5751369e12d1a962"
@@ -1510,12 +1486,12 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: saver_gallery name: saver_gallery
sha256: "3f983d4be63aff52523c3e097a9b00ce9ab8444f9a982c878cde9d0359f4681d" sha256: c24cfec2d94a0db9a2ae02d6a21847ba49a369c9b6c3a83f3da17d14720c0888
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "4.1.1" version: "4.1.2"
screen_brightness_android: screen_brightness_android:
dependency: "direct overridden" dependency: transitive
description: description:
name: screen_brightness_android name: screen_brightness_android
sha256: "2df5e0488a22a73271a43d92dbcd80643df6910cf69690faacaf9929ae9ade3b" sha256: "2df5e0488a22a73271a43d92dbcd80643df6910cf69690faacaf9929ae9ade3b"
@@ -1523,7 +1499,7 @@ packages:
source: hosted source: hosted
version: "2.1.4" version: "2.1.4"
screen_brightness_ios: screen_brightness_ios:
dependency: "direct overridden" dependency: transitive
description: description:
name: screen_brightness_ios name: screen_brightness_ios
sha256: "0792d8f98852558f831b4b75241c46047b884598b3f4d982b37dc2dd43e2b2e1" sha256: "0792d8f98852558f831b4b75241c46047b884598b3f4d982b37dc2dd43e2b2e1"
@@ -1578,14 +1554,6 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.2.0" version: "0.2.0"
sentry:
dependency: transitive
description:
name: sentry
sha256: f04095a25ff02b202a914174c73ec309570aa93d61098cb4a0a9e715b4aaa465
url: "https://pub.dev"
source: hosted
version: "9.20.0"
share_plus: share_plus:
dependency: "direct main" dependency: "direct main"
description: description:
@@ -1824,14 +1792,6 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.3.1" version: "2.3.1"
unorm_dart:
dependency: transitive
description:
name: unorm_dart
sha256: "0c69186b03ca6addab0774bcc0f4f17b88d4ce78d9d4d8f0619e30a99ead58e7"
url: "https://pub.dev"
source: hosted
version: "0.3.2"
upower: upower:
dependency: transitive dependency: transitive
description: description:

View File

@@ -48,7 +48,7 @@ dependencies:
ref: main ref: main
catcher_2: catcher_2:
git: git:
url: https://github.com/bggRGjQaUbCoE/catcher_2.git url: https://github.com/My-Responsitories/catcher_2.git
ref: dev ref: dev
characters: ^1.4.1 characters: ^1.4.1
chat_bottom_container: chat_bottom_container:
@@ -66,7 +66,7 @@ dependencies:
ref: main ref: main
device_info_plus: ^13.1.0 device_info_plus: ^13.1.0
dio: ^5.9.1 dio: ^5.9.1
dio_http2_adapter: ^2.5.3 dio_http2_adapter: ^2.7.1
dlna_dart: ^0.1.0 dlna_dart: ^0.1.0
dynamic_color: ^1.8.1 dynamic_color: ^1.8.1
easy_debounce: ^2.0.3 easy_debounce: ^2.0.3
@@ -127,11 +127,7 @@ dependencies:
material_new_shapes: ^1.0.0 material_new_shapes: ^1.0.0
media_kit: 1.1.11 media_kit: 1.1.11
media_kit_libs_video: 1.0.5 media_kit_libs_video: 1.0.5
media_kit_video: media_kit_video: 1.2.5
git:
url: https://github.com/bggRGjQaUbCoE/media-kit.git
path: media_kit_video
ref: version_1.2.5
mime: ^2.0.0 mime: ^2.0.0
native_device_orientation: native_device_orientation:
git: git:
@@ -146,7 +142,7 @@ dependencies:
pretty_qr_code: ^3.3.0 pretty_qr_code: ^3.3.0
protobuf: ^6.0.0 protobuf: ^6.0.0
re_highlight: ^0.0.3 re_highlight: ^0.0.3
saver_gallery: ^4.1.0 saver_gallery: ^4.1.2
screen_brightness_platform_interface: ^2.1.0 screen_brightness_platform_interface: ^2.1.0
screen_retriever: ^0.2.0 screen_retriever: ^0.2.0
share_plus: ^13.1.0 share_plus: ^13.1.0
@@ -215,12 +211,6 @@ dependency_overrides:
url: https://github.com/My-Responsitories/media-kit.git url: https://github.com/My-Responsitories/media-kit.git
path: media_kit_video path: media_kit_video
ref: version_1.2.5 ref: version_1.2.5
mime: ^2.0.0
path: ^1.9.1
rxdart: ^0.28.0
screen_brightness_android: ^2.1.4
screen_brightness_ios: ^2.1.3
screen_brightness_platform_interface: ^2.1.1
dev_dependencies: dev_dependencies:
flutter_test: flutter_test: