diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryView.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryView.kt index bcd9b2a238..b71648b027 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryView.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryView.kt @@ -198,6 +198,13 @@ private fun MediaGalleryPage( ) { val groupedMediaItems = state.groupedMediaItems if (groupedMediaItems.isLoadingItems(mode)) { + // Need to trigger a pagination now if there is only one LoadingIndicator. + (groupedMediaItems.dataOrNull() + ?.getItems(mode)?.singleOrNull() as? MediaItem.LoadingIndicator)?.let { item -> + LaunchedEffect(item.timestamp) { + state.eventSink(MediaGalleryEvents.LoadMore(item.direction)) + } + } LoadingContent(mode) } else { when (groupedMediaItems) { 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 9138334e90..5d610589b6 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 @@ -71,14 +71,26 @@ class MediaViewerDataSource( fun dataFlow(): Flow> { return galleryDataSource.groupedMediaItemsFlow() .map { groupedItems -> - if (groupedItems is AsyncData.Failure) { - persistentListOf( - MediaViewerPageData.Failure(groupedItems.error), - ) - } else { - val mediaItems = groupedItems.dataOrNull()?.getItems(galleryMode).orEmpty() - withContext(dispatcher) { - buildMediaViewerPageList(mediaItems) + when (groupedItems) { + AsyncData.Uninitialized, + is AsyncData.Loading -> { + persistentListOf( + MediaViewerPageData.Loading( + direction = Timeline.PaginationDirection.BACKWARDS, + timestamp = systemClock.epochMillis(), + ) + ) + } + is AsyncData.Failure -> { + persistentListOf( + MediaViewerPageData.Failure(groupedItems.error), + ) + } + is AsyncData.Success -> { + withContext(dispatcher) { + val mediaItems = groupedItems.data.getItems(galleryMode) + buildMediaViewerPageList(mediaItems) + } } } } @@ -117,14 +129,6 @@ class MediaViewerDataSource( ) } } - if (isEmpty()) { - add( - MediaViewerPageData.Loading( - direction = Timeline.PaginationDirection.BACKWARDS, - timestamp = systemClock.epochMillis(), - ) - ) - } }.toPersistentList() fun clearLoadingError(data: MediaViewerPageData.MediaViewerData) { diff --git a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerDataSourceTest.kt b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerDataSourceTest.kt index 4af8fe0066..5348eb2aa3 100644 --- a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerDataSourceTest.kt +++ b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerDataSourceTest.kt @@ -91,13 +91,7 @@ class MediaViewerDataSourceTest { ) ) val result = awaitItem() - assertThat(result).hasSize(1) - assertThat(result.first()).isEqualTo( - MediaViewerPageData.Loading( - direction = Timeline.PaginationDirection.BACKWARDS, - timestamp = A_FAKE_TIMESTAMP, - ) - ) + assertThat(result).isEmpty() } } diff --git a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerPresenterTest.kt b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerPresenterTest.kt index 00a9260f7b..ac0acfe719 100644 --- a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerPresenterTest.kt +++ b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerPresenterTest.kt @@ -72,7 +72,7 @@ class MediaViewerPresenterTest { ) presenter.test { val initialState = awaitFirstItem() - assertThat(initialState.listData.singleOrNull()).isInstanceOf(MediaViewerPageData.Loading::class.java) + assertThat(initialState.listData).isEmpty() assertThat(initialState.currentIndex).isEqualTo(0) assertThat(initialState.snackbarMessage).isNull() assertThat(initialState.canShowInfo).isTrue() @@ -90,7 +90,7 @@ class MediaViewerPresenterTest { ) presenter.test { val initialState = awaitFirstItem() - assertThat(initialState.listData.singleOrNull()).isInstanceOf(MediaViewerPageData.Loading::class.java) + assertThat(initialState.listData).isEmpty() assertThat(initialState.currentIndex).isEqualTo(0) assertThat(initialState.snackbarMessage).isNull() assertThat(initialState.canShowInfo).isFalse() @@ -108,7 +108,7 @@ class MediaViewerPresenterTest { ) presenter.test { val initialState = awaitFirstItem() - assertThat(initialState.listData.singleOrNull()).isInstanceOf(MediaViewerPageData.Loading::class.java) + assertThat(initialState.listData).isEmpty() assertThat(initialState.currentIndex).isEqualTo(0) assertThat(initialState.snackbarMessage).isNull() assertThat(initialState.canShowInfo).isTrue() @@ -127,7 +127,7 @@ class MediaViewerPresenterTest { ) presenter.test { val initialState = awaitFirstItem() - assertThat(initialState.listData.singleOrNull()).isInstanceOf(MediaViewerPageData.Loading::class.java) + assertThat(initialState.listData).isEmpty() assertThat(initialState.currentIndex).isEqualTo(0) assertThat(initialState.snackbarMessage).isNull() assertThat(initialState.canShowInfo).isTrue() @@ -146,7 +146,7 @@ class MediaViewerPresenterTest { val anImage = aMediaItemImage() presenter.test { val initialState = awaitFirstItem() - assertThat(initialState.listData.singleOrNull()).isInstanceOf(MediaViewerPageData.Loading::class.java) + assertThat(initialState.listData).isEmpty() mediaGalleryDataSource.emitGroupedMediaItems( AsyncData.Success( GroupedMediaItems(