Ensure gallery is paginating to get new items.
This commit is contained in:
parent
cb5988935f
commit
4c6f46e46c
4 changed files with 33 additions and 28 deletions
|
|
@ -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) {
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
|
|
@ -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,
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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(
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue