diff --git a/lib/app_theme.dart b/lib/app_theme.dart index 97957db..3f1f190 100644 --- a/lib/app_theme.dart +++ b/lib/app_theme.dart @@ -1,5 +1,4 @@ import 'package:color_blindness/color_blindness.dart'; -import 'package:color_blindness/color_blindness_color_scheme.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; diff --git a/lib/controls/audio_video/video_player_lib_av_control.dart b/lib/controls/audio_video/video_player_lib_av_control.dart index bfb6bfe..cfcc8b6 100644 --- a/lib/controls/audio_video/video_player_lib_av_control.dart +++ b/lib/controls/audio_video/video_player_lib_av_control.dart @@ -27,7 +27,8 @@ class _VideoPlayerLibAvControlState extends State { @override void initState() { super.initState(); - videoPlayerController = VideoPlayerController.network(widget.videoUrl); + videoPlayerController = + VideoPlayerController.networkUrl(Uri.parse(widget.videoUrl)); } @override @@ -70,7 +71,7 @@ class _VideoPlayerLibAvControlState extends State { videoWidth = scaling * size.width; videoHeight = scaling * size.height; } - print('Video Width: $videoWidth, Video Height: $videoHeight'); + return GestureDetector( onTap: toggleVideoPlay, child: Column( diff --git a/lib/controls/autocomplete/mention_autocomplete_options.dart b/lib/controls/autocomplete/mention_autocomplete_options.dart index de3bdd4..485b3d8 100644 --- a/lib/controls/autocomplete/mention_autocomplete_options.dart +++ b/lib/controls/autocomplete/mention_autocomplete_options.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:logging/logging.dart'; import 'package:provider/provider.dart'; import '../../models/connection.dart'; @@ -9,8 +8,6 @@ import '../../utils/active_profile_selector.dart'; import '../image_control.dart'; class MentionAutocompleteOptions extends StatelessWidget { - static final _logger = Logger('$MentionAutocompleteOptions'); - const MentionAutocompleteOptions({ super.key, required this.id, diff --git a/lib/controls/notifications_control.dart b/lib/controls/notifications_control.dart index 17a6c99..46d60e5 100644 --- a/lib/controls/notifications_control.dart +++ b/lib/controls/notifications_control.dart @@ -38,11 +38,15 @@ class NotificationControl extends StatelessWidget { } final loadedPost = await manager.refreshStatusChain(notification.iid); if (loadedPost.isSuccess) { - context.push('/post/view/${loadedPost.value.id}/${notification.iid}'); + if (context.mounted) { + context.push('/post/view/${loadedPost.value.id}/${notification.iid}'); + } return; } - buildSnackbar( - context, 'Error getting data for notification: ${loadedPost.error}'); + if (context.mounted) { + buildSnackbar( + context, 'Error getting data for notification: ${loadedPost.error}'); + } } @override diff --git a/lib/controls/timeline/timeline_panel.dart b/lib/controls/timeline/timeline_panel.dart index 9b78c75..cbd0720 100644 --- a/lib/controls/timeline/timeline_panel.dart +++ b/lib/controls/timeline/timeline_panel.dart @@ -5,7 +5,7 @@ import 'package:relatica/controls/padding.dart'; import 'package:relatica/globals.dart'; import 'package:scrollable_positioned_list/scrollable_positioned_list.dart'; -import '../../models/TimelineIdentifiers.dart'; +import '../../models/timeline_identifiers.dart'; import '../../services/network_status_service.dart'; import '../../services/setting_service.dart'; import '../../services/timeline_manager.dart'; diff --git a/lib/friendica_client/friendica_client.dart b/lib/friendica_client/friendica_client.dart index e74c1d6..74b6c38 100644 --- a/lib/friendica_client/friendica_client.dart +++ b/lib/friendica_client/friendica_client.dart @@ -8,7 +8,6 @@ import 'package:result_monad/result_monad.dart'; import '../friendica_client/paged_response.dart'; import '../globals.dart'; -import '../models/TimelineIdentifiers.dart'; import '../models/auth/profile.dart'; import '../models/circle_data.dart'; import '../models/connection.dart'; @@ -22,6 +21,7 @@ import '../models/media_attachment_uploads/image_types_enum.dart'; import '../models/search_results.dart'; import '../models/search_types.dart'; import '../models/timeline_entry.dart'; +import '../models/timeline_identifiers.dart'; import '../models/user_notification.dart'; import '../models/visibility.dart'; import '../serializers/friendica/direct_message_friendica_extensions.dart'; diff --git a/lib/main.dart b/lib/main.dart index a222708..328d89b 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -36,7 +36,6 @@ void main() async { getIt.registerSingleton(logService); // await dotenv.load(fileName: '.env'); - const enablePreview = false; Logger.root.level = Level.OFF; Logger.root.onRecord.listen((event) { logService.add(event); @@ -70,7 +69,6 @@ class App extends StatelessWidget { return AnimatedBuilder( builder: (context, child) { Logger.root.level = settingsService.logLevel; - print('Log level: ${settingsService.logLevel}'); return Portal( child: MultiProvider( providers: [ diff --git a/lib/models/auth/basic_credentials.dart b/lib/models/auth/basic_credentials.dart index 8cc4430..c90e04e 100644 --- a/lib/models/auth/basic_credentials.dart +++ b/lib/models/auth/basic_credentials.dart @@ -1,6 +1,6 @@ import 'dart:convert'; -import 'package:result_monad/src/result_monad_base.dart'; +import 'package:result_monad/result_monad.dart'; import 'package:uuid/uuid.dart'; import '../exec_error.dart'; diff --git a/lib/models/timeline.dart b/lib/models/timeline.dart index 768ccf1..013af3a 100644 --- a/lib/models/timeline.dart +++ b/lib/models/timeline.dart @@ -1,5 +1,5 @@ -import 'TimelineIdentifiers.dart'; import 'entry_tree_item.dart'; +import 'timeline_identifiers.dart'; const defaultLowestId = 9223372036854775807; const defaultHighestId = 0; diff --git a/lib/models/TimelineIdentifiers.dart b/lib/models/timeline_identifiers.dart similarity index 100% rename from lib/models/TimelineIdentifiers.dart rename to lib/models/timeline_identifiers.dart diff --git a/lib/screens/circle_add_users_screen.dart b/lib/screens/circle_add_users_screen.dart index 0ebf071..cfbe6e6 100644 --- a/lib/screens/circle_add_users_screen.dart +++ b/lib/screens/circle_add_users_screen.dart @@ -54,7 +54,9 @@ class _CircleAddUsersScreenState extends State { onSuccess: (_) => 'Added $messageBase', onError: (error) => 'Error adding $messageBase: $error', ); - buildSnackbar(context, message); + if (mounted) { + buildSnackbar(context, message); + } } } diff --git a/lib/screens/circle_editor_screen.dart b/lib/screens/circle_editor_screen.dart index d354a69..6061050 100644 --- a/lib/screens/circle_editor_screen.dart +++ b/lib/screens/circle_editor_screen.dart @@ -81,7 +81,9 @@ class _CircleEditorScreenState extends State { onSuccess: (_) => 'Removed $messageBase', onError: (error) => 'Error removing $messageBase: $error', ); - buildSnackbar(context, message); + if (mounted) { + buildSnackbar(context, message); + } } } diff --git a/lib/screens/editor.dart b/lib/screens/editor.dart index c1b0360..d0fa4f9 100644 --- a/lib/screens/editor.dart +++ b/lib/screens/editor.dart @@ -178,7 +178,7 @@ class _EditorScreenState extends State { return; } - if (mounted && context.canPop()) { + if (context.mounted && context.canPop()) { context.pop(); } } @@ -220,7 +220,7 @@ class _EditorScreenState extends State { return; } - if (mounted && context.canPop()) { + if (context.mounted && context.canPop()) { context.pop(); } } @@ -254,51 +254,49 @@ class _EditorScreenState extends State { } else { final mainBody = Padding( padding: const EdgeInsets.all(8.0), - child: Container( - child: SingleChildScrollView( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - if (isComment && parentEntry != null) - buildCommentPreview(context, parentEntry!), - TextFormField( - readOnly: isSubmitting, - enabled: !isSubmitting && canSpoilerText, - controller: spoilerController, - textCapitalization: TextCapitalization.sentences, - decoration: InputDecoration( - labelText: canSpoilerText - ? '$statusType Spoiler Text (optional)' - : 'Your server doesnt support $statusType Spoiler Text', - border: OutlineInputBorder( - borderSide: const BorderSide(), - borderRadius: BorderRadius.circular(5.0), - ), + child: SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + if (isComment && parentEntry != null) + buildCommentPreview(context, parentEntry!), + TextFormField( + readOnly: isSubmitting, + enabled: !isSubmitting && canSpoilerText, + controller: spoilerController, + textCapitalization: TextCapitalization.sentences, + decoration: InputDecoration( + labelText: canSpoilerText + ? '$statusType Spoiler Text (optional)' + : 'Your server doesnt support $statusType Spoiler Text', + border: OutlineInputBorder( + borderSide: const BorderSide(), + borderRadius: BorderRadius.circular(5.0), ), ), - const VerticalPadding(), - buildVisibilitySelector(context), - const VerticalPadding(), - buildContentField(context), - CharacterCountWidget( - contentController: contentController, - linkPreviewController: linkPreviewController, - ), - const VerticalPadding(), - buildLinkWithPreview(context), - const VerticalPadding(), - GallerySelectorControl( - entries: existingMediaItems, - visibilityFilter: visibility, - ), - const VerticalPadding(), - MediaUploadsControl( - entryMediaItems: newMediaItems, - ), - buildButtonBar(context, manager), - ], - ), + ), + const VerticalPadding(), + buildVisibilitySelector(context), + const VerticalPadding(), + buildContentField(context), + CharacterCountWidget( + contentController: contentController, + linkPreviewController: linkPreviewController, + ), + const VerticalPadding(), + buildLinkWithPreview(context), + const VerticalPadding(), + GallerySelectorControl( + entries: existingMediaItems, + visibilityFilter: visibility, + ), + const VerticalPadding(), + MediaUploadsControl( + entryMediaItems: newMediaItems, + ), + buildButtonBar(context, manager), + ], ), ), ); diff --git a/lib/screens/filter_editor_screen.dart b/lib/screens/filter_editor_screen.dart index b772bf4..baff573 100644 --- a/lib/screens/filter_editor_screen.dart +++ b/lib/screens/filter_editor_screen.dart @@ -133,10 +133,12 @@ class _FilterEditorScreenState extends State { } if (filteredAuthors.contains(newConnection)) { - buildSnackbar( - context, - 'Already filtering on ${newConnection.handle}', - ); + if (context.mounted) { + buildSnackbar( + context, + 'Already filtering on ${newConnection.handle}', + ); + } } setState(() { filteredAuthors.add(newConnection); diff --git a/lib/screens/home.dart b/lib/screens/home.dart index 82fb0d3..6833cf7 100644 --- a/lib/screens/home.dart +++ b/lib/screens/home.dart @@ -10,7 +10,7 @@ import '../controls/responsive_max_width.dart'; import '../controls/standard_app_drawer.dart'; import '../controls/timeline/timeline_panel.dart'; import '../globals.dart'; -import '../models/TimelineIdentifiers.dart'; +import '../models/timeline_identifiers.dart'; import '../services/auth_service.dart'; import '../services/network_status_service.dart'; import '../services/timeline_manager.dart'; diff --git a/lib/screens/image_editor_screen.dart b/lib/screens/image_editor_screen.dart index 6217189..9edcb3f 100644 --- a/lib/screens/image_editor_screen.dart +++ b/lib/screens/image_editor_screen.dart @@ -106,7 +106,7 @@ class _ImageEditorScreenState extends State { context, 'Cancel changes?', ); - if (ok == true && mounted) { + if (ok == true && context.mounted) { context.pop(); } }, diff --git a/lib/screens/media_viewer_screen.dart b/lib/screens/media_viewer_screen.dart index 74c094a..a2d687f 100644 --- a/lib/screens/media_viewer_screen.dart +++ b/lib/screens/media_viewer_screen.dart @@ -67,7 +67,7 @@ class _MediaViewerScreenState extends State { final bytesResult = await RemoteFileClient(getIt().currentProfile) .getFileBytes(attachment.uri); - if (bytesResult.isFailure && mounted) { + if (bytesResult.isFailure && context.mounted) { buildSnackbar(context, 'Error getting full size version of file: ${bytesResult.error}'); return; @@ -75,10 +75,13 @@ class _MediaViewerScreenState extends State { if (Platform.isAndroid || Platform.isIOS) { final saveResult = await ImageGallerySaver.saveImage(bytesResult.value); - if (saveResult['isSuccess']) { - buildSnackbar(context, 'Image saved to gallery'); - } else { - buildSnackbar(context, 'Unable to save to gallery, check permissions'); + if (context.mounted) { + if (saveResult['isSuccess']) { + buildSnackbar(context, 'Image saved to gallery'); + } else { + buildSnackbar( + context, 'Unable to save to gallery, check permissions'); + } } } else { final location = await FilePicker.platform.saveFile( diff --git a/lib/screens/notifications_screen.dart b/lib/screens/notifications_screen.dart index 2c52a27..e8802b6 100644 --- a/lib/screens/notifications_screen.dart +++ b/lib/screens/notifications_screen.dart @@ -168,7 +168,9 @@ class NotificationsScreen extends StatelessWidget { final message = (await manager.markAllAsRead()).fold( onSuccess: (_) => 'Marked all notifications as read', onError: (error) => 'Error marking notifications: $error'); - buildSnackbar(context, message); + if (context.mounted) { + buildSnackbar(context, message); + } } } } diff --git a/lib/screens/post_screen.dart b/lib/screens/post_screen.dart index 31cc629..c8d9a24 100644 --- a/lib/screens/post_screen.dart +++ b/lib/screens/post_screen.dart @@ -30,6 +30,7 @@ class _PostScreenState extends State { @override void initState() { + super.initState(); Future.delayed(const Duration(milliseconds: 500), () async { getIt>() .activeEntry diff --git a/lib/screens/search_screen.dart b/lib/screens/search_screen.dart index c2b4721..5667bbe 100644 --- a/lib/screens/search_screen.dart +++ b/lib/screens/search_screen.dart @@ -62,13 +62,11 @@ class _SearchScreenState extends State { } Future updateSearchResults(Profile profile, {bool reset = true}) async { - print('Starting update'); if (reset) { nextPage = PagingData(limit: limit); searchResult = SearchResults.empty(); } - print('Search $searchType on ${searchTextController.text}'); final result = await SearchClient(profile) .search(searchType, searchTextController.text, nextPage); result.match( @@ -80,12 +78,9 @@ class _SearchScreenState extends State { onError: (error) => buildSnackbar(context, 'Error getting search result: $error'), ); - - print('Ending update'); } clearSearchResults() { - print('Clearing results'); setState(() { searchResult = SearchResults.empty(); searchTextController.text = ''; @@ -329,7 +324,7 @@ class _SearchScreenState extends State { await cm.fullRefresh(connection); } }); - if (context.mounted) { + if (mounted) { context.pushNamed(ScreenPaths.userProfile, pathParameters: {'id': connection.id}); } diff --git a/lib/screens/settings_screen.dart b/lib/screens/settings_screen.dart index f5f0c3d..e358eb0 100644 --- a/lib/screens/settings_screen.dart +++ b/lib/screens/settings_screen.dart @@ -219,7 +219,7 @@ class NetworkCapabilitiesWidget extends StatelessWidget { } return ListTile( - title: Row( + title: const Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text('Network Capabilities'), @@ -230,7 +230,7 @@ class NetworkCapabilitiesWidget extends StatelessWidget { ], ), subtitle: DataTable( - columns: [ + columns: const [ DataColumn(label: Text('Network')), DataColumn(label: Text('React')), DataColumn(label: Text('Reshare')), diff --git a/lib/screens/sign_in.dart b/lib/screens/sign_in.dart index e4e6b3a..907e7b1 100644 --- a/lib/screens/sign_in.dart +++ b/lib/screens/sign_in.dart @@ -274,7 +274,7 @@ class _SignInScreenState extends State { onPressed: () async => await _signIn(context), child: const Text('Signin'), ) - : SizedBox(), + : const SizedBox(), const VerticalPadding(), Text( 'Logged out:', @@ -383,14 +383,13 @@ class _SignInScreenState extends State { final confirm = await showYesNoDialog(context, 'Are you sure you want to logout and delete *all* accounts? This cannot be undone.') ?? false; - print(confirm); if (!confirm) { return; } await getIt().clearAllProfiles(); }, - child: Text('Clear All')), + child: const Text('Clear All')), ], ), ), @@ -438,16 +437,16 @@ class _SignInScreenState extends State { creds, withNotification: false, ); - if (mounted && result.isFailure) { + if (context.mounted && result.isFailure) { buildSnackbar(context, 'Error signing in: ${result.error}'); return; } - if (mounted) { + if (context.mounted) { buildSnackbar(context, 'Account signed in...'); } await getIt().setActiveProfile(result.value); - if (mounted) { + if (context.mounted) { context.goNamed(ScreenPaths.timelines); } } diff --git a/lib/screens/user_posts_screen.dart b/lib/screens/user_posts_screen.dart index 9d5e52c..f1b9325 100644 --- a/lib/screens/user_posts_screen.dart +++ b/lib/screens/user_posts_screen.dart @@ -4,7 +4,7 @@ import '../controls/linear_status_indicator.dart'; import '../controls/standard_appbar.dart'; import '../controls/timeline/timeline_panel.dart'; import '../globals.dart'; -import '../models/TimelineIdentifiers.dart'; +import '../models/timeline_identifiers.dart'; import '../services/network_status_service.dart'; import '../services/timeline_manager.dart'; import '../utils/active_profile_selector.dart'; diff --git a/lib/screens/user_profile_screen.dart b/lib/screens/user_profile_screen.dart index 66abb89..2916e66 100644 --- a/lib/screens/user_profile_screen.dart +++ b/lib/screens/user_profile_screen.dart @@ -189,7 +189,7 @@ class _UserProfileScreenState extends State { } else { await manager.removeUserFromCircle(g, profile); } - if (mounted) { + if (context.mounted) { buildSnackbar(context, "User's Circles Updated"); } diff --git a/lib/services/connections_manager.dart b/lib/services/connections_manager.dart index 41b82e1..46fc351 100644 --- a/lib/services/connections_manager.dart +++ b/lib/services/connections_manager.dart @@ -322,7 +322,7 @@ class ConnectionsManager extends ChangeNotifier { Result, ExecError> getCirclesForUser(String id) { final result = circlesRepo.getCirclesForUser(id); if (result.isSuccess) { - print("Circles for user $id: $result"); + _logger.finer("Circles for user $id: $result"); return result; } diff --git a/lib/services/entry_manager_service.dart b/lib/services/entry_manager_service.dart index 3460438..d87ffab 100644 --- a/lib/services/entry_manager_service.dart +++ b/lib/services/entry_manager_service.dart @@ -6,13 +6,13 @@ import 'package:result_monad/result_monad.dart'; import '../friendica_client/friendica_client.dart'; import '../friendica_client/paging_data.dart'; import '../globals.dart'; -import '../models/TimelineIdentifiers.dart'; import '../models/auth/profile.dart'; import '../models/entry_tree_item.dart'; import '../models/exec_error.dart'; import '../models/image_entry.dart'; import '../models/media_attachment_uploads/new_entry_media_items.dart'; import '../models/timeline_entry.dart'; +import '../models/timeline_identifiers.dart'; import '../models/visibility.dart'; import '../utils/active_profile_selector.dart'; import 'media_upload_attachment_helper.dart'; diff --git a/lib/services/notifications_manager.dart b/lib/services/notifications_manager.dart index 17a9e42..ee6698a 100644 --- a/lib/services/notifications_manager.dart +++ b/lib/services/notifications_manager.dart @@ -80,8 +80,9 @@ class NotificationsManager extends ChangeNotifier { first = false; result.match( - onSuccess: (nd) => print('Got ${nd.data.length} notifications'), - onError: (e) => debugPrint('Error getting notification: $e')); + onSuccess: (nd) => + _logger.fine('Got ${nd.data.length} notifications'), + onError: (e) => _logger.severe('Error getting notification: $e')); final response = result.getValueOrElse(() => PagedResponse([])); response.data .where((n) => diff --git a/lib/services/timeline_manager.dart b/lib/services/timeline_manager.dart index b82601c..fda1a2d 100644 --- a/lib/services/timeline_manager.dart +++ b/lib/services/timeline_manager.dart @@ -4,7 +4,6 @@ import 'package:result_monad/result_monad.dart'; import '../data/interfaces/circles_repo_intf.dart'; import '../friendica_client/friendica_client.dart'; -import '../models/TimelineIdentifiers.dart'; import '../models/auth/profile.dart'; import '../models/circle_data.dart'; import '../models/entry_tree_item.dart'; @@ -13,6 +12,7 @@ import '../models/image_entry.dart'; import '../models/media_attachment_uploads/new_entry_media_items.dart'; import '../models/timeline.dart'; import '../models/timeline_entry.dart'; +import '../models/timeline_identifiers.dart'; import '../models/visibility.dart'; import 'entry_manager_service.dart'; diff --git a/lib/utils/entry_tree_item_flattening.dart b/lib/utils/entry_tree_item_flattening.dart index 5501265..b4b33f8 100644 --- a/lib/utils/entry_tree_item_flattening.dart +++ b/lib/utils/entry_tree_item_flattening.dart @@ -2,10 +2,10 @@ import '../models/entry_tree_item.dart'; import '../models/flattened_tree_item.dart'; extension FlatteningExtensions on EntryTreeItem { - static const BaseLevel = 0; + static const baseLevel = 0; List flatten( - {int level = BaseLevel, bool topLevelOnly = false}) { + {int level = baseLevel, bool topLevelOnly = false}) { final items = []; final myEntry = FlattenedTreeItem( timelineEntry: entry, @@ -23,7 +23,7 @@ extension FlatteningExtensions on EntryTreeItem { c1.entry.creationTimestamp.compareTo(c2.entry.creationTimestamp)); for (final child in sortedChildren) { int childLevel = level + 1; - if (child.entry.authorId == entry.authorId && level != BaseLevel) { + if (child.entry.authorId == entry.authorId && level != baseLevel) { childLevel = level; } diff --git a/lib/utils/html_to_edit_text_helper.dart b/lib/utils/html_to_edit_text_helper.dart index f452b2b..edbdb7d 100644 --- a/lib/utils/html_to_edit_text_helper.dart +++ b/lib/utils/html_to_edit_text_helper.dart @@ -38,9 +38,7 @@ void _updateSwapTagLinks(Node node, List tags) { if (hasExpectedTag) { final profile = getIt().currentProfile; final newTagUrl = generateTagUrlFromProfile(profile, tag); - print(node.attributes['href']); node.attributes['href'] = newTagUrl.toString(); - print(node.attributes['href']); } } for (var n in node.nodes) { diff --git a/lib/utils/network_utils.dart b/lib/utils/network_utils.dart index 60690f3..03b8a10 100644 --- a/lib/utils/network_utils.dart +++ b/lib/utils/network_utils.dart @@ -1,6 +1,6 @@ import 'dart:convert'; -import 'package:collection/collection.dart'; +import 'package:collection/collection.dart' show MapEquality; import 'package:http/http.dart' as http; import 'package:logging/logging.dart'; import 'package:result_monad/result_monad.dart'; @@ -149,7 +149,6 @@ class _ExpiringRequestCache { response, ); - print('Adding cached response for $type => $url'); _responses[cacheEntry] = cacheEntry; }