ensure correct ordering of media files

This commit is contained in:
otsmr 2026-06-05 10:49:57 +02:00
parent 3d130cb760
commit 1d3b8dbd8a
4 changed files with 45 additions and 14 deletions

View file

@ -50,7 +50,8 @@ class MessagesDao extends DatabaseAccessor<TwonlyDB> with _$MessagesDaoMixin {
mediaFiles, mediaFiles,
mediaFiles.mediaId.equalsExp(messages.mediaId), mediaFiles.mediaId.equalsExp(messages.mediaId),
), ),
])..where( ])
..where(
mediaFiles.downloadState mediaFiles.downloadState
.equals(DownloadState.reuploadRequested.name) .equals(DownloadState.reuploadRequested.name)
.not() & .not() &
@ -60,7 +61,8 @@ class MessagesDao extends DatabaseAccessor<TwonlyDB> with _$MessagesDaoMixin {
messages.mediaId.isNotNull() & messages.mediaId.isNotNull() &
messages.senderId.isNotNull() & messages.senderId.isNotNull() &
messages.type.equals(MessageType.media.name), messages.type.equals(MessageType.media.name),
); )
..orderBy([OrderingTerm.asc(messages.createdAt)]);
return query.map((row) => row.readTable(messages)).watch(); return query.map((row) => row.readTable(messages)).watch();
} }

View file

@ -254,17 +254,32 @@ class _CameraPreviewViewState extends State<CameraPreviewView> {
} }
} }
Future<void> requestMicrophonePermission() async { Future<void> requestMicrophonePermission({int retryCount = 0}) async {
final statuses = await [ try {
Permission.microphone, final statuses = await [
].request(); Permission.microphone,
if (statuses[Permission.microphone]!.isPermanentlyDenied) { ].request();
await openAppSettings(); if (statuses[Permission.microphone]!.isPermanentlyDenied) {
} else { await openAppSettings();
_hasAudioPermission = await Permission.microphone.isGranted; } else {
setState(() { _hasAudioPermission = await Permission.microphone.isGranted;
// _hasAudioPermission 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');
} }
} }

View file

@ -158,6 +158,19 @@ class _MediaViewerViewState extends State<MediaViewerView> {
allMediaFiles.add(msg); 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 (mounted) setState(() {});
if (firstRun) { if (firstRun) {
firstRun = false; firstRun = false;

View file

@ -59,6 +59,7 @@ class _ProfileSetupPageState extends State<ProfileSetupPage> {
builder: (context, asyncSnapshot) { builder: (context, asyncSnapshot) {
return Container( return Container(
padding: const EdgeInsets.all(4), padding: const EdgeInsets.all(4),
clipBehavior: Clip.antiAlias,
decoration: BoxDecoration( decoration: BoxDecoration(
shape: BoxShape.circle, shape: BoxShape.circle,
border: Border.all( border: Border.all(
@ -67,7 +68,7 @@ class _ProfileSetupPageState extends State<ProfileSetupPage> {
), ),
), ),
child: const AvatarIcon( child: const AvatarIcon(
fontSize: 70, fontSize: 68,
myAvatar: true, myAvatar: true,
), ),
); );