From a7e6d8af6e3df3cffca918c5a593a072a34f7542 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 26 Jun 2026 16:21:16 +0200 Subject: [PATCH] Better fix to render all items in the gallery. Should be able to render mixed items. --- .../features/messages/impl/MessagesFlowNode.kt | 2 -- .../android/libraries/mediaviewer/api/MediaInfo.kt | 1 - .../mediaviewer/api/MediaViewerEntryPoint.kt | 3 +++ .../impl/viewer/GalleryMediaGalleryDataSource.kt | 6 ++---- .../mediaviewer/impl/viewer/MediaViewerDataSource.kt | 1 + .../mediaviewer/impl/viewer/MediaViewerNode.kt | 11 +++++------ .../mediaviewer/impl/viewer/MediaViewerPresenter.kt | 2 ++ 7 files changed, 13 insertions(+), 13 deletions(-) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesFlowNode.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesFlowNode.kt index 9b8577f8ac..da7f3d8d5b 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesFlowNode.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesFlowNode.kt @@ -812,7 +812,6 @@ class MessagesFlowNode( mode = DateFormatterMode.Full, ), initialIndex = galleryItemIndex, - isAttachment = false, ) val galleryItems = event.content.items.map { galleryItem -> GalleryItemData( @@ -845,7 +844,6 @@ class MessagesFlowNode( mode = DateFormatterMode.Full, ), initialIndex = galleryItemIndex, - isAttachment = true, ) val galleryItems = event.content.attachments.map { attachment -> GalleryItemData( diff --git a/libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/MediaInfo.kt b/libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/MediaInfo.kt index 962c73b126..6d70747a07 100644 --- a/libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/MediaInfo.kt +++ b/libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/MediaInfo.kt @@ -23,7 +23,6 @@ data class GalleryInfo( val dateSent: String?, val dateSentFull: String?, val initialIndex: Int, - val isAttachment: Boolean, ) : Parcelable @Parcelize diff --git a/libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/MediaViewerEntryPoint.kt b/libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/MediaViewerEntryPoint.kt index ba9f371df1..7930175d53 100644 --- a/libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/MediaViewerEntryPoint.kt +++ b/libraries/mediaviewer/api/src/main/kotlin/io/element/android/libraries/mediaviewer/api/MediaViewerEntryPoint.kt @@ -58,6 +58,9 @@ interface MediaViewerEntryPoint : FeatureEntryPoint { } sealed interface MediaViewerMode : Parcelable { + @Parcelize + data object EventGallery : MediaViewerMode + @Parcelize data class TimelineImagesAndVideos(val timelineMode: Timeline.Mode) : MediaViewerMode diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/GalleryMediaGalleryDataSource.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/GalleryMediaGalleryDataSource.kt index d7ce486263..d20987cd80 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/GalleryMediaGalleryDataSource.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/GalleryMediaGalleryDataSource.kt @@ -85,10 +85,8 @@ class GalleryMediaGalleryDataSource( thumbnailSource = galleryItem.thumbnailSource, ) } - when (mediaItem) { - is MediaItem.Image, is MediaItem.Video -> imageAndVideoItems.add(mediaItem) - is MediaItem.Audio, is MediaItem.File, is MediaItem.Voice -> fileItems.add(mediaItem) - } + // Add all items to imageAndVideoItems (we can have mixed attachments) + imageAndVideoItems.add(mediaItem) } return GalleryMediaGalleryDataSource( diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerDataSource.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerDataSource.kt index 8e9d5a9fdf..7806ac2d95 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerDataSource.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerDataSource.kt @@ -64,6 +64,7 @@ class MediaViewerDataSource( private val galleryMode = when (mode) { is MediaViewerMode.TimelineImagesAndVideos -> MediaGalleryMode.Images is MediaViewerMode.TimelineFilesAndAudios -> MediaGalleryMode.Files + MediaViewerMode.EventGallery -> MediaGalleryMode.Images } // Map of sourceUrl to local media state diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerNode.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerNode.kt index d7e4985cbb..f169c6a3f1 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerNode.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerNode.kt @@ -116,6 +116,8 @@ class MediaViewerNode( ) } Timeline.Mode.Media -> timelineMediaGalleryDataSource + // null should not happen, input should be MediaViewerEntryPoint.Params.EventGallery in this case + null -> timelineMediaGalleryDataSource } } } @@ -129,11 +131,7 @@ class MediaViewerNode( is MediaViewerEntryPoint.Params.Avatar -> MediaViewerEntryPoint.MediaViewerMode.TimelineImagesAndVideos(Timeline.Mode.Media) is MediaViewerEntryPoint.Params.EventGallery -> - if (inputs.galleryInfo.isAttachment) { - MediaViewerEntryPoint.MediaViewerMode.TimelineFilesAndAudios(Timeline.Mode.Media) - } else { - MediaViewerEntryPoint.MediaViewerMode.TimelineImagesAndVideos(Timeline.Mode.Media) - } + MediaViewerEntryPoint.MediaViewerMode.EventGallery is MediaViewerEntryPoint.Params.RoomMedia -> inputs.mode }, @@ -167,9 +165,10 @@ class MediaViewerNode( } } -internal fun MediaViewerEntryPoint.MediaViewerMode.getTimelineMode(): Timeline.Mode { +internal fun MediaViewerEntryPoint.MediaViewerMode.getTimelineMode(): Timeline.Mode? { return when (this) { is MediaViewerEntryPoint.MediaViewerMode.TimelineImagesAndVideos -> timelineMode is MediaViewerEntryPoint.MediaViewerMode.TimelineFilesAndAudios -> timelineMode + MediaViewerEntryPoint.MediaViewerMode.EventGallery -> null } } diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerPresenter.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerPresenter.kt index b379f91b31..1890142b8d 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerPresenter.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerPresenter.kt @@ -240,6 +240,8 @@ class MediaViewerPresenter( val messageResId = when (inputs.mode) { is MediaViewerEntryPoint.MediaViewerMode.TimelineImagesAndVideos -> R.string.screen_media_details_no_more_media_to_show is MediaViewerEntryPoint.MediaViewerMode.TimelineFilesAndAudios -> R.string.screen_media_details_no_more_files_to_show + // Should not happen + MediaViewerEntryPoint.MediaViewerMode.EventGallery -> R.string.screen_media_details_no_more_media_to_show } val message = SnackbarMessage(messageResId) snackbarDispatcher.post(message)