Rename sub classes of MediaBottomSheetState and improve preview of MediaDeleteConfirmationBottomSheet
This commit is contained in:
parent
442b7bc7cb
commit
7d31944a0a
17 changed files with 103 additions and 89 deletions
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
)
|
||||||
|
|
@ -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,
|
)
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
@ -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 = {},
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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")),
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -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 = {
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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 = {
|
||||||
|
|
|
||||||
|
|
@ -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(),
|
||||||
) {
|
) {
|
||||||
|
|
|
||||||
|
|
@ -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(),
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue