Rename sub classes of MediaBottomSheetState and improve preview of MediaDeleteConfirmationBottomSheet

This commit is contained in:
Benoit Marty 2026-04-22 14:42:56 +02:00
parent 442b7bc7cb
commit 7d31944a0a
17 changed files with 103 additions and 89 deletions

View file

@ -15,16 +15,16 @@ import io.element.android.libraries.mediaviewer.api.MediaInfo
sealed interface MediaBottomSheetState { sealed interface MediaBottomSheetState {
data object Hidden : MediaBottomSheetState data object Hidden : MediaBottomSheetState
data class MediaDeleteConfirmationState( data class Details(
val eventId: EventId,
val mediaInfo: MediaInfo,
val thumbnailSource: MediaSource?,
) : MediaBottomSheetState
data class MediaDetailsBottomSheetState(
val eventId: EventId?, val eventId: EventId?,
val canDelete: Boolean, val canDelete: Boolean,
val mediaInfo: MediaInfo, val mediaInfo: MediaInfo,
val thumbnailSource: MediaSource?, val thumbnailSource: MediaSource?,
) : MediaBottomSheetState ) : MediaBottomSheetState
data class DeleteConfirmation(
val eventId: EventId,
val mediaInfo: MediaInfo,
val thumbnailSource: MediaSource?,
) : MediaBottomSheetState
} }

View file

@ -0,0 +1,36 @@
/*
* Copyright (c) 2025 Element Creations Ltd.
* Copyright 2024, 2025 New Vector Ltd.
*
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
* Please see LICENSE files in the repository root for full details.
*/
package io.element.android.libraries.mediaviewer.impl.details
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import io.element.android.libraries.matrix.api.core.EventId
import io.element.android.libraries.matrix.api.media.MediaSource
import io.element.android.libraries.mediaviewer.api.MediaInfo
import io.element.android.libraries.mediaviewer.api.anImageMediaInfo
open class MediaBottomSheetStateDeleteConfirmationProvider : PreviewParameterProvider<MediaBottomSheetState.DeleteConfirmation> {
override val values: Sequence<MediaBottomSheetState.DeleteConfirmation>
get() = sequenceOf(
aMediaBottomSheetStateDeleteConfirmation(),
aMediaBottomSheetStateDeleteConfirmation(
thumbnailSource = MediaSource("url_thumbnail")
),
)
}
fun aMediaBottomSheetStateDeleteConfirmation(
mediaInfo: MediaInfo = anImageMediaInfo(
senderName = "Alice",
),
thumbnailSource: MediaSource? = null,
) = MediaBottomSheetState.DeleteConfirmation(
eventId = EventId("\$eventId"),
mediaInfo = mediaInfo,
thumbnailSource = thumbnailSource,
)

View file

@ -13,31 +13,28 @@ import io.element.android.libraries.mediaviewer.api.MediaInfo
import io.element.android.libraries.mediaviewer.api.anApkMediaInfo import io.element.android.libraries.mediaviewer.api.anApkMediaInfo
import io.element.android.libraries.mediaviewer.api.anImageMediaInfo import io.element.android.libraries.mediaviewer.api.anImageMediaInfo
open class MediaDetailsBottomSheetStateProvider : PreviewParameterProvider<MediaBottomSheetState.MediaDetailsBottomSheetState> { open class MediaBottomSheetStateDetailsProvider : PreviewParameterProvider<MediaBottomSheetState.Details> {
override val values: Sequence<MediaBottomSheetState.MediaDetailsBottomSheetState> override val values: Sequence<MediaBottomSheetState.Details>
get() = sequenceOf( get() = sequenceOf(
aMediaDetailsBottomSheetState(), aMediaBottomSheetStateDetails(),
aMediaDetailsBottomSheetState( aMediaBottomSheetStateDetails(
canDelete = false, canDelete = false,
), ),
aMediaDetailsBottomSheetState( aMediaBottomSheetStateDetails(
mediaInfo = anApkMediaInfo(), mediaInfo = anApkMediaInfo(),
), ),
) )
} }
fun aMediaDetailsBottomSheetState( fun aMediaBottomSheetStateDetails(
dateSentFull: String = "December 6, 2024 at 12:59",
canDelete: Boolean = true, canDelete: Boolean = true,
mediaInfo: MediaInfo = anImageMediaInfo( mediaInfo: MediaInfo = anImageMediaInfo(
senderName = "Alice", senderName = "Alice",
dateSentFull = dateSentFull, dateSentFull = "December 6, 2024 at 12:59",
), ),
): MediaBottomSheetState.MediaDetailsBottomSheetState { ) = MediaBottomSheetState.Details(
return MediaBottomSheetState.MediaDetailsBottomSheetState( eventId = EventId("\$eventId"),
eventId = EventId("\$eventId"), canDelete = canDelete,
canDelete = canDelete, mediaInfo = mediaInfo,
mediaInfo = mediaInfo, thumbnailSource = null,
thumbnailSource = null, )
)
}

View file

@ -30,6 +30,7 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import coil3.compose.AsyncImage import coil3.compose.AsyncImage
import io.element.android.compound.theme.ElementTheme import io.element.android.compound.theme.ElementTheme
@ -49,7 +50,7 @@ import io.element.android.libraries.ui.strings.CommonStrings
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
fun MediaDeleteConfirmationBottomSheet( fun MediaDeleteConfirmationBottomSheet(
state: MediaBottomSheetState.MediaDeleteConfirmationState, state: MediaBottomSheetState.DeleteConfirmation,
onDelete: (EventId) -> Unit, onDelete: (EventId) -> Unit,
onDismiss: () -> Unit, onDismiss: () -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
@ -105,7 +106,7 @@ fun MediaDeleteConfirmationBottomSheet(
@Composable @Composable
private fun MediaRow( private fun MediaRow(
state: MediaBottomSheetState.MediaDeleteConfirmationState, state: MediaBottomSheetState.DeleteConfirmation,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
) { ) {
Row( Row(
@ -160,9 +161,11 @@ private fun MediaRow(
@PreviewsDayNight @PreviewsDayNight
@Composable @Composable
internal fun MediaDeleteConfirmationBottomSheetPreview() = ElementPreview { internal fun MediaDeleteConfirmationBottomSheetPreview(
@PreviewParameter(provider = MediaBottomSheetStateDeleteConfirmationProvider::class) state: MediaBottomSheetState.DeleteConfirmation,
) = ElementPreview {
MediaDeleteConfirmationBottomSheet( MediaDeleteConfirmationBottomSheet(
state = aMediaDeleteConfirmationState(), state = state,
onDelete = {}, onDelete = {},
onDismiss = {}, onDismiss = {},
) )

View file

@ -54,7 +54,7 @@ import io.element.android.libraries.ui.strings.CommonStrings
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
fun MediaDetailsBottomSheet( fun MediaDetailsBottomSheet(
state: MediaBottomSheetState.MediaDetailsBottomSheetState, state: MediaBottomSheetState.Details,
onViewInTimeline: (EventId) -> Unit, onViewInTimeline: (EventId) -> Unit,
onShare: (EventId) -> Unit, onShare: (EventId) -> Unit,
onForward: (EventId) -> Unit, onForward: (EventId) -> Unit,
@ -250,7 +250,7 @@ private fun SectionText(
@PreviewsDayNight @PreviewsDayNight
@Composable @Composable
internal fun MediaDetailsBottomSheetPreview( internal fun MediaDetailsBottomSheetPreview(
@PreviewParameter(MediaDetailsBottomSheetStateProvider::class) state: MediaBottomSheetState.MediaDetailsBottomSheetState, @PreviewParameter(MediaBottomSheetStateDetailsProvider::class) state: MediaBottomSheetState.Details,
) = ElementPreview { ) = ElementPreview {
MediaDetailsBottomSheet( MediaDetailsBottomSheet(
state = state, state = state,

View file

@ -1,22 +0,0 @@
/*
* Copyright (c) 2025 Element Creations Ltd.
* Copyright 2024, 2025 New Vector Ltd.
*
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
* Please see LICENSE files in the repository root for full details.
*/
package io.element.android.libraries.mediaviewer.impl.details
import io.element.android.libraries.matrix.api.core.EventId
import io.element.android.libraries.mediaviewer.api.anImageMediaInfo
fun aMediaDeleteConfirmationState(): MediaBottomSheetState.MediaDeleteConfirmationState {
return MediaBottomSheetState.MediaDeleteConfirmationState(
eventId = EventId("\$eventId"),
mediaInfo = anImageMediaInfo(
senderName = "Alice",
),
thumbnailSource = null,
)
}

View file

@ -126,7 +126,7 @@ class MediaGalleryPresenter(
navigator.onViewInTimelineClick(event.eventId) navigator.onViewInTimelineClick(event.eventId)
} }
is MediaGalleryEvent.OpenInfo -> coroutineScope.launch { is MediaGalleryEvent.OpenInfo -> coroutineScope.launch {
mediaBottomSheetState = MediaBottomSheetState.MediaDetailsBottomSheetState( mediaBottomSheetState = MediaBottomSheetState.Details(
eventId = event.mediaItem.eventId(), eventId = event.mediaItem.eventId(),
canDelete = when (event.mediaItem.mediaInfo().senderId) { canDelete = when (event.mediaItem.mediaInfo().senderId) {
null -> false null -> false
@ -144,7 +144,7 @@ class MediaGalleryPresenter(
) )
} }
is MediaGalleryEvent.ConfirmDelete -> { is MediaGalleryEvent.ConfirmDelete -> {
mediaBottomSheetState = MediaBottomSheetState.MediaDeleteConfirmationState( mediaBottomSheetState = MediaBottomSheetState.DeleteConfirmation(
eventId = event.eventId, eventId = event.eventId,
mediaInfo = event.mediaInfo, mediaInfo = event.mediaInfo,
thumbnailSource = event.thumbnailSource, thumbnailSource = event.thumbnailSource,

View file

@ -13,7 +13,7 @@ import io.element.android.libraries.architecture.AsyncData
import io.element.android.libraries.designsystem.components.media.WaveFormSamples import io.element.android.libraries.designsystem.components.media.WaveFormSamples
import io.element.android.libraries.matrix.api.core.UniqueId import io.element.android.libraries.matrix.api.core.UniqueId
import io.element.android.libraries.mediaviewer.impl.details.MediaBottomSheetState import io.element.android.libraries.mediaviewer.impl.details.MediaBottomSheetState
import io.element.android.libraries.mediaviewer.impl.details.aMediaDetailsBottomSheetState import io.element.android.libraries.mediaviewer.impl.details.aMediaBottomSheetStateDetails
import io.element.android.libraries.mediaviewer.impl.model.GroupedMediaItems import io.element.android.libraries.mediaviewer.impl.model.GroupedMediaItems
import io.element.android.libraries.mediaviewer.impl.model.MediaItem import io.element.android.libraries.mediaviewer.impl.model.MediaItem
import io.element.android.libraries.mediaviewer.impl.model.aMediaItemAudio import io.element.android.libraries.mediaviewer.impl.model.aMediaItemAudio
@ -79,7 +79,7 @@ open class MediaGalleryStateProvider : PreviewParameterProvider<MediaGalleryStat
) )
), ),
), ),
aMediaGalleryState(mediaBottomSheetState = aMediaDetailsBottomSheetState()), aMediaGalleryState(mediaBottomSheetState = aMediaBottomSheetStateDetails()),
aMediaGalleryState( aMediaGalleryState(
groupedMediaItems = AsyncData.Failure(Exception("Failed to load media")), groupedMediaItems = AsyncData.Failure(Exception("Failed to load media")),
), ),

View file

@ -158,7 +158,7 @@ fun MediaGalleryView(
} }
when (val bottomSheetState = state.mediaBottomSheetState) { when (val bottomSheetState = state.mediaBottomSheetState) {
MediaBottomSheetState.Hidden -> Unit MediaBottomSheetState.Hidden -> Unit
is MediaBottomSheetState.MediaDetailsBottomSheetState -> { is MediaBottomSheetState.Details -> {
MediaDetailsBottomSheet( MediaDetailsBottomSheet(
state = bottomSheetState, state = bottomSheetState,
onViewInTimeline = { eventId -> onViewInTimeline = { eventId ->
@ -190,7 +190,7 @@ fun MediaGalleryView(
}, },
) )
} }
is MediaBottomSheetState.MediaDeleteConfirmationState -> { is MediaBottomSheetState.DeleteConfirmation -> {
MediaDeleteConfirmationBottomSheet( MediaDeleteConfirmationBottomSheet(
state = bottomSheetState, state = bottomSheetState,
onDelete = { onDelete = {

View file

@ -131,7 +131,7 @@ class MediaViewerPresenter(
) )
} }
is MediaViewerEvent.OpenInfo -> coroutineScope.launch { is MediaViewerEvent.OpenInfo -> coroutineScope.launch {
mediaBottomSheetState = MediaBottomSheetState.MediaDetailsBottomSheetState( mediaBottomSheetState = MediaBottomSheetState.Details(
eventId = event.data.eventId, eventId = event.data.eventId,
canDelete = when (event.data.mediaInfo.senderId) { canDelete = when (event.data.mediaInfo.senderId) {
null -> false null -> false
@ -143,7 +143,7 @@ class MediaViewerPresenter(
) )
} }
is MediaViewerEvent.ConfirmDelete -> { is MediaViewerEvent.ConfirmDelete -> {
mediaBottomSheetState = MediaBottomSheetState.MediaDeleteConfirmationState( mediaBottomSheetState = MediaBottomSheetState.DeleteConfirmation(
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,

View file

@ -25,8 +25,8 @@ import io.element.android.libraries.mediaviewer.api.anAudioMediaInfo
import io.element.android.libraries.mediaviewer.api.anImageMediaInfo import io.element.android.libraries.mediaviewer.api.anImageMediaInfo
import io.element.android.libraries.mediaviewer.api.local.LocalMedia import io.element.android.libraries.mediaviewer.api.local.LocalMedia
import io.element.android.libraries.mediaviewer.impl.details.MediaBottomSheetState import io.element.android.libraries.mediaviewer.impl.details.MediaBottomSheetState
import io.element.android.libraries.mediaviewer.impl.details.aMediaDeleteConfirmationState import io.element.android.libraries.mediaviewer.impl.details.aMediaBottomSheetStateDeleteConfirmation
import io.element.android.libraries.mediaviewer.impl.details.aMediaDetailsBottomSheetState import io.element.android.libraries.mediaviewer.impl.details.aMediaBottomSheetStateDetails
import kotlinx.collections.immutable.toImmutableList import kotlinx.collections.immutable.toImmutableList
private const val LONG_CAPTION = "This is a very long caption that should be scrollable in the media viewer. " + private const val LONG_CAPTION = "This is a very long caption that should be scrollable in the media viewer. " +
@ -141,10 +141,10 @@ open class MediaViewerStateProvider : PreviewParameterProvider<MediaViewerState>
) )
}, },
aMediaViewerState( aMediaViewerState(
mediaBottomSheetState = aMediaDetailsBottomSheetState(), mediaBottomSheetState = aMediaBottomSheetStateDetails(),
), ),
aMediaViewerState( aMediaViewerState(
mediaBottomSheetState = aMediaDeleteConfirmationState(), mediaBottomSheetState = aMediaBottomSheetStateDeleteConfirmation(),
), ),
anAudioMediaInfo( anAudioMediaInfo(
waveForm = WaveFormSamples.realisticWaveForm, waveForm = WaveFormSamples.realisticWaveForm,

View file

@ -253,7 +253,7 @@ fun MediaViewerView(
when (val bottomSheetState = state.mediaBottomSheetState) { when (val bottomSheetState = state.mediaBottomSheetState) {
MediaBottomSheetState.Hidden -> Unit MediaBottomSheetState.Hidden -> Unit
is MediaBottomSheetState.MediaDetailsBottomSheetState -> { is MediaBottomSheetState.Details -> {
MediaDetailsBottomSheet( MediaDetailsBottomSheet(
state = bottomSheetState, state = bottomSheetState,
onViewInTimeline = { onViewInTimeline = {
@ -292,7 +292,7 @@ fun MediaViewerView(
}, },
) )
} }
is MediaBottomSheetState.MediaDeleteConfirmationState -> { is MediaBottomSheetState.DeleteConfirmation -> {
MediaDeleteConfirmationBottomSheet( MediaDeleteConfirmationBottomSheet(
state = bottomSheetState, state = bottomSheetState,
onDelete = { onDelete = {

View file

@ -33,7 +33,7 @@ class MediaDeleteConfirmationBottomSheetTest {
@Test @Test
fun `clicking on Cancel invokes expected callback`() { fun `clicking on Cancel invokes expected callback`() {
val state = aMediaDeleteConfirmationState() val state = aMediaBottomSheetStateDeleteConfirmation()
ensureCalledOnce { callback -> ensureCalledOnce { callback ->
rule.setMediaDeleteConfirmationBottomSheet( rule.setMediaDeleteConfirmationBottomSheet(
state = state, state = state,
@ -45,7 +45,7 @@ class MediaDeleteConfirmationBottomSheetTest {
@Test @Test
fun `clicking on Remove invokes expected callback`() { fun `clicking on Remove invokes expected callback`() {
val state = aMediaDeleteConfirmationState() val state = aMediaBottomSheetStateDeleteConfirmation()
ensureCalledOnceWithParam(state.eventId) { callback -> ensureCalledOnceWithParam(state.eventId) { callback ->
rule.setMediaDeleteConfirmationBottomSheet( rule.setMediaDeleteConfirmationBottomSheet(
state = state, state = state,
@ -58,7 +58,7 @@ class MediaDeleteConfirmationBottomSheetTest {
} }
private fun <R : TestRule> AndroidComposeTestRule<R, ComponentActivity>.setMediaDeleteConfirmationBottomSheet( private fun <R : TestRule> AndroidComposeTestRule<R, ComponentActivity>.setMediaDeleteConfirmationBottomSheet(
state: MediaBottomSheetState.MediaDeleteConfirmationState, state: MediaBottomSheetState.DeleteConfirmation,
onDelete: (EventId) -> Unit = EnsureNeverCalledWithParam(), onDelete: (EventId) -> Unit = EnsureNeverCalledWithParam(),
onDismiss: () -> Unit = EnsureNeverCalled(), onDismiss: () -> Unit = EnsureNeverCalled(),
) { ) {

View file

@ -34,7 +34,7 @@ class MediaDetailsBottomSheetTest {
@Test @Test
@Config(qualifiers = "h1024dp") @Config(qualifiers = "h1024dp")
fun `clicking on View in timeline invokes expected callback`() { fun `clicking on View in timeline invokes expected callback`() {
val state = aMediaDetailsBottomSheetState() val state = aMediaBottomSheetStateDetails()
ensureCalledOnceWithParam(state.eventId) { callback -> ensureCalledOnceWithParam(state.eventId) { callback ->
rule.setMediaDetailsBottomSheet( rule.setMediaDetailsBottomSheet(
state = state, state = state,
@ -47,7 +47,7 @@ class MediaDetailsBottomSheetTest {
@Test @Test
@Config(qualifiers = "h1024dp") @Config(qualifiers = "h1024dp")
fun `clicking on Share invokes expected callback`() { fun `clicking on Share invokes expected callback`() {
val state = aMediaDetailsBottomSheetState() val state = aMediaBottomSheetStateDetails()
ensureCalledOnceWithParam(state.eventId) { callback -> ensureCalledOnceWithParam(state.eventId) { callback ->
rule.setMediaDetailsBottomSheet( rule.setMediaDetailsBottomSheet(
state = state, state = state,
@ -60,7 +60,7 @@ class MediaDetailsBottomSheetTest {
@Test @Test
@Config(qualifiers = "h1024dp") @Config(qualifiers = "h1024dp")
fun `clicking on Forward invokes expected callback`() { fun `clicking on Forward invokes expected callback`() {
val state = aMediaDetailsBottomSheetState() val state = aMediaBottomSheetStateDetails()
ensureCalledOnceWithParam(state.eventId) { callback -> ensureCalledOnceWithParam(state.eventId) { callback ->
rule.setMediaDetailsBottomSheet( rule.setMediaDetailsBottomSheet(
state = state, state = state,
@ -73,7 +73,7 @@ class MediaDetailsBottomSheetTest {
@Test @Test
@Config(qualifiers = "h1024dp") @Config(qualifiers = "h1024dp")
fun `clicking on Download invokes expected callback`() { fun `clicking on Download invokes expected callback`() {
val state = aMediaDetailsBottomSheetState() val state = aMediaBottomSheetStateDetails()
ensureCalledOnceWithParam(state.eventId) { callback -> ensureCalledOnceWithParam(state.eventId) { callback ->
rule.setMediaDetailsBottomSheet( rule.setMediaDetailsBottomSheet(
state = state, state = state,
@ -86,7 +86,7 @@ class MediaDetailsBottomSheetTest {
@Config(qualifiers = "h1024dp") @Config(qualifiers = "h1024dp")
@Test @Test
fun `clicking on Delete invokes expected callback`() { fun `clicking on Delete invokes expected callback`() {
val state = aMediaDetailsBottomSheetState() val state = aMediaBottomSheetStateDetails()
ensureCalledOnceWithParam(state.eventId) { callback -> ensureCalledOnceWithParam(state.eventId) { callback ->
rule.setMediaDetailsBottomSheet( rule.setMediaDetailsBottomSheet(
state = state, state = state,
@ -100,7 +100,7 @@ class MediaDetailsBottomSheetTest {
@Config(qualifiers = "h1024dp") @Config(qualifiers = "h1024dp")
@Test @Test
fun `Remove is not present if canDelete is false`() { fun `Remove is not present if canDelete is false`() {
val state = aMediaDetailsBottomSheetState( val state = aMediaBottomSheetStateDetails(
canDelete = false, canDelete = false,
) )
rule.setMediaDetailsBottomSheet( rule.setMediaDetailsBottomSheet(
@ -111,7 +111,7 @@ class MediaDetailsBottomSheetTest {
} }
private fun <R : TestRule> AndroidComposeTestRule<R, ComponentActivity>.setMediaDetailsBottomSheet( private fun <R : TestRule> AndroidComposeTestRule<R, ComponentActivity>.setMediaDetailsBottomSheet(
state: MediaBottomSheetState.MediaDetailsBottomSheetState, state: MediaBottomSheetState.Details,
onViewInTimeline: (EventId) -> Unit = EnsureNeverCalledWithParam(), onViewInTimeline: (EventId) -> Unit = EnsureNeverCalledWithParam(),
onShare: (EventId) -> Unit = EnsureNeverCalledWithParam(), onShare: (EventId) -> Unit = EnsureNeverCalledWithParam(),
onForward: (EventId) -> Unit = EnsureNeverCalledWithParam(), onForward: (EventId) -> Unit = EnsureNeverCalledWithParam(),

View file

@ -136,7 +136,7 @@ class MediaGalleryPresenterTest {
initialState.eventSink(MediaGalleryEvent.OpenInfo(item)) initialState.eventSink(MediaGalleryEvent.OpenInfo(item))
val state = awaitItem() val state = awaitItem()
assertThat(state.mediaBottomSheetState).isEqualTo( assertThat(state.mediaBottomSheetState).isEqualTo(
MediaBottomSheetState.MediaDetailsBottomSheetState( MediaBottomSheetState.Details(
eventId = AN_EVENT_ID, eventId = AN_EVENT_ID,
canDelete = canDeleteOwn, canDelete = canDeleteOwn,
mediaInfo = item.mediaInfo, mediaInfo = item.mediaInfo,
@ -183,7 +183,7 @@ class MediaGalleryPresenterTest {
initialState.eventSink(MediaGalleryEvent.OpenInfo(item)) initialState.eventSink(MediaGalleryEvent.OpenInfo(item))
val state = awaitItem() val state = awaitItem()
assertThat(state.mediaBottomSheetState).isEqualTo( assertThat(state.mediaBottomSheetState).isEqualTo(
MediaBottomSheetState.MediaDetailsBottomSheetState( MediaBottomSheetState.Details(
eventId = AN_EVENT_ID, eventId = AN_EVENT_ID,
canDelete = canDeleteOther, canDelete = canDeleteOther,
mediaInfo = item.mediaInfo, mediaInfo = item.mediaInfo,
@ -212,7 +212,7 @@ class MediaGalleryPresenterTest {
initialState.eventSink(MediaGalleryEvent.ConfirmDelete(AN_EVENT_ID, item.mediaInfo, item.thumbnailSource)) initialState.eventSink(MediaGalleryEvent.ConfirmDelete(AN_EVENT_ID, item.mediaInfo, item.thumbnailSource))
val deleteState = awaitItem() val deleteState = awaitItem()
assertThat(deleteState.mediaBottomSheetState).isEqualTo( assertThat(deleteState.mediaBottomSheetState).isEqualTo(
MediaBottomSheetState.MediaDeleteConfirmationState( MediaBottomSheetState.DeleteConfirmation(
eventId = AN_EVENT_ID, eventId = AN_EVENT_ID,
mediaInfo = item.mediaInfo, mediaInfo = item.mediaInfo,
thumbnailSource = item.thumbnailSource, thumbnailSource = item.thumbnailSource,
@ -384,7 +384,7 @@ class MediaGalleryPresenterTest {
val initialState = awaitFirstItem() val initialState = awaitFirstItem()
initialState.eventSink(MediaGalleryEvent.OpenInfo(item)) initialState.eventSink(MediaGalleryEvent.OpenInfo(item))
val withBottomSheetState = awaitItem() val withBottomSheetState = awaitItem()
assertThat(withBottomSheetState.mediaBottomSheetState).isInstanceOf(MediaBottomSheetState.MediaDetailsBottomSheetState::class.java) assertThat(withBottomSheetState.mediaBottomSheetState).isInstanceOf(MediaBottomSheetState.Details::class.java)
withBottomSheetState.eventSink(MediaGalleryEvent.OpenWith(AN_EVENT_ID)) withBottomSheetState.eventSink(MediaGalleryEvent.OpenWith(AN_EVENT_ID))
val finalState = awaitItem() val finalState = awaitItem()
assertThat(finalState.mediaBottomSheetState).isEqualTo(MediaBottomSheetState.Hidden) assertThat(finalState.mediaBottomSheetState).isEqualTo(MediaBottomSheetState.Hidden)
@ -451,7 +451,7 @@ class MediaGalleryPresenterTest {
) )
initialState.eventSink(MediaGalleryEvent.OpenInfo(item)) initialState.eventSink(MediaGalleryEvent.OpenInfo(item))
val withBottomSheetState = awaitItem() val withBottomSheetState = awaitItem()
assertThat(withBottomSheetState.mediaBottomSheetState).isInstanceOf(MediaBottomSheetState.MediaDetailsBottomSheetState::class.java) assertThat(withBottomSheetState.mediaBottomSheetState).isInstanceOf(MediaBottomSheetState.Details::class.java)
withBottomSheetState.eventSink(MediaGalleryEvent.ViewInTimeline(AN_EVENT_ID)) withBottomSheetState.eventSink(MediaGalleryEvent.ViewInTimeline(AN_EVENT_ID))
val finalState = awaitItem() val finalState = awaitItem()
assertThat(finalState.mediaBottomSheetState).isEqualTo(MediaBottomSheetState.Hidden) assertThat(finalState.mediaBottomSheetState).isEqualTo(MediaBottomSheetState.Hidden)
@ -484,7 +484,7 @@ class MediaGalleryPresenterTest {
) )
initialState.eventSink(MediaGalleryEvent.OpenInfo(item)) initialState.eventSink(MediaGalleryEvent.OpenInfo(item))
val withBottomSheetState = awaitItem() val withBottomSheetState = awaitItem()
assertThat(withBottomSheetState.mediaBottomSheetState).isInstanceOf(MediaBottomSheetState.MediaDetailsBottomSheetState::class.java) assertThat(withBottomSheetState.mediaBottomSheetState).isInstanceOf(MediaBottomSheetState.Details::class.java)
withBottomSheetState.eventSink(MediaGalleryEvent.Forward(AN_EVENT_ID)) withBottomSheetState.eventSink(MediaGalleryEvent.Forward(AN_EVENT_ID))
val finalState = awaitItem() val finalState = awaitItem()
assertThat(finalState.mediaBottomSheetState).isEqualTo(MediaBottomSheetState.Hidden) assertThat(finalState.mediaBottomSheetState).isEqualTo(MediaBottomSheetState.Hidden)

View file

@ -273,7 +273,7 @@ class MediaViewerPresenterTest {
) )
) )
val withInfoState = awaitItem() val withInfoState = awaitItem()
assertThat(withInfoState.mediaBottomSheetState).isInstanceOf(MediaBottomSheetState.MediaDetailsBottomSheetState::class.java) assertThat(withInfoState.mediaBottomSheetState).isInstanceOf(MediaBottomSheetState.Details::class.java)
withInfoState.eventSink( withInfoState.eventSink(
MediaViewerEvent.CloseBottomSheet MediaViewerEvent.CloseBottomSheet
) )
@ -446,7 +446,7 @@ class MediaViewerPresenterTest {
) )
) )
val withBottomSheetState = awaitItem() val withBottomSheetState = awaitItem()
assertThat(withBottomSheetState.mediaBottomSheetState).isInstanceOf(MediaBottomSheetState.MediaDeleteConfirmationState::class.java) assertThat(withBottomSheetState.mediaBottomSheetState).isInstanceOf(MediaBottomSheetState.DeleteConfirmation::class.java)
withBottomSheetState.eventSink( withBottomSheetState.eventSink(
MediaViewerEvent.CloseBottomSheet MediaViewerEvent.CloseBottomSheet
) )
@ -506,7 +506,7 @@ class MediaViewerPresenterTest {
) )
) )
val withBottomSheetState = awaitItem() val withBottomSheetState = awaitItem()
assertThat(withBottomSheetState.mediaBottomSheetState).isInstanceOf(MediaBottomSheetState.MediaDeleteConfirmationState::class.java) assertThat(withBottomSheetState.mediaBottomSheetState).isInstanceOf(MediaBottomSheetState.DeleteConfirmation::class.java)
updatedState.eventSink( updatedState.eventSink(
MediaViewerEvent.Delete( MediaViewerEvent.Delete(
eventId = AN_EVENT_ID, eventId = AN_EVENT_ID,
@ -798,7 +798,7 @@ class MediaViewerPresenterTest {
val initialState = awaitItem() val initialState = awaitItem()
initialState.eventSink(MediaViewerEvent.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.Details::class.java)
initialState.eventSink(MediaViewerEvent.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)
@ -827,7 +827,7 @@ class MediaViewerPresenterTest {
val initialState = awaitItem() val initialState = awaitItem()
initialState.eventSink(MediaViewerEvent.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.Details::class.java)
initialState.eventSink(MediaViewerEvent.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)
@ -858,7 +858,7 @@ class MediaViewerPresenterTest {
val initialState = awaitItem() val initialState = awaitItem()
initialState.eventSink(MediaViewerEvent.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.Details::class.java)
initialState.eventSink(MediaViewerEvent.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)

View file

@ -20,7 +20,7 @@ import androidx.compose.ui.test.performTouchInput
import androidx.compose.ui.test.swipeDown import androidx.compose.ui.test.swipeDown
import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.ext.junit.runners.AndroidJUnit4
import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.architecture.AsyncData
import io.element.android.libraries.mediaviewer.impl.details.aMediaDetailsBottomSheetState import io.element.android.libraries.mediaviewer.impl.details.aMediaBottomSheetStateDetails
import io.element.android.libraries.mediaviewer.test.viewer.aLocalMedia import io.element.android.libraries.mediaviewer.test.viewer.aLocalMedia
import io.element.android.libraries.ui.strings.CommonStrings import io.element.android.libraries.ui.strings.CommonStrings
import io.element.android.tests.testutils.EnsureNeverCalled import io.element.android.tests.testutils.EnsureNeverCalled
@ -164,7 +164,7 @@ class MediaViewerViewTest {
rule.setMediaViewerView( rule.setMediaViewerView(
aMediaViewerState( aMediaViewerState(
listData = listOf(data), listData = listOf(data),
mediaBottomSheetState = aMediaDetailsBottomSheetState(), mediaBottomSheetState = aMediaBottomSheetStateDetails(),
eventSink = eventsRecorder eventSink = eventsRecorder
), ),
) )