diff --git a/lib/src/database/daos/messages.dao.dart b/lib/src/database/daos/messages.dao.dart index 5c280a69..5a9c7923 100644 --- a/lib/src/database/daos/messages.dao.dart +++ b/lib/src/database/daos/messages.dao.dart @@ -50,7 +50,8 @@ class MessagesDao extends DatabaseAccessor with _$MessagesDaoMixin { mediaFiles, mediaFiles.mediaId.equalsExp(messages.mediaId), ), - ])..where( + ]) + ..where( mediaFiles.downloadState .equals(DownloadState.reuploadRequested.name) .not() & @@ -60,7 +61,8 @@ class MessagesDao extends DatabaseAccessor with _$MessagesDaoMixin { messages.mediaId.isNotNull() & messages.senderId.isNotNull() & messages.type.equals(MessageType.media.name), - ); + ) + ..orderBy([OrderingTerm.asc(messages.createdAt)]); return query.map((row) => row.readTable(messages)).watch(); } diff --git a/lib/src/visual/views/camera/camera_preview_components/camera_preview_controller_view.dart b/lib/src/visual/views/camera/camera_preview_components/camera_preview_controller_view.dart index 253e62c8..08c37db9 100644 --- a/lib/src/visual/views/camera/camera_preview_components/camera_preview_controller_view.dart +++ b/lib/src/visual/views/camera/camera_preview_components/camera_preview_controller_view.dart @@ -254,17 +254,32 @@ class _CameraPreviewViewState extends State { } } - Future requestMicrophonePermission() async { - final statuses = await [ - Permission.microphone, - ].request(); - if (statuses[Permission.microphone]!.isPermanentlyDenied) { - await openAppSettings(); - } else { - _hasAudioPermission = await Permission.microphone.isGranted; - setState(() { - // _hasAudioPermission - }); + Future requestMicrophonePermission({int retryCount = 0}) async { + try { + final statuses = await [ + Permission.microphone, + ].request(); + if (statuses[Permission.microphone]!.isPermanentlyDenied) { + await openAppSettings(); + } else { + _hasAudioPermission = await Permission.microphone.isGranted; + setState(() { + // _hasAudioPermission + }); + } + } on PlatformException catch (e) { + if (e.message?.contains('already running') ?? false) { + if (retryCount < 5) { + Log.warn( + 'Microphone permission request conflict, retrying in 300ms... (attempt ${retryCount + 1})', + ); + await Future.delayed(const Duration(milliseconds: 300)); + return requestMicrophonePermission(retryCount: retryCount + 1); + } + } + Log.error('PlatformException in requestMicrophonePermission: $e'); + } catch (e) { + Log.error('Error in requestMicrophonePermission: $e'); } } diff --git a/lib/src/visual/views/chats/media_viewer.view.dart b/lib/src/visual/views/chats/media_viewer.view.dart index 76aa2d6e..e1c16156 100644 --- a/lib/src/visual/views/chats/media_viewer.view.dart +++ b/lib/src/visual/views/chats/media_viewer.view.dart @@ -158,6 +158,19 @@ class _MediaViewerViewState extends State { allMediaFiles.add(msg); } } + if (allMediaFiles.length > 1) { + if (widget.initialMessage == null && + currentMedia == null && + !_showDownloadingLoader) { + allMediaFiles.sort( + (a, b) => a.createdAt.compareTo(b.createdAt), + ); + } else { + final upcoming = allMediaFiles.sublist(1) + ..sort((a, b) => a.createdAt.compareTo(b.createdAt)); + allMediaFiles = [allMediaFiles.first, ...upcoming]; + } + } if (mounted) setState(() {}); if (firstRun) { firstRun = false; diff --git a/lib/src/visual/views/onboarding/setup/profile.setup.dart b/lib/src/visual/views/onboarding/setup/profile.setup.dart index d2bf2769..0f695e11 100644 --- a/lib/src/visual/views/onboarding/setup/profile.setup.dart +++ b/lib/src/visual/views/onboarding/setup/profile.setup.dart @@ -59,6 +59,7 @@ class _ProfileSetupPageState extends State { builder: (context, asyncSnapshot) { return Container( padding: const EdgeInsets.all(4), + clipBehavior: Clip.antiAlias, decoration: BoxDecoration( shape: BoxShape.circle, border: Border.all( @@ -67,7 +68,7 @@ class _ProfileSetupPageState extends State { ), ), child: const AvatarIcon( - fontSize: 70, + fontSize: 68, myAvatar: true, ), );