diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryState.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryState.kt index 51ae794175..1cfcd40a60 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryState.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryState.kt @@ -25,7 +25,14 @@ data class MediaGalleryState( data class GroupedMediaItems( val imageAndVideoItems: ImmutableList, val fileItems: ImmutableList, -) +) { + fun getItems(mode: MediaGalleryMode): ImmutableList { + return when (mode) { + MediaGalleryMode.Images -> imageAndVideoItems + MediaGalleryMode.Files -> fileItems + } + } +} enum class MediaGalleryMode(val stringResource: Int) { Images(R.string.screen_media_browser_list_mode_media), diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryStateProvider.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryStateProvider.kt index 8876917bf6..42585d8219 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryStateProvider.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryStateProvider.kt @@ -84,6 +84,27 @@ open class MediaGalleryStateProvider : PreviewParameterProvider Unit, ) { - when (val groupedMediaItems = state.groupedMediaItems) { - AsyncData.Uninitialized, - is AsyncData.Loading -> { - LoadingContent(mode) - } - is AsyncData.Success -> { - when (mode) { - MediaGalleryMode.Images -> MediaGalleryImages( - imagesAndVideos = groupedMediaItems.data.imageAndVideoItems, - eventSink = state.eventSink, - onItemClick = onItemClick, - ) - MediaGalleryMode.Files -> MediaGalleryFiles( - files = groupedMediaItems.data.fileItems, - eventSink = state.eventSink, - onItemClick = onItemClick, + val groupedMediaItems = state.groupedMediaItems + if (groupedMediaItems.isLoadingItems(mode)) { + LoadingContent(mode) + } else { + when (groupedMediaItems) { + is AsyncData.Success -> { + when (mode) { + MediaGalleryMode.Images -> MediaGalleryImages( + imagesAndVideos = groupedMediaItems.data.imageAndVideoItems, + eventSink = state.eventSink, + onItemClick = onItemClick, + ) + MediaGalleryMode.Files -> MediaGalleryFiles( + files = groupedMediaItems.data.fileItems, + eventSink = state.eventSink, + onItemClick = onItemClick, + ) + } + } + is AsyncData.Failure -> { + ErrorContent( + error = groupedMediaItems.error, ) } + else -> Unit } - is AsyncData.Failure -> { - ErrorContent( - error = groupedMediaItems.error, - ) - } + } +} + +/** + * Return true when the timeline is not loaded or if it contains only a single loading item. + */ +private fun AsyncData.isLoadingItems(mode: MediaGalleryMode): Boolean { + return when (this) { + AsyncData.Uninitialized, + is AsyncData.Loading -> true + is AsyncData.Success -> data.getItems(mode).singleOrNull() is MediaItem.LoadingIndicator + is AsyncData.Failure -> false } }