Ensure gallery is paginating to get new items.

This commit is contained in:
Benoit Marty 2025-01-23 09:26:10 +01:00
parent cb5988935f
commit 4c6f46e46c
4 changed files with 33 additions and 28 deletions

View file

@ -198,6 +198,13 @@ private fun MediaGalleryPage(
) { ) {
val groupedMediaItems = state.groupedMediaItems val groupedMediaItems = state.groupedMediaItems
if (groupedMediaItems.isLoadingItems(mode)) { 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) LoadingContent(mode)
} else { } else {
when (groupedMediaItems) { when (groupedMediaItems) {

View file

@ -71,14 +71,26 @@ class MediaViewerDataSource(
fun dataFlow(): Flow<PersistentList<MediaViewerPageData>> { fun dataFlow(): Flow<PersistentList<MediaViewerPageData>> {
return galleryDataSource.groupedMediaItemsFlow() return galleryDataSource.groupedMediaItemsFlow()
.map { groupedItems -> .map { groupedItems ->
if (groupedItems is AsyncData.Failure) { when (groupedItems) {
persistentListOf( AsyncData.Uninitialized,
MediaViewerPageData.Failure(groupedItems.error), is AsyncData.Loading -> {
) persistentListOf(
} else { MediaViewerPageData.Loading(
val mediaItems = groupedItems.dataOrNull()?.getItems(galleryMode).orEmpty() direction = Timeline.PaginationDirection.BACKWARDS,
withContext(dispatcher) { timestamp = systemClock.epochMillis(),
buildMediaViewerPageList(mediaItems) )
)
}
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() }.toPersistentList()
fun clearLoadingError(data: MediaViewerPageData.MediaViewerData) { fun clearLoadingError(data: MediaViewerPageData.MediaViewerData) {

View file

@ -91,13 +91,7 @@ class MediaViewerDataSourceTest {
) )
) )
val result = awaitItem() val result = awaitItem()
assertThat(result).hasSize(1) assertThat(result).isEmpty()
assertThat(result.first()).isEqualTo(
MediaViewerPageData.Loading(
direction = Timeline.PaginationDirection.BACKWARDS,
timestamp = A_FAKE_TIMESTAMP,
)
)
} }
} }

View file

@ -72,7 +72,7 @@ class MediaViewerPresenterTest {
) )
presenter.test { presenter.test {
val initialState = awaitFirstItem() val initialState = awaitFirstItem()
assertThat(initialState.listData.singleOrNull()).isInstanceOf(MediaViewerPageData.Loading::class.java) assertThat(initialState.listData).isEmpty()
assertThat(initialState.currentIndex).isEqualTo(0) assertThat(initialState.currentIndex).isEqualTo(0)
assertThat(initialState.snackbarMessage).isNull() assertThat(initialState.snackbarMessage).isNull()
assertThat(initialState.canShowInfo).isTrue() assertThat(initialState.canShowInfo).isTrue()
@ -90,7 +90,7 @@ class MediaViewerPresenterTest {
) )
presenter.test { presenter.test {
val initialState = awaitFirstItem() val initialState = awaitFirstItem()
assertThat(initialState.listData.singleOrNull()).isInstanceOf(MediaViewerPageData.Loading::class.java) assertThat(initialState.listData).isEmpty()
assertThat(initialState.currentIndex).isEqualTo(0) assertThat(initialState.currentIndex).isEqualTo(0)
assertThat(initialState.snackbarMessage).isNull() assertThat(initialState.snackbarMessage).isNull()
assertThat(initialState.canShowInfo).isFalse() assertThat(initialState.canShowInfo).isFalse()
@ -108,7 +108,7 @@ class MediaViewerPresenterTest {
) )
presenter.test { presenter.test {
val initialState = awaitFirstItem() val initialState = awaitFirstItem()
assertThat(initialState.listData.singleOrNull()).isInstanceOf(MediaViewerPageData.Loading::class.java) assertThat(initialState.listData).isEmpty()
assertThat(initialState.currentIndex).isEqualTo(0) assertThat(initialState.currentIndex).isEqualTo(0)
assertThat(initialState.snackbarMessage).isNull() assertThat(initialState.snackbarMessage).isNull()
assertThat(initialState.canShowInfo).isTrue() assertThat(initialState.canShowInfo).isTrue()
@ -127,7 +127,7 @@ class MediaViewerPresenterTest {
) )
presenter.test { presenter.test {
val initialState = awaitFirstItem() val initialState = awaitFirstItem()
assertThat(initialState.listData.singleOrNull()).isInstanceOf(MediaViewerPageData.Loading::class.java) assertThat(initialState.listData).isEmpty()
assertThat(initialState.currentIndex).isEqualTo(0) assertThat(initialState.currentIndex).isEqualTo(0)
assertThat(initialState.snackbarMessage).isNull() assertThat(initialState.snackbarMessage).isNull()
assertThat(initialState.canShowInfo).isTrue() assertThat(initialState.canShowInfo).isTrue()
@ -146,7 +146,7 @@ class MediaViewerPresenterTest {
val anImage = aMediaItemImage() val anImage = aMediaItemImage()
presenter.test { presenter.test {
val initialState = awaitFirstItem() val initialState = awaitFirstItem()
assertThat(initialState.listData.singleOrNull()).isInstanceOf(MediaViewerPageData.Loading::class.java) assertThat(initialState.listData).isEmpty()
mediaGalleryDataSource.emitGroupedMediaItems( mediaGalleryDataSource.emitGroupedMediaItems(
AsyncData.Success( AsyncData.Success(
GroupedMediaItems( GroupedMediaItems(