MediaViewerEvents -> MediaViewerEvent

This commit is contained in:
Benoit Marty 2026-04-21 15:50:59 +02:00
parent ce30a4ab23
commit 5d8b9ef56c
7 changed files with 97 additions and 97 deletions

View file

@ -11,22 +11,22 @@ package io.element.android.libraries.mediaviewer.impl.viewer
import io.element.android.libraries.matrix.api.core.EventId import io.element.android.libraries.matrix.api.core.EventId
import io.element.android.libraries.matrix.api.timeline.Timeline import io.element.android.libraries.matrix.api.timeline.Timeline
sealed interface MediaViewerEvents { sealed interface MediaViewerEvent {
data class LoadMedia(val data: MediaViewerPageData.MediaViewerData) : MediaViewerEvents data class LoadMedia(val data: MediaViewerPageData.MediaViewerData) : MediaViewerEvent
data class SaveOnDisk(val data: MediaViewerPageData.MediaViewerData) : MediaViewerEvents data class SaveOnDisk(val data: MediaViewerPageData.MediaViewerData) : MediaViewerEvent
data class Share(val data: MediaViewerPageData.MediaViewerData) : MediaViewerEvents data class Share(val data: MediaViewerPageData.MediaViewerData) : MediaViewerEvent
data class OpenWith(val data: MediaViewerPageData.MediaViewerData) : MediaViewerEvents data class OpenWith(val data: MediaViewerPageData.MediaViewerData) : MediaViewerEvent
data class ClearLoadingError(val data: MediaViewerPageData.MediaViewerData) : MediaViewerEvents data class ClearLoadingError(val data: MediaViewerPageData.MediaViewerData) : MediaViewerEvent
data class ViewInTimeline(val eventId: EventId) : MediaViewerEvents data class ViewInTimeline(val eventId: EventId) : MediaViewerEvent
data class Forward(val eventId: EventId) : MediaViewerEvents data class Forward(val eventId: EventId) : MediaViewerEvent
data class OpenInfo(val data: MediaViewerPageData.MediaViewerData) : MediaViewerEvents data class OpenInfo(val data: MediaViewerPageData.MediaViewerData) : MediaViewerEvent
data class ConfirmDelete( data class ConfirmDelete(
val eventId: EventId, val eventId: EventId,
val data: MediaViewerPageData.MediaViewerData, val data: MediaViewerPageData.MediaViewerData,
) : MediaViewerEvents ) : MediaViewerEvent
data object CloseBottomSheet : MediaViewerEvents data object CloseBottomSheet : MediaViewerEvent
data class Delete(val eventId: EventId) : MediaViewerEvents data class Delete(val eventId: EventId) : MediaViewerEvent
data class OnNavigateTo(val index: Int) : MediaViewerEvents data class OnNavigateTo(val index: Int) : MediaViewerEvent
data class LoadMore(val direction: Timeline.PaginationDirection) : MediaViewerEvents data class LoadMore(val direction: Timeline.PaginationDirection) : MediaViewerEvent
} }

View file

@ -95,42 +95,42 @@ class MediaViewerPresenter(
} }
localMediaActions.Configure() localMediaActions.Configure()
fun handleEvent(event: MediaViewerEvents) { fun handleEvent(event: MediaViewerEvent) {
when (event) { when (event) {
is MediaViewerEvents.LoadMedia -> { is MediaViewerEvent.LoadMedia -> {
coroutineScope.downloadMedia(data = event.data) coroutineScope.downloadMedia(data = event.data)
} }
is MediaViewerEvents.ClearLoadingError -> { is MediaViewerEvent.ClearLoadingError -> {
dataSource.clearLoadingError(event.data) dataSource.clearLoadingError(event.data)
} }
is MediaViewerEvents.SaveOnDisk -> { is MediaViewerEvent.SaveOnDisk -> {
mediaBottomSheetState = MediaBottomSheetState.Hidden mediaBottomSheetState = MediaBottomSheetState.Hidden
coroutineScope.saveOnDisk(event.data.downloadedMedia.value) coroutineScope.saveOnDisk(event.data.downloadedMedia.value)
} }
is MediaViewerEvents.Share -> { is MediaViewerEvent.Share -> {
mediaBottomSheetState = MediaBottomSheetState.Hidden mediaBottomSheetState = MediaBottomSheetState.Hidden
coroutineScope.share(event.data.downloadedMedia.value) coroutineScope.share(event.data.downloadedMedia.value)
} }
is MediaViewerEvents.OpenWith -> { is MediaViewerEvent.OpenWith -> {
mediaBottomSheetState = MediaBottomSheetState.Hidden mediaBottomSheetState = MediaBottomSheetState.Hidden
coroutineScope.open(event.data.downloadedMedia.value) coroutineScope.open(event.data.downloadedMedia.value)
} }
is MediaViewerEvents.Delete -> { is MediaViewerEvent.Delete -> {
mediaBottomSheetState = MediaBottomSheetState.Hidden mediaBottomSheetState = MediaBottomSheetState.Hidden
coroutineScope.delete(event.eventId) coroutineScope.delete(event.eventId)
} }
is MediaViewerEvents.ViewInTimeline -> { is MediaViewerEvent.ViewInTimeline -> {
mediaBottomSheetState = MediaBottomSheetState.Hidden mediaBottomSheetState = MediaBottomSheetState.Hidden
navigator.onViewInTimelineClick(event.eventId) navigator.onViewInTimelineClick(event.eventId)
} }
is MediaViewerEvents.Forward -> { is MediaViewerEvent.Forward -> {
mediaBottomSheetState = MediaBottomSheetState.Hidden mediaBottomSheetState = MediaBottomSheetState.Hidden
navigator.onForwardClick( navigator.onForwardClick(
eventId = event.eventId, eventId = event.eventId,
fromPinnedEvents = inputs.mode.getTimelineMode() == Timeline.Mode.PinnedEvents, fromPinnedEvents = inputs.mode.getTimelineMode() == Timeline.Mode.PinnedEvents,
) )
} }
is MediaViewerEvents.OpenInfo -> coroutineScope.launch { is MediaViewerEvent.OpenInfo -> coroutineScope.launch {
mediaBottomSheetState = MediaBottomSheetState.MediaDetailsBottomSheetState( mediaBottomSheetState = MediaBottomSheetState.MediaDetailsBottomSheetState(
eventId = event.data.eventId, eventId = event.data.eventId,
canDelete = when (event.data.mediaInfo.senderId) { canDelete = when (event.data.mediaInfo.senderId) {
@ -142,20 +142,20 @@ class MediaViewerPresenter(
thumbnailSource = event.data.thumbnailSource, thumbnailSource = event.data.thumbnailSource,
) )
} }
is MediaViewerEvents.ConfirmDelete -> { is MediaViewerEvent.ConfirmDelete -> {
mediaBottomSheetState = MediaBottomSheetState.MediaDeleteConfirmationState( mediaBottomSheetState = MediaBottomSheetState.MediaDeleteConfirmationState(
eventId = event.eventId, eventId = event.eventId,
mediaInfo = event.data.mediaInfo, mediaInfo = event.data.mediaInfo,
thumbnailSource = event.data.thumbnailSource ?: event.data.mediaSource, thumbnailSource = event.data.thumbnailSource ?: event.data.mediaSource,
) )
} }
MediaViewerEvents.CloseBottomSheet -> { MediaViewerEvent.CloseBottomSheet -> {
mediaBottomSheetState = MediaBottomSheetState.Hidden mediaBottomSheetState = MediaBottomSheetState.Hidden
} }
is MediaViewerEvents.OnNavigateTo -> { is MediaViewerEvent.OnNavigateTo -> {
currentIndex.intValue = event.index currentIndex.intValue = event.index
} }
is MediaViewerEvents.LoadMore -> coroutineScope.launch { is MediaViewerEvent.LoadMore -> coroutineScope.launch {
dataSource.loadMore(event.direction) dataSource.loadMore(event.direction)
} }
} }

View file

@ -26,7 +26,7 @@ data class MediaViewerState(
val snackbarMessage: SnackbarMessage?, val snackbarMessage: SnackbarMessage?,
val canShowInfo: Boolean, val canShowInfo: Boolean,
val mediaBottomSheetState: MediaBottomSheetState, val mediaBottomSheetState: MediaBottomSheetState,
val eventSink: (MediaViewerEvents) -> Unit, val eventSink: (MediaViewerEvent) -> Unit,
) )
sealed interface MediaViewerPageData { sealed interface MediaViewerPageData {

View file

@ -226,7 +226,7 @@ fun aMediaViewerState(
currentIndex: Int = 0, currentIndex: Int = 0,
canShowInfo: Boolean = true, canShowInfo: Boolean = true,
mediaBottomSheetState: MediaBottomSheetState = MediaBottomSheetState.Hidden, mediaBottomSheetState: MediaBottomSheetState = MediaBottomSheetState.Hidden,
eventSink: (MediaViewerEvents) -> Unit = {}, eventSink: (MediaViewerEvent) -> Unit = {},
) = MediaViewerState( ) = MediaViewerState(
initiallySelectedEventId = EventId("\$a:b"), initiallySelectedEventId = EventId("\$a:b"),
listData = listData.toImmutableList(), listData = listData.toImmutableList(),

View file

@ -126,7 +126,7 @@ fun MediaViewerView(
} }
LaunchedEffect(pagerState) { LaunchedEffect(pagerState) {
snapshotFlow { pagerState.currentPage }.collect { page -> snapshotFlow { pagerState.currentPage }.collect { page ->
state.eventSink(MediaViewerEvents.OnNavigateTo(page)) state.eventSink(MediaViewerEvent.OnNavigateTo(page))
} }
} }
HorizontalPager( HorizontalPager(
@ -145,7 +145,7 @@ fun MediaViewerView(
} }
is MediaViewerPageData.Loading -> { is MediaViewerPageData.Loading -> {
LaunchedEffect(dataForPage.timestamp) { LaunchedEffect(dataForPage.timestamp) {
state.eventSink(MediaViewerEvents.LoadMore(dataForPage.direction)) state.eventSink(MediaViewerEvent.LoadMore(dataForPage.direction))
} }
MediaViewerLoadingPage( MediaViewerLoadingPage(
onDismiss = onBackClick, onDismiss = onBackClick,
@ -154,7 +154,7 @@ fun MediaViewerView(
is MediaViewerPageData.MediaViewerData -> { is MediaViewerPageData.MediaViewerData -> {
var bottomPaddingInPixels by remember { mutableIntStateOf(defaultBottomPaddingInPixels) } var bottomPaddingInPixels by remember { mutableIntStateOf(defaultBottomPaddingInPixels) }
LaunchedEffect(Unit) { LaunchedEffect(Unit) {
state.eventSink(MediaViewerEvents.LoadMedia(dataForPage)) state.eventSink(MediaViewerEvent.LoadMedia(dataForPage))
} }
Box( Box(
modifier = Modifier.fillMaxSize() modifier = Modifier.fillMaxSize()
@ -173,10 +173,10 @@ fun MediaViewerView(
textFileViewer = textFileViewer, textFileViewer = textFileViewer,
onDismiss = onBackClick, onDismiss = onBackClick,
onRetry = { onRetry = {
state.eventSink(MediaViewerEvents.LoadMedia(dataForPage)) state.eventSink(MediaViewerEvent.LoadMedia(dataForPage))
}, },
onDismissError = { onDismissError = {
state.eventSink(MediaViewerEvents.ClearLoadingError(dataForPage)) state.eventSink(MediaViewerEvent.ClearLoadingError(dataForPage))
}, },
onShowOverlayChange = { onShowOverlayChange = {
showOverlay = it showOverlay = it
@ -215,7 +215,7 @@ fun MediaViewerView(
canShowInfo = state.canShowInfo, canShowInfo = state.canShowInfo,
onBackClick = onBackClick, onBackClick = onBackClick,
onInfoClick = { onInfoClick = {
state.eventSink(MediaViewerEvents.OpenInfo(currentData)) state.eventSink(MediaViewerEvent.OpenInfo(currentData))
}, },
eventSink = state.eventSink eventSink = state.eventSink
) )
@ -251,25 +251,25 @@ fun MediaViewerView(
MediaDetailsBottomSheet( MediaDetailsBottomSheet(
state = bottomSheetState, state = bottomSheetState,
onViewInTimeline = { onViewInTimeline = {
state.eventSink(MediaViewerEvents.ViewInTimeline(it)) state.eventSink(MediaViewerEvent.ViewInTimeline(it))
}, },
onShare = { onShare = {
(currentData as? MediaViewerPageData.MediaViewerData)?.let { (currentData as? MediaViewerPageData.MediaViewerData)?.let {
state.eventSink(MediaViewerEvents.Share(currentData)) state.eventSink(MediaViewerEvent.Share(currentData))
} }
}, },
onForward = { onForward = {
state.eventSink(MediaViewerEvents.Forward(it)) state.eventSink(MediaViewerEvent.Forward(it))
}, },
onDownload = { onDownload = {
(currentData as? MediaViewerPageData.MediaViewerData)?.let { (currentData as? MediaViewerPageData.MediaViewerData)?.let {
state.eventSink(MediaViewerEvents.SaveOnDisk(currentData)) state.eventSink(MediaViewerEvent.SaveOnDisk(currentData))
} }
}, },
onDelete = { eventId -> onDelete = { eventId ->
(currentData as? MediaViewerPageData.MediaViewerData)?.let { (currentData as? MediaViewerPageData.MediaViewerData)?.let {
state.eventSink( state.eventSink(
MediaViewerEvents.ConfirmDelete( MediaViewerEvent.ConfirmDelete(
eventId, eventId,
currentData, currentData,
) )
@ -277,7 +277,7 @@ fun MediaViewerView(
} }
}, },
onDismiss = { onDismiss = {
state.eventSink(MediaViewerEvents.CloseBottomSheet) state.eventSink(MediaViewerEvent.CloseBottomSheet)
}, },
) )
} }
@ -285,10 +285,10 @@ fun MediaViewerView(
MediaDeleteConfirmationBottomSheet( MediaDeleteConfirmationBottomSheet(
state = bottomSheetState, state = bottomSheetState,
onDelete = { onDelete = {
state.eventSink(MediaViewerEvents.Delete(it)) state.eventSink(MediaViewerEvent.Delete(it))
}, },
onDismiss = { onDismiss = {
state.eventSink(MediaViewerEvents.CloseBottomSheet) state.eventSink(MediaViewerEvent.CloseBottomSheet)
}, },
) )
} }
@ -458,7 +458,7 @@ private fun MediaViewerTopBar(
canShowInfo: Boolean, canShowInfo: Boolean,
onBackClick: () -> Unit, onBackClick: () -> Unit,
onInfoClick: () -> Unit, onInfoClick: () -> Unit,
eventSink: (MediaViewerEvents) -> Unit, eventSink: (MediaViewerEvent) -> Unit,
) { ) {
val downloadedMedia by data.downloadedMedia val downloadedMedia by data.downloadedMedia
val actionsEnabled = downloadedMedia.isSuccess() val actionsEnabled = downloadedMedia.isSuccess()
@ -500,7 +500,7 @@ private fun MediaViewerTopBar(
IconButton( IconButton(
enabled = actionsEnabled, enabled = actionsEnabled,
onClick = { onClick = {
eventSink(MediaViewerEvents.OpenWith(data)) eventSink(MediaViewerEvent.OpenWith(data))
}, },
) { ) {
when (mimeType) { when (mimeType) {

View file

@ -226,7 +226,7 @@ class MediaViewerPresenterTest {
) )
val updatedState = awaitItem() val updatedState = awaitItem()
updatedState.eventSink( updatedState.eventSink(
MediaViewerEvents.LoadMedia( MediaViewerEvent.LoadMedia(
aMediaViewerPageData( aMediaViewerPageData(
mediaSource = MediaSource(aUrl) mediaSource = MediaSource(aUrl)
) )
@ -266,7 +266,7 @@ class MediaViewerPresenterTest {
) )
val updatedState = awaitItem() val updatedState = awaitItem()
updatedState.eventSink( updatedState.eventSink(
MediaViewerEvents.OpenInfo( MediaViewerEvent.OpenInfo(
aMediaViewerPageData( aMediaViewerPageData(
mediaSource = MediaSource(aUrl) mediaSource = MediaSource(aUrl)
) )
@ -275,7 +275,7 @@ class MediaViewerPresenterTest {
val withInfoState = awaitItem() val withInfoState = awaitItem()
assertThat(withInfoState.mediaBottomSheetState).isInstanceOf(MediaBottomSheetState.MediaDetailsBottomSheetState::class.java) assertThat(withInfoState.mediaBottomSheetState).isInstanceOf(MediaBottomSheetState.MediaDetailsBottomSheetState::class.java)
withInfoState.eventSink( withInfoState.eventSink(
MediaViewerEvents.CloseBottomSheet MediaViewerEvent.CloseBottomSheet
) )
val finalState = awaitItem() val finalState = awaitItem()
assertThat(finalState.mediaBottomSheetState).isEqualTo(MediaBottomSheetState.Hidden) assertThat(finalState.mediaBottomSheetState).isEqualTo(MediaBottomSheetState.Hidden)
@ -306,7 +306,7 @@ class MediaViewerPresenterTest {
) )
val updatedState = awaitItem() val updatedState = awaitItem()
updatedState.eventSink( updatedState.eventSink(
MediaViewerEvents.ClearLoadingError( MediaViewerEvent.ClearLoadingError(
aMediaViewerPageData( aMediaViewerPageData(
mediaSource = MediaSource(aUrl) mediaSource = MediaSource(aUrl)
) )
@ -339,7 +339,7 @@ class MediaViewerPresenterTest {
) )
val updatedState = awaitItem() val updatedState = awaitItem()
updatedState.eventSink( updatedState.eventSink(
MediaViewerEvents.Share( MediaViewerEvent.Share(
aMediaViewerPageData( aMediaViewerPageData(
mediaSource = MediaSource(aUrl) mediaSource = MediaSource(aUrl)
) )
@ -372,7 +372,7 @@ class MediaViewerPresenterTest {
) )
val updatedState = awaitItem() val updatedState = awaitItem()
updatedState.eventSink( updatedState.eventSink(
MediaViewerEvents.SaveOnDisk( MediaViewerEvent.SaveOnDisk(
aMediaViewerPageData( aMediaViewerPageData(
mediaSource = MediaSource(aUrl) mediaSource = MediaSource(aUrl)
) )
@ -405,7 +405,7 @@ class MediaViewerPresenterTest {
) )
val updatedState = awaitItem() val updatedState = awaitItem()
updatedState.eventSink( updatedState.eventSink(
MediaViewerEvents.OpenWith( MediaViewerEvent.OpenWith(
aMediaViewerPageData( aMediaViewerPageData(
mediaSource = MediaSource(aUrl) mediaSource = MediaSource(aUrl)
) )
@ -438,7 +438,7 @@ class MediaViewerPresenterTest {
) )
val updatedState = awaitItem() val updatedState = awaitItem()
updatedState.eventSink( updatedState.eventSink(
MediaViewerEvents.ConfirmDelete( MediaViewerEvent.ConfirmDelete(
eventId = AN_EVENT_ID, eventId = AN_EVENT_ID,
data = aMediaViewerPageData( data = aMediaViewerPageData(
mediaSource = MediaSource(aUrl) mediaSource = MediaSource(aUrl)
@ -448,7 +448,7 @@ class MediaViewerPresenterTest {
val withBottomSheetState = awaitItem() val withBottomSheetState = awaitItem()
assertThat(withBottomSheetState.mediaBottomSheetState).isInstanceOf(MediaBottomSheetState.MediaDeleteConfirmationState::class.java) assertThat(withBottomSheetState.mediaBottomSheetState).isInstanceOf(MediaBottomSheetState.MediaDeleteConfirmationState::class.java)
withBottomSheetState.eventSink( withBottomSheetState.eventSink(
MediaViewerEvents.CloseBottomSheet MediaViewerEvent.CloseBottomSheet
) )
val finalState = awaitItem() val finalState = awaitItem()
assertThat(finalState.mediaBottomSheetState).isEqualTo(MediaBottomSheetState.Hidden) assertThat(finalState.mediaBottomSheetState).isEqualTo(MediaBottomSheetState.Hidden)
@ -498,7 +498,7 @@ class MediaViewerPresenterTest {
) )
val updatedState = awaitItem() val updatedState = awaitItem()
updatedState.eventSink( updatedState.eventSink(
MediaViewerEvents.ConfirmDelete( MediaViewerEvent.ConfirmDelete(
eventId = AN_EVENT_ID, eventId = AN_EVENT_ID,
data = aMediaViewerPageData( data = aMediaViewerPageData(
mediaSource = MediaSource(aUrl) mediaSource = MediaSource(aUrl)
@ -508,7 +508,7 @@ class MediaViewerPresenterTest {
val withBottomSheetState = awaitItem() val withBottomSheetState = awaitItem()
assertThat(withBottomSheetState.mediaBottomSheetState).isInstanceOf(MediaBottomSheetState.MediaDeleteConfirmationState::class.java) assertThat(withBottomSheetState.mediaBottomSheetState).isInstanceOf(MediaBottomSheetState.MediaDeleteConfirmationState::class.java)
updatedState.eventSink( updatedState.eventSink(
MediaViewerEvents.Delete( MediaViewerEvent.Delete(
eventId = AN_EVENT_ID, eventId = AN_EVENT_ID,
) )
) )
@ -551,7 +551,7 @@ class MediaViewerPresenterTest {
) )
val updatedState = awaitItem() val updatedState = awaitItem()
updatedState.eventSink( updatedState.eventSink(
MediaViewerEvents.OnNavigateTo(1) MediaViewerEvent.OnNavigateTo(1)
) )
val finalState = awaitItem() val finalState = awaitItem()
assertThat(finalState.currentIndex).isEqualTo(1) assertThat(finalState.currentIndex).isEqualTo(1)
@ -606,7 +606,7 @@ class MediaViewerPresenterTest {
val updatedState = awaitItem() val updatedState = awaitItem()
// User navigate to the last item (forward loading indicator) // User navigate to the last item (forward loading indicator)
updatedState.eventSink( updatedState.eventSink(
MediaViewerEvents.OnNavigateTo(2) MediaViewerEvent.OnNavigateTo(2)
) )
// data source claims that there is no more items to load forward // data source claims that there is no more items to load forward
mediaGalleryDataSource.emitGroupedMediaItems( mediaGalleryDataSource.emitGroupedMediaItems(
@ -680,7 +680,7 @@ class MediaViewerPresenterTest {
val updatedState = awaitItem() val updatedState = awaitItem()
// User navigate to the first item (backward loading indicator) // User navigate to the first item (backward loading indicator)
updatedState.eventSink( updatedState.eventSink(
MediaViewerEvents.OnNavigateTo(0) MediaViewerEvent.OnNavigateTo(0)
) )
// data source claims that there is no more items to load backward // data source claims that there is no more items to load backward
mediaGalleryDataSource.emitGroupedMediaItems( mediaGalleryDataSource.emitGroupedMediaItems(
@ -728,7 +728,7 @@ class MediaViewerPresenterTest {
val updatedState = awaitItem() val updatedState = awaitItem()
// User navigate to the media // User navigate to the media
updatedState.eventSink( updatedState.eventSink(
MediaViewerEvents.OnNavigateTo(1) MediaViewerEvent.OnNavigateTo(1)
) )
skipItems(1) skipItems(1)
// data source claims that there is no more items to load at all // data source claims that there is no more items to load at all
@ -771,7 +771,7 @@ class MediaViewerPresenterTest {
) )
val updatedState = awaitItem() val updatedState = awaitItem()
updatedState.eventSink( updatedState.eventSink(
MediaViewerEvents.LoadMore(Timeline.PaginationDirection.BACKWARDS) MediaViewerEvent.LoadMore(Timeline.PaginationDirection.BACKWARDS)
) )
loadMoreLambda.assertions().isCalledOnce().with(value(Timeline.PaginationDirection.BACKWARDS)) loadMoreLambda.assertions().isCalledOnce().with(value(Timeline.PaginationDirection.BACKWARDS))
} }
@ -796,10 +796,10 @@ class MediaViewerPresenterTest {
) )
presenter.test { presenter.test {
val initialState = awaitItem() val initialState = awaitItem()
initialState.eventSink(MediaViewerEvents.OpenInfo(aMediaViewerPageData())) initialState.eventSink(MediaViewerEvent.OpenInfo(aMediaViewerPageData()))
val withBottomSheetState = awaitItem() val withBottomSheetState = awaitItem()
assertThat(withBottomSheetState.mediaBottomSheetState).isInstanceOf(MediaBottomSheetState.MediaDetailsBottomSheetState::class.java) assertThat(withBottomSheetState.mediaBottomSheetState).isInstanceOf(MediaBottomSheetState.MediaDetailsBottomSheetState::class.java)
initialState.eventSink(MediaViewerEvents.ViewInTimeline(AN_EVENT_ID)) initialState.eventSink(MediaViewerEvent.ViewInTimeline(AN_EVENT_ID))
val finalState = awaitItem() val finalState = awaitItem()
assertThat(finalState.mediaBottomSheetState).isEqualTo(MediaBottomSheetState.Hidden) assertThat(finalState.mediaBottomSheetState).isEqualTo(MediaBottomSheetState.Hidden)
onViewInTimelineClickLambda.assertions().isCalledOnce().with(value(AN_EVENT_ID)) onViewInTimelineClickLambda.assertions().isCalledOnce().with(value(AN_EVENT_ID))
@ -825,10 +825,10 @@ class MediaViewerPresenterTest {
) )
presenter.test { presenter.test {
val initialState = awaitItem() val initialState = awaitItem()
initialState.eventSink(MediaViewerEvents.OpenInfo(aMediaViewerPageData())) initialState.eventSink(MediaViewerEvent.OpenInfo(aMediaViewerPageData()))
val withBottomSheetState = awaitItem() val withBottomSheetState = awaitItem()
assertThat(withBottomSheetState.mediaBottomSheetState).isInstanceOf(MediaBottomSheetState.MediaDetailsBottomSheetState::class.java) assertThat(withBottomSheetState.mediaBottomSheetState).isInstanceOf(MediaBottomSheetState.MediaDetailsBottomSheetState::class.java)
initialState.eventSink(MediaViewerEvents.Forward(AN_EVENT_ID)) initialState.eventSink(MediaViewerEvent.Forward(AN_EVENT_ID))
val finalState = awaitItem() val finalState = awaitItem()
assertThat(finalState.mediaBottomSheetState).isEqualTo(MediaBottomSheetState.Hidden) assertThat(finalState.mediaBottomSheetState).isEqualTo(MediaBottomSheetState.Hidden)
onForwardClickLambda.assertions().isCalledOnce() onForwardClickLambda.assertions().isCalledOnce()
@ -856,10 +856,10 @@ class MediaViewerPresenterTest {
) )
presenter.test { presenter.test {
val initialState = awaitItem() val initialState = awaitItem()
initialState.eventSink(MediaViewerEvents.OpenInfo(aMediaViewerPageData())) initialState.eventSink(MediaViewerEvent.OpenInfo(aMediaViewerPageData()))
val withBottomSheetState = awaitItem() val withBottomSheetState = awaitItem()
assertThat(withBottomSheetState.mediaBottomSheetState).isInstanceOf(MediaBottomSheetState.MediaDetailsBottomSheetState::class.java) assertThat(withBottomSheetState.mediaBottomSheetState).isInstanceOf(MediaBottomSheetState.MediaDetailsBottomSheetState::class.java)
initialState.eventSink(MediaViewerEvents.Forward(AN_EVENT_ID)) initialState.eventSink(MediaViewerEvent.Forward(AN_EVENT_ID))
val finalState = awaitItem() val finalState = awaitItem()
assertThat(finalState.mediaBottomSheetState).isEqualTo(MediaBottomSheetState.Hidden) assertThat(finalState.mediaBottomSheetState).isEqualTo(MediaBottomSheetState.Hidden)
onForwardClickLambda.assertions().isCalledOnce() onForwardClickLambda.assertions().isCalledOnce()

View file

@ -43,7 +43,7 @@ class MediaViewerViewTest {
@Test @Test
fun `clicking on back invokes expected callback`() { fun `clicking on back invokes expected callback`() {
val eventsRecorder = EventsRecorder<MediaViewerEvents>() val eventsRecorder = EventsRecorder<MediaViewerEvent>()
val state = aMediaViewerState( val state = aMediaViewerState(
eventSink = eventsRecorder eventSink = eventsRecorder
) )
@ -56,8 +56,8 @@ class MediaViewerViewTest {
} }
eventsRecorder.assertList( eventsRecorder.assertList(
listOf( listOf(
MediaViewerEvents.OnNavigateTo(0), MediaViewerEvent.OnNavigateTo(0),
MediaViewerEvents.LoadMedia(state.listData.first() as MediaViewerPageData.MediaViewerData), MediaViewerEvent.LoadMedia(state.listData.first() as MediaViewerPageData.MediaViewerData),
) )
) )
} }
@ -70,7 +70,7 @@ class MediaViewerViewTest {
testMenuAction( testMenuAction(
data, data,
CommonStrings.action_open_with, CommonStrings.action_open_with,
MediaViewerEvents.OpenWith(data), MediaViewerEvent.OpenWith(data),
) )
} }
@ -82,16 +82,16 @@ class MediaViewerViewTest {
testMenuAction( testMenuAction(
data, data,
CommonStrings.a11y_view_details, CommonStrings.a11y_view_details,
MediaViewerEvents.OpenInfo(data), MediaViewerEvent.OpenInfo(data),
) )
} }
private fun testMenuAction( private fun testMenuAction(
data: MediaViewerPageData.MediaViewerData, data: MediaViewerPageData.MediaViewerData,
contentDescriptionRes: Int, contentDescriptionRes: Int,
expectedEvent: MediaViewerEvents, expectedEvent: MediaViewerEvent,
) { ) {
val eventsRecorder = EventsRecorder<MediaViewerEvents>() val eventsRecorder = EventsRecorder<MediaViewerEvent>()
rule.setMediaViewerView( rule.setMediaViewerView(
aMediaViewerState( aMediaViewerState(
listData = listOf(data), listData = listOf(data),
@ -102,8 +102,8 @@ class MediaViewerViewTest {
rule.onNodeWithContentDescription(contentDescription).performClick() rule.onNodeWithContentDescription(contentDescription).performClick()
eventsRecorder.assertList( eventsRecorder.assertList(
listOf( listOf(
MediaViewerEvents.OnNavigateTo(0), MediaViewerEvent.OnNavigateTo(0),
MediaViewerEvents.LoadMedia(data), MediaViewerEvent.LoadMedia(data),
expectedEvent, expectedEvent,
) )
) )
@ -116,7 +116,7 @@ class MediaViewerViewTest {
testBottomSheetAction( testBottomSheetAction(
data, data,
CommonStrings.action_save, CommonStrings.action_save,
MediaViewerEvents.SaveOnDisk(data), MediaViewerEvent.SaveOnDisk(data),
) )
} }
@ -127,16 +127,16 @@ class MediaViewerViewTest {
testBottomSheetAction( testBottomSheetAction(
data, data,
CommonStrings.action_share, CommonStrings.action_share,
MediaViewerEvents.Share(data), MediaViewerEvent.Share(data),
) )
} }
private fun testBottomSheetAction( private fun testBottomSheetAction(
data: MediaViewerPageData.MediaViewerData, data: MediaViewerPageData.MediaViewerData,
contentDescriptionRes: Int, contentDescriptionRes: Int,
expectedEvent: MediaViewerEvents, expectedEvent: MediaViewerEvent,
) { ) {
val eventsRecorder = EventsRecorder<MediaViewerEvents>() val eventsRecorder = EventsRecorder<MediaViewerEvent>()
rule.setMediaViewerView( rule.setMediaViewerView(
aMediaViewerState( aMediaViewerState(
listData = listOf(data), listData = listOf(data),
@ -147,8 +147,8 @@ class MediaViewerViewTest {
rule.clickOn(contentDescriptionRes) rule.clickOn(contentDescriptionRes)
eventsRecorder.assertList( eventsRecorder.assertList(
listOf( listOf(
MediaViewerEvents.OnNavigateTo(0), MediaViewerEvent.OnNavigateTo(0),
MediaViewerEvents.LoadMedia(data), MediaViewerEvent.LoadMedia(data),
expectedEvent, expectedEvent,
) )
) )
@ -156,7 +156,7 @@ class MediaViewerViewTest {
@Test @Test
fun `clicking on image hides the overlay`() { fun `clicking on image hides the overlay`() {
val eventsRecorder = EventsRecorder<MediaViewerEvents>() val eventsRecorder = EventsRecorder<MediaViewerEvent>()
val state = aMediaViewerState( val state = aMediaViewerState(
eventSink = eventsRecorder eventSink = eventsRecorder
) )
@ -176,15 +176,15 @@ class MediaViewerViewTest {
.assertDoesNotExist() .assertDoesNotExist()
eventsRecorder.assertList( eventsRecorder.assertList(
listOf( listOf(
MediaViewerEvents.OnNavigateTo(0), MediaViewerEvent.OnNavigateTo(0),
MediaViewerEvents.LoadMedia(state.listData.first() as MediaViewerPageData.MediaViewerData), MediaViewerEvent.LoadMedia(state.listData.first() as MediaViewerPageData.MediaViewerData),
) )
) )
} }
@Test @Test
fun `clicking swipe on the image invokes the expected callback`() { fun `clicking swipe on the image invokes the expected callback`() {
val eventsRecorder = EventsRecorder<MediaViewerEvents>() val eventsRecorder = EventsRecorder<MediaViewerEvent>()
val state = aMediaViewerState( val state = aMediaViewerState(
eventSink = eventsRecorder eventSink = eventsRecorder
) )
@ -199,15 +199,15 @@ class MediaViewerViewTest {
} }
eventsRecorder.assertList( eventsRecorder.assertList(
listOf( listOf(
MediaViewerEvents.OnNavigateTo(0), MediaViewerEvent.OnNavigateTo(0),
MediaViewerEvents.LoadMedia(state.listData.first() as MediaViewerPageData.MediaViewerData), MediaViewerEvent.LoadMedia(state.listData.first() as MediaViewerPageData.MediaViewerData),
) )
) )
} }
@Test @Test
fun `error case, click on retry emits the expected Event`() { fun `error case, click on retry emits the expected Event`() {
val eventsRecorder = EventsRecorder<MediaViewerEvents>() val eventsRecorder = EventsRecorder<MediaViewerEvent>()
val data = aMediaViewerPageData( val data = aMediaViewerPageData(
downloadedMedia = AsyncData.Failure(IllegalStateException("error")), downloadedMedia = AsyncData.Failure(IllegalStateException("error")),
) )
@ -220,16 +220,16 @@ class MediaViewerViewTest {
rule.clickOn(CommonStrings.action_retry) rule.clickOn(CommonStrings.action_retry)
eventsRecorder.assertList( eventsRecorder.assertList(
listOf( listOf(
MediaViewerEvents.OnNavigateTo(0), MediaViewerEvent.OnNavigateTo(0),
MediaViewerEvents.LoadMedia(data), MediaViewerEvent.LoadMedia(data),
MediaViewerEvents.LoadMedia(data), MediaViewerEvent.LoadMedia(data),
) )
) )
} }
@Test @Test
fun `error case, click on cancel emits the expected Event`() { fun `error case, click on cancel emits the expected Event`() {
val eventsRecorder = EventsRecorder<MediaViewerEvents>() val eventsRecorder = EventsRecorder<MediaViewerEvent>()
val data = aMediaViewerPageData( val data = aMediaViewerPageData(
downloadedMedia = AsyncData.Failure(IllegalStateException("error")), downloadedMedia = AsyncData.Failure(IllegalStateException("error")),
) )
@ -242,9 +242,9 @@ class MediaViewerViewTest {
rule.clickOn(CommonStrings.action_cancel) rule.clickOn(CommonStrings.action_cancel)
eventsRecorder.assertList( eventsRecorder.assertList(
listOf( listOf(
MediaViewerEvents.OnNavigateTo(0), MediaViewerEvent.OnNavigateTo(0),
MediaViewerEvents.LoadMedia(data), MediaViewerEvent.LoadMedia(data),
MediaViewerEvents.ClearLoadingError(data) MediaViewerEvent.ClearLoadingError(data)
) )
) )
} }