mirror of
https://gitlab.com/mysocialportal/relatica
synced 2024-10-18 12:23:31 +00:00
Remove extraneous print from sign in class
This commit is contained in:
parent
a9aa415a6b
commit
338547203d
7 changed files with 281 additions and 5 deletions
|
@ -19,6 +19,7 @@ import 'services/follow_requests_manager.dart';
|
|||
import 'services/gallery_service.dart';
|
||||
import 'services/hashtag_service.dart';
|
||||
import 'services/interactions_manager.dart';
|
||||
import 'services/log_service.dart';
|
||||
import 'services/notifications_manager.dart';
|
||||
import 'services/setting_service.dart';
|
||||
import 'services/status_service.dart';
|
||||
|
@ -32,14 +33,14 @@ void main() async {
|
|||
WidgetsFlutterBinding.ensureInitialized();
|
||||
MediaKit.ensureInitialized();
|
||||
|
||||
final logService = LogService();
|
||||
getIt.registerSingleton<LogService>(logService);
|
||||
|
||||
// await dotenv.load(fileName: '.env');
|
||||
const enablePreview = false;
|
||||
Logger.root.level = Level.FINER;
|
||||
Logger.root.level = Level.OFF;
|
||||
Logger.root.onRecord.listen((event) {
|
||||
final logName = event.loggerName.isEmpty ? 'ROOT' : event.loggerName;
|
||||
final msg =
|
||||
'${event.level.name} - $logName @ ${event.time}: ${event.message}';
|
||||
print(msg);
|
||||
logService.add(event);
|
||||
});
|
||||
|
||||
await fixLetsEncryptCertOnOldAndroid();
|
||||
|
@ -60,9 +61,15 @@ class App extends StatelessWidget {
|
|||
final settingsService = getIt<SettingsService>();
|
||||
return AnimatedBuilder(
|
||||
builder: (context, child) {
|
||||
Logger.root.level = settingsService.logLevel;
|
||||
print('Log level: ${settingsService.logLevel}');
|
||||
return Portal(
|
||||
child: MultiProvider(
|
||||
providers: [
|
||||
ChangeNotifierProvider<LogService>(
|
||||
create: (_) => getIt<LogService>(),
|
||||
lazy: true,
|
||||
),
|
||||
ChangeNotifierProvider<StatusService>(
|
||||
create: (_) => getIt<StatusService>(),
|
||||
lazy: true,
|
||||
|
|
|
@ -17,6 +17,7 @@ import 'screens/gallery_screen.dart';
|
|||
import 'screens/home.dart';
|
||||
import 'screens/image_editor_screen.dart';
|
||||
import 'screens/interactions_viewer_screen.dart';
|
||||
import 'screens/logviewer_screen.dart';
|
||||
import 'screens/message_thread_screen.dart';
|
||||
import 'screens/message_threads_browser_screen.dart';
|
||||
import 'screens/messages_new_thread.dart';
|
||||
|
@ -51,6 +52,7 @@ class ScreenPaths {
|
|||
static String likes = '/likes';
|
||||
static String reshares = '/reshares';
|
||||
static String search = '/search';
|
||||
static String logViewer = '/logViewer';
|
||||
}
|
||||
|
||||
bool needAuthChangeInitialized = true;
|
||||
|
@ -314,4 +316,11 @@ final appRouter = GoRouter(
|
|||
child: const SearchScreen(),
|
||||
),
|
||||
),
|
||||
GoRoute(
|
||||
path: ScreenPaths.logViewer,
|
||||
name: ScreenPaths.logViewer,
|
||||
pageBuilder: (context, state) => const NoTransitionPage(
|
||||
child: LogViewerScreen(),
|
||||
),
|
||||
),
|
||||
]);
|
||||
|
|
165
lib/screens/logviewer_screen.dart
Normal file
165
lib/screens/logviewer_screen.dart
Normal file
|
@ -0,0 +1,165 @@
|
|||
import 'dart:convert';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:logging/logging.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
import '../controls/padding.dart';
|
||||
import '../controls/responsive_max_width.dart';
|
||||
import '../controls/standard_appbar.dart';
|
||||
import '../services/log_service.dart';
|
||||
import '../services/setting_service.dart';
|
||||
import '../utils/clipboard_utils.dart';
|
||||
import '../utils/logrecord_extensions.dart';
|
||||
|
||||
class LogViewerScreen extends StatefulWidget {
|
||||
const LogViewerScreen({super.key});
|
||||
|
||||
@override
|
||||
State<LogViewerScreen> createState() => _LogViewerScreenState();
|
||||
}
|
||||
|
||||
class _LogViewerScreenState extends State<LogViewerScreen> {
|
||||
var filterText = '';
|
||||
var filterByText = false;
|
||||
var filterByModule = false;
|
||||
var filterModuleName = '';
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final settings = context.watch<SettingsService>();
|
||||
final logService = context.watch<LogService>();
|
||||
final events = logService.events;
|
||||
|
||||
return Scaffold(
|
||||
appBar: StandardAppBar.build(context, 'Log Viewer'),
|
||||
body: Center(
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(8.0),
|
||||
child: ResponsiveMaxWidth(
|
||||
child: Column(
|
||||
children: [
|
||||
buildLogPanel(settings),
|
||||
buildModuleFilter(settings, events),
|
||||
buildTextSearchPanel(),
|
||||
const VerticalPadding(),
|
||||
buildLogList(settings.logLevel, events),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
));
|
||||
}
|
||||
|
||||
Widget buildLogPanel(SettingsService settings) {
|
||||
return ListTile(
|
||||
title: const Text('Log Level'),
|
||||
trailing: DropdownButton<Level>(
|
||||
value: settings.logLevel,
|
||||
items: Level.LEVELS
|
||||
.map((c) => DropdownMenuItem(value: c, child: Text(c.name)))
|
||||
.toList(),
|
||||
onChanged: (value) {
|
||||
settings.logLevel = value ?? Level.OFF;
|
||||
}),
|
||||
);
|
||||
}
|
||||
|
||||
Widget buildModuleFilter(SettingsService settings, List<LogRecord> events) {
|
||||
final modules = events.map((e) => e.loggerName).toSet().toList();
|
||||
modules.sort();
|
||||
modules.add('');
|
||||
return ListTile(
|
||||
leading: Checkbox(
|
||||
value: filterByModule,
|
||||
onChanged: (bool? value) {
|
||||
setState(() {
|
||||
filterByModule = value ?? false;
|
||||
});
|
||||
},
|
||||
),
|
||||
title: const Text('Filter by module:'),
|
||||
trailing: !filterByModule
|
||||
? null
|
||||
: DropdownButton<String>(
|
||||
value: filterModuleName,
|
||||
items: modules
|
||||
.map((c) => DropdownMenuItem(value: c, child: Text(c)))
|
||||
.toList(),
|
||||
onChanged: (value) {
|
||||
setState(() {
|
||||
filterModuleName = value ?? '';
|
||||
});
|
||||
}),
|
||||
);
|
||||
}
|
||||
|
||||
Widget buildTextSearchPanel() {
|
||||
return ListTile(
|
||||
leading: Checkbox(
|
||||
value: filterByText,
|
||||
onChanged: (value) {
|
||||
setState(() {
|
||||
filterByText = value ?? false;
|
||||
});
|
||||
},
|
||||
),
|
||||
title: TextField(
|
||||
onChanged: (value) {
|
||||
setState(() {
|
||||
filterText = value.toLowerCase();
|
||||
});
|
||||
},
|
||||
decoration: InputDecoration(
|
||||
labelText: 'Filter by text',
|
||||
alignLabelWithHint: true,
|
||||
border: OutlineInputBorder(
|
||||
borderSide: BorderSide(
|
||||
color: Theme.of(context).highlightColor,
|
||||
),
|
||||
borderRadius: BorderRadius.circular(5.0),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget buildLogList(Level logLevel, List<LogRecord> allEvents) {
|
||||
final events = allEvents.where((e) {
|
||||
final levelFilterPasses = e.level >= logLevel;
|
||||
final passesTextFilter = filterByText
|
||||
? e.message.toLowerCase().contains(filterText.toLowerCase())
|
||||
: true;
|
||||
final passesModuleFilter = filterByModule
|
||||
? filterModuleName.isEmpty || e.loggerName == filterModuleName
|
||||
: true;
|
||||
|
||||
return levelFilterPasses && passesTextFilter && passesModuleFilter;
|
||||
}).toList();
|
||||
return Expanded(
|
||||
child: ListView.separated(
|
||||
itemBuilder: (context, index) {
|
||||
final event = events[index];
|
||||
return ListTile(
|
||||
onLongPress: () {
|
||||
copyToClipboard(
|
||||
context: context,
|
||||
text: jsonEncode(event.toJson()),
|
||||
);
|
||||
},
|
||||
titleAlignment: ListTileTitleAlignment.titleHeight,
|
||||
leading: Text(event.level.toString()),
|
||||
title:
|
||||
Text('${event.loggerName} at ${event.time.toIso8601String()}'),
|
||||
subtitle: Text(
|
||||
event.message,
|
||||
softWrap: true,
|
||||
),
|
||||
);
|
||||
},
|
||||
separatorBuilder: (_, __) => const Divider(),
|
||||
itemCount: events.length,
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
|
@ -1,12 +1,16 @@
|
|||
import 'package:color_blindness/color_blindness.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:go_router/go_router.dart';
|
||||
import 'package:logging/logging.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
import '../controls/padding.dart';
|
||||
import '../controls/responsive_max_width.dart';
|
||||
import '../controls/standard_appbar.dart';
|
||||
import '../di_initialization.dart';
|
||||
import '../globals.dart';
|
||||
import '../routes.dart';
|
||||
import '../services/setting_service.dart';
|
||||
import '../utils/theme_mode_extensions.dart';
|
||||
|
||||
|
@ -28,6 +32,7 @@ class SettingsScreen extends StatelessWidget {
|
|||
buildThemeWidget(settings),
|
||||
if (!kReleaseMode) buildColorBlindnessTestSettings(settings),
|
||||
buildClearCaches(context),
|
||||
buildLogPanel(context, settings),
|
||||
],
|
||||
),
|
||||
),
|
||||
|
@ -96,4 +101,27 @@ class SettingsScreen extends StatelessWidget {
|
|||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget buildLogPanel(BuildContext context, SettingsService settings) {
|
||||
return ListTile(
|
||||
title: Row(
|
||||
children: [
|
||||
const Text('Log Level'),
|
||||
const HorizontalPadding(),
|
||||
ElevatedButton(
|
||||
onPressed: () => context.pushNamed(ScreenPaths.logViewer),
|
||||
child: const Text('Open Log Viewer'),
|
||||
)
|
||||
],
|
||||
),
|
||||
trailing: DropdownButton<Level>(
|
||||
value: settings.logLevel,
|
||||
items: Level.LEVELS
|
||||
.map((c) => DropdownMenuItem(value: c, child: Text(c.name)))
|
||||
.toList(),
|
||||
onChanged: (value) {
|
||||
settings.logLevel = value ?? Level.OFF;
|
||||
}),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
26
lib/services/log_service.dart
Normal file
26
lib/services/log_service.dart
Normal file
|
@ -0,0 +1,26 @@
|
|||
import 'dart:collection';
|
||||
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:logging/logging.dart';
|
||||
|
||||
const _defaultMaxItems = 1000;
|
||||
|
||||
class LogService extends ChangeNotifier {
|
||||
var maxItems = _defaultMaxItems;
|
||||
|
||||
final _events = Queue<LogRecord>();
|
||||
|
||||
List<LogRecord> get events => UnmodifiableListView(_events);
|
||||
|
||||
void add(LogRecord event) {
|
||||
// final logName = event.loggerName.isEmpty ? 'ROOT' : event.loggerName;
|
||||
// final msg =
|
||||
// '${event.level.name} - $logName @ ${event.time}: ${event.message}';
|
||||
// print(msg);
|
||||
_events.add(event);
|
||||
if (_events.length > maxItems) {
|
||||
_events.removeFirst();
|
||||
}
|
||||
notifyListeners();
|
||||
}
|
||||
}
|
|
@ -1,5 +1,6 @@
|
|||
import 'package:color_blindness/color_blindness.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:logging/logging.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
|
||||
import '../utils/theme_mode_extensions.dart';
|
||||
|
@ -40,6 +41,16 @@ class SettingsService extends ChangeNotifier {
|
|||
notifyListeners();
|
||||
}
|
||||
|
||||
Level _logLevel = Level.SEVERE;
|
||||
|
||||
Level get logLevel => _logLevel;
|
||||
|
||||
set logLevel(Level level) {
|
||||
_logLevel = level;
|
||||
_prefs.setString(_logLevelKey, level.name);
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
Future<void> initialize() async {
|
||||
if (_initialized) {
|
||||
return;
|
||||
|
@ -48,6 +59,7 @@ class SettingsService extends ChangeNotifier {
|
|||
_lowBandwidthMode = _prefs.getBool(_lowBandwidthModeKey) ?? false;
|
||||
_themeMode = ThemeModeExtensions.parse(_prefs.getString(_themeModeKey));
|
||||
_colorBlindnessType = _colorBlindnessTypeFromPrefs(_prefs);
|
||||
_logLevel = _levelFromPrefs(_prefs);
|
||||
_initialized = true;
|
||||
}
|
||||
}
|
||||
|
@ -55,6 +67,7 @@ class SettingsService extends ChangeNotifier {
|
|||
const _lowBandwidthModeKey = 'LowBandwidthMode';
|
||||
const _themeModeKey = 'ThemeMode';
|
||||
const _colorBlindnessTestingModeKey = 'ColorBlindnessTestingMode';
|
||||
const _logLevelKey = 'LogLevel';
|
||||
|
||||
ColorBlindnessType _colorBlindnessTypeFromPrefs(SharedPreferences prefs) {
|
||||
final cbString = prefs.getString(_colorBlindnessTestingModeKey);
|
||||
|
@ -66,3 +79,20 @@ ColorBlindnessType _colorBlindnessTypeFromPrefs(SharedPreferences prefs) {
|
|||
orElse: () => ColorBlindnessType.none,
|
||||
);
|
||||
}
|
||||
|
||||
Level _levelFromPrefs(SharedPreferences prefs) {
|
||||
final levelString = prefs.getString(_logLevelKey);
|
||||
return switch (levelString) {
|
||||
'ALL' => Level.ALL,
|
||||
'FINEST' => Level.FINEST,
|
||||
'FINER' => Level.FINER,
|
||||
'FINE' => Level.FINE,
|
||||
'CONFIG' => Level.CONFIG,
|
||||
'INFO' => Level.INFO,
|
||||
'WARNING' => Level.WARNING,
|
||||
'SEVERE' => Level.SEVERE,
|
||||
'SHOUT' => Level.SHOUT,
|
||||
'OFF' => Level.OFF,
|
||||
_ => Level.OFF,
|
||||
};
|
||||
}
|
||||
|
|
11
lib/utils/logrecord_extensions.dart
Normal file
11
lib/utils/logrecord_extensions.dart
Normal file
|
@ -0,0 +1,11 @@
|
|||
import 'package:logging/logging.dart';
|
||||
|
||||
extension LogRecordExtensions on LogRecord {
|
||||
Map<String, dynamic> toJson() => {
|
||||
'logger': loggerName,
|
||||
'level': level.toString(),
|
||||
'time': time.toIso8601String(),
|
||||
'message': message,
|
||||
'stackTrace': stackTrace?.toString() ?? 'NONE',
|
||||
};
|
||||
}
|
Loading…
Reference in a new issue