From 54efb462943311c4a0d5240564082ecd9b5906e9 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 21 Apr 2026 15:50:59 +0200 Subject: [PATCH 01/22] `MediaViewerEvents` -> `MediaViewerEvent` --- ...diaViewerEvents.kt => MediaViewerEvent.kt} | 28 ++++----- .../impl/viewer/MediaViewerPresenter.kt | 28 ++++----- .../impl/viewer/MediaViewerState.kt | 2 +- .../impl/viewer/MediaViewerStateProvider.kt | 2 +- .../impl/viewer/MediaViewerView.kt | 32 +++++----- .../impl/viewer/MediaViewerPresenterTest.kt | 44 +++++++------- .../impl/viewer/MediaViewerViewTest.kt | 58 +++++++++---------- 7 files changed, 97 insertions(+), 97 deletions(-) rename libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/{MediaViewerEvents.kt => MediaViewerEvent.kt} (67%) diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerEvents.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerEvent.kt similarity index 67% rename from libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerEvents.kt rename to libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerEvent.kt index 3f1436b9b6..1960b69e4c 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerEvents.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerEvent.kt @@ -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.timeline.Timeline -sealed interface MediaViewerEvents { - data class LoadMedia(val data: MediaViewerPageData.MediaViewerData) : MediaViewerEvents - data class SaveOnDisk(val data: MediaViewerPageData.MediaViewerData) : MediaViewerEvents - data class Share(val data: MediaViewerPageData.MediaViewerData) : MediaViewerEvents - data class OpenWith(val data: MediaViewerPageData.MediaViewerData) : MediaViewerEvents - data class ClearLoadingError(val data: MediaViewerPageData.MediaViewerData) : MediaViewerEvents - data class ViewInTimeline(val eventId: EventId) : MediaViewerEvents - data class Forward(val eventId: EventId) : MediaViewerEvents - data class OpenInfo(val data: MediaViewerPageData.MediaViewerData) : MediaViewerEvents +sealed interface MediaViewerEvent { + data class LoadMedia(val data: MediaViewerPageData.MediaViewerData) : MediaViewerEvent + data class SaveOnDisk(val data: MediaViewerPageData.MediaViewerData) : MediaViewerEvent + data class Share(val data: MediaViewerPageData.MediaViewerData) : MediaViewerEvent + data class OpenWith(val data: MediaViewerPageData.MediaViewerData) : MediaViewerEvent + data class ClearLoadingError(val data: MediaViewerPageData.MediaViewerData) : MediaViewerEvent + data class ViewInTimeline(val eventId: EventId) : MediaViewerEvent + data class Forward(val eventId: EventId) : MediaViewerEvent + data class OpenInfo(val data: MediaViewerPageData.MediaViewerData) : MediaViewerEvent data class ConfirmDelete( val eventId: EventId, val data: MediaViewerPageData.MediaViewerData, - ) : MediaViewerEvents + ) : MediaViewerEvent - data object CloseBottomSheet : MediaViewerEvents - data class Delete(val eventId: EventId) : MediaViewerEvents - data class OnNavigateTo(val index: Int) : MediaViewerEvents - data class LoadMore(val direction: Timeline.PaginationDirection) : MediaViewerEvents + data object CloseBottomSheet : MediaViewerEvent + data class Delete(val eventId: EventId) : MediaViewerEvent + data class OnNavigateTo(val index: Int) : MediaViewerEvent + data class LoadMore(val direction: Timeline.PaginationDirection) : MediaViewerEvent } diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerPresenter.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerPresenter.kt index ae581fa8d4..0128e40e65 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerPresenter.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerPresenter.kt @@ -95,42 +95,42 @@ class MediaViewerPresenter( } localMediaActions.Configure() - fun handleEvent(event: MediaViewerEvents) { + fun handleEvent(event: MediaViewerEvent) { when (event) { - is MediaViewerEvents.LoadMedia -> { + is MediaViewerEvent.LoadMedia -> { coroutineScope.downloadMedia(data = event.data) } - is MediaViewerEvents.ClearLoadingError -> { + is MediaViewerEvent.ClearLoadingError -> { dataSource.clearLoadingError(event.data) } - is MediaViewerEvents.SaveOnDisk -> { + is MediaViewerEvent.SaveOnDisk -> { mediaBottomSheetState = MediaBottomSheetState.Hidden coroutineScope.saveOnDisk(event.data.downloadedMedia.value) } - is MediaViewerEvents.Share -> { + is MediaViewerEvent.Share -> { mediaBottomSheetState = MediaBottomSheetState.Hidden coroutineScope.share(event.data.downloadedMedia.value) } - is MediaViewerEvents.OpenWith -> { + is MediaViewerEvent.OpenWith -> { mediaBottomSheetState = MediaBottomSheetState.Hidden coroutineScope.open(event.data.downloadedMedia.value) } - is MediaViewerEvents.Delete -> { + is MediaViewerEvent.Delete -> { mediaBottomSheetState = MediaBottomSheetState.Hidden coroutineScope.delete(event.eventId) } - is MediaViewerEvents.ViewInTimeline -> { + is MediaViewerEvent.ViewInTimeline -> { mediaBottomSheetState = MediaBottomSheetState.Hidden navigator.onViewInTimelineClick(event.eventId) } - is MediaViewerEvents.Forward -> { + is MediaViewerEvent.Forward -> { mediaBottomSheetState = MediaBottomSheetState.Hidden navigator.onForwardClick( eventId = event.eventId, fromPinnedEvents = inputs.mode.getTimelineMode() == Timeline.Mode.PinnedEvents, ) } - is MediaViewerEvents.OpenInfo -> coroutineScope.launch { + is MediaViewerEvent.OpenInfo -> coroutineScope.launch { mediaBottomSheetState = MediaBottomSheetState.MediaDetailsBottomSheetState( eventId = event.data.eventId, canDelete = when (event.data.mediaInfo.senderId) { @@ -142,20 +142,20 @@ class MediaViewerPresenter( thumbnailSource = event.data.thumbnailSource, ) } - is MediaViewerEvents.ConfirmDelete -> { + is MediaViewerEvent.ConfirmDelete -> { mediaBottomSheetState = MediaBottomSheetState.MediaDeleteConfirmationState( eventId = event.eventId, mediaInfo = event.data.mediaInfo, thumbnailSource = event.data.thumbnailSource ?: event.data.mediaSource, ) } - MediaViewerEvents.CloseBottomSheet -> { + MediaViewerEvent.CloseBottomSheet -> { mediaBottomSheetState = MediaBottomSheetState.Hidden } - is MediaViewerEvents.OnNavigateTo -> { + is MediaViewerEvent.OnNavigateTo -> { currentIndex.intValue = event.index } - is MediaViewerEvents.LoadMore -> coroutineScope.launch { + is MediaViewerEvent.LoadMore -> coroutineScope.launch { dataSource.loadMore(event.direction) } } diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerState.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerState.kt index ae1a422a6f..8a4da2aac3 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerState.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerState.kt @@ -26,7 +26,7 @@ data class MediaViewerState( val snackbarMessage: SnackbarMessage?, val canShowInfo: Boolean, val mediaBottomSheetState: MediaBottomSheetState, - val eventSink: (MediaViewerEvents) -> Unit, + val eventSink: (MediaViewerEvent) -> Unit, ) sealed interface MediaViewerPageData { diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerStateProvider.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerStateProvider.kt index b1a2bde350..e7d8fd55ae 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerStateProvider.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerStateProvider.kt @@ -226,7 +226,7 @@ fun aMediaViewerState( currentIndex: Int = 0, canShowInfo: Boolean = true, mediaBottomSheetState: MediaBottomSheetState = MediaBottomSheetState.Hidden, - eventSink: (MediaViewerEvents) -> Unit = {}, + eventSink: (MediaViewerEvent) -> Unit = {}, ) = MediaViewerState( initiallySelectedEventId = EventId("\$a:b"), listData = listData.toImmutableList(), diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerView.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerView.kt index 95ce7c631f..aa1d95f6e5 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerView.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerView.kt @@ -126,7 +126,7 @@ fun MediaViewerView( } LaunchedEffect(pagerState) { snapshotFlow { pagerState.currentPage }.collect { page -> - state.eventSink(MediaViewerEvents.OnNavigateTo(page)) + state.eventSink(MediaViewerEvent.OnNavigateTo(page)) } } HorizontalPager( @@ -145,7 +145,7 @@ fun MediaViewerView( } is MediaViewerPageData.Loading -> { LaunchedEffect(dataForPage.timestamp) { - state.eventSink(MediaViewerEvents.LoadMore(dataForPage.direction)) + state.eventSink(MediaViewerEvent.LoadMore(dataForPage.direction)) } MediaViewerLoadingPage( onDismiss = onBackClick, @@ -154,7 +154,7 @@ fun MediaViewerView( is MediaViewerPageData.MediaViewerData -> { var bottomPaddingInPixels by remember { mutableIntStateOf(defaultBottomPaddingInPixels) } LaunchedEffect(Unit) { - state.eventSink(MediaViewerEvents.LoadMedia(dataForPage)) + state.eventSink(MediaViewerEvent.LoadMedia(dataForPage)) } Box( modifier = Modifier.fillMaxSize() @@ -173,10 +173,10 @@ fun MediaViewerView( textFileViewer = textFileViewer, onDismiss = onBackClick, onRetry = { - state.eventSink(MediaViewerEvents.LoadMedia(dataForPage)) + state.eventSink(MediaViewerEvent.LoadMedia(dataForPage)) }, onDismissError = { - state.eventSink(MediaViewerEvents.ClearLoadingError(dataForPage)) + state.eventSink(MediaViewerEvent.ClearLoadingError(dataForPage)) }, onShowOverlayChange = { showOverlay = it @@ -215,7 +215,7 @@ fun MediaViewerView( canShowInfo = state.canShowInfo, onBackClick = onBackClick, onInfoClick = { - state.eventSink(MediaViewerEvents.OpenInfo(currentData)) + state.eventSink(MediaViewerEvent.OpenInfo(currentData)) }, eventSink = state.eventSink ) @@ -251,25 +251,25 @@ fun MediaViewerView( MediaDetailsBottomSheet( state = bottomSheetState, onViewInTimeline = { - state.eventSink(MediaViewerEvents.ViewInTimeline(it)) + state.eventSink(MediaViewerEvent.ViewInTimeline(it)) }, onShare = { (currentData as? MediaViewerPageData.MediaViewerData)?.let { - state.eventSink(MediaViewerEvents.Share(currentData)) + state.eventSink(MediaViewerEvent.Share(currentData)) } }, onForward = { - state.eventSink(MediaViewerEvents.Forward(it)) + state.eventSink(MediaViewerEvent.Forward(it)) }, onDownload = { (currentData as? MediaViewerPageData.MediaViewerData)?.let { - state.eventSink(MediaViewerEvents.SaveOnDisk(currentData)) + state.eventSink(MediaViewerEvent.SaveOnDisk(currentData)) } }, onDelete = { eventId -> (currentData as? MediaViewerPageData.MediaViewerData)?.let { state.eventSink( - MediaViewerEvents.ConfirmDelete( + MediaViewerEvent.ConfirmDelete( eventId, currentData, ) @@ -277,7 +277,7 @@ fun MediaViewerView( } }, onDismiss = { - state.eventSink(MediaViewerEvents.CloseBottomSheet) + state.eventSink(MediaViewerEvent.CloseBottomSheet) }, ) } @@ -285,10 +285,10 @@ fun MediaViewerView( MediaDeleteConfirmationBottomSheet( state = bottomSheetState, onDelete = { - state.eventSink(MediaViewerEvents.Delete(it)) + state.eventSink(MediaViewerEvent.Delete(it)) }, onDismiss = { - state.eventSink(MediaViewerEvents.CloseBottomSheet) + state.eventSink(MediaViewerEvent.CloseBottomSheet) }, ) } @@ -458,7 +458,7 @@ private fun MediaViewerTopBar( canShowInfo: Boolean, onBackClick: () -> Unit, onInfoClick: () -> Unit, - eventSink: (MediaViewerEvents) -> Unit, + eventSink: (MediaViewerEvent) -> Unit, ) { val downloadedMedia by data.downloadedMedia val actionsEnabled = downloadedMedia.isSuccess() @@ -500,7 +500,7 @@ private fun MediaViewerTopBar( IconButton( enabled = actionsEnabled, onClick = { - eventSink(MediaViewerEvents.OpenWith(data)) + eventSink(MediaViewerEvent.OpenWith(data)) }, ) { when (mimeType) { diff --git a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerPresenterTest.kt b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerPresenterTest.kt index c217ea3306..6cf846ff78 100644 --- a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerPresenterTest.kt +++ b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerPresenterTest.kt @@ -226,7 +226,7 @@ class MediaViewerPresenterTest { ) val updatedState = awaitItem() updatedState.eventSink( - MediaViewerEvents.LoadMedia( + MediaViewerEvent.LoadMedia( aMediaViewerPageData( mediaSource = MediaSource(aUrl) ) @@ -266,7 +266,7 @@ class MediaViewerPresenterTest { ) val updatedState = awaitItem() updatedState.eventSink( - MediaViewerEvents.OpenInfo( + MediaViewerEvent.OpenInfo( aMediaViewerPageData( mediaSource = MediaSource(aUrl) ) @@ -275,7 +275,7 @@ class MediaViewerPresenterTest { val withInfoState = awaitItem() assertThat(withInfoState.mediaBottomSheetState).isInstanceOf(MediaBottomSheetState.MediaDetailsBottomSheetState::class.java) withInfoState.eventSink( - MediaViewerEvents.CloseBottomSheet + MediaViewerEvent.CloseBottomSheet ) val finalState = awaitItem() assertThat(finalState.mediaBottomSheetState).isEqualTo(MediaBottomSheetState.Hidden) @@ -306,7 +306,7 @@ class MediaViewerPresenterTest { ) val updatedState = awaitItem() updatedState.eventSink( - MediaViewerEvents.ClearLoadingError( + MediaViewerEvent.ClearLoadingError( aMediaViewerPageData( mediaSource = MediaSource(aUrl) ) @@ -339,7 +339,7 @@ class MediaViewerPresenterTest { ) val updatedState = awaitItem() updatedState.eventSink( - MediaViewerEvents.Share( + MediaViewerEvent.Share( aMediaViewerPageData( mediaSource = MediaSource(aUrl) ) @@ -372,7 +372,7 @@ class MediaViewerPresenterTest { ) val updatedState = awaitItem() updatedState.eventSink( - MediaViewerEvents.SaveOnDisk( + MediaViewerEvent.SaveOnDisk( aMediaViewerPageData( mediaSource = MediaSource(aUrl) ) @@ -405,7 +405,7 @@ class MediaViewerPresenterTest { ) val updatedState = awaitItem() updatedState.eventSink( - MediaViewerEvents.OpenWith( + MediaViewerEvent.OpenWith( aMediaViewerPageData( mediaSource = MediaSource(aUrl) ) @@ -438,7 +438,7 @@ class MediaViewerPresenterTest { ) val updatedState = awaitItem() updatedState.eventSink( - MediaViewerEvents.ConfirmDelete( + MediaViewerEvent.ConfirmDelete( eventId = AN_EVENT_ID, data = aMediaViewerPageData( mediaSource = MediaSource(aUrl) @@ -448,7 +448,7 @@ class MediaViewerPresenterTest { val withBottomSheetState = awaitItem() assertThat(withBottomSheetState.mediaBottomSheetState).isInstanceOf(MediaBottomSheetState.MediaDeleteConfirmationState::class.java) withBottomSheetState.eventSink( - MediaViewerEvents.CloseBottomSheet + MediaViewerEvent.CloseBottomSheet ) val finalState = awaitItem() assertThat(finalState.mediaBottomSheetState).isEqualTo(MediaBottomSheetState.Hidden) @@ -498,7 +498,7 @@ class MediaViewerPresenterTest { ) val updatedState = awaitItem() updatedState.eventSink( - MediaViewerEvents.ConfirmDelete( + MediaViewerEvent.ConfirmDelete( eventId = AN_EVENT_ID, data = aMediaViewerPageData( mediaSource = MediaSource(aUrl) @@ -508,7 +508,7 @@ class MediaViewerPresenterTest { val withBottomSheetState = awaitItem() assertThat(withBottomSheetState.mediaBottomSheetState).isInstanceOf(MediaBottomSheetState.MediaDeleteConfirmationState::class.java) updatedState.eventSink( - MediaViewerEvents.Delete( + MediaViewerEvent.Delete( eventId = AN_EVENT_ID, ) ) @@ -551,7 +551,7 @@ class MediaViewerPresenterTest { ) val updatedState = awaitItem() updatedState.eventSink( - MediaViewerEvents.OnNavigateTo(1) + MediaViewerEvent.OnNavigateTo(1) ) val finalState = awaitItem() assertThat(finalState.currentIndex).isEqualTo(1) @@ -606,7 +606,7 @@ class MediaViewerPresenterTest { val updatedState = awaitItem() // User navigate to the last item (forward loading indicator) updatedState.eventSink( - MediaViewerEvents.OnNavigateTo(2) + MediaViewerEvent.OnNavigateTo(2) ) // data source claims that there is no more items to load forward mediaGalleryDataSource.emitGroupedMediaItems( @@ -680,7 +680,7 @@ class MediaViewerPresenterTest { val updatedState = awaitItem() // User navigate to the first item (backward loading indicator) updatedState.eventSink( - MediaViewerEvents.OnNavigateTo(0) + MediaViewerEvent.OnNavigateTo(0) ) // data source claims that there is no more items to load backward mediaGalleryDataSource.emitGroupedMediaItems( @@ -728,7 +728,7 @@ class MediaViewerPresenterTest { val updatedState = awaitItem() // User navigate to the media updatedState.eventSink( - MediaViewerEvents.OnNavigateTo(1) + MediaViewerEvent.OnNavigateTo(1) ) skipItems(1) // data source claims that there is no more items to load at all @@ -771,7 +771,7 @@ class MediaViewerPresenterTest { ) val updatedState = awaitItem() updatedState.eventSink( - MediaViewerEvents.LoadMore(Timeline.PaginationDirection.BACKWARDS) + MediaViewerEvent.LoadMore(Timeline.PaginationDirection.BACKWARDS) ) loadMoreLambda.assertions().isCalledOnce().with(value(Timeline.PaginationDirection.BACKWARDS)) } @@ -796,10 +796,10 @@ class MediaViewerPresenterTest { ) presenter.test { val initialState = awaitItem() - initialState.eventSink(MediaViewerEvents.OpenInfo(aMediaViewerPageData())) + initialState.eventSink(MediaViewerEvent.OpenInfo(aMediaViewerPageData())) val withBottomSheetState = awaitItem() 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() assertThat(finalState.mediaBottomSheetState).isEqualTo(MediaBottomSheetState.Hidden) onViewInTimelineClickLambda.assertions().isCalledOnce().with(value(AN_EVENT_ID)) @@ -825,10 +825,10 @@ class MediaViewerPresenterTest { ) presenter.test { val initialState = awaitItem() - initialState.eventSink(MediaViewerEvents.OpenInfo(aMediaViewerPageData())) + initialState.eventSink(MediaViewerEvent.OpenInfo(aMediaViewerPageData())) val withBottomSheetState = awaitItem() 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() assertThat(finalState.mediaBottomSheetState).isEqualTo(MediaBottomSheetState.Hidden) onForwardClickLambda.assertions().isCalledOnce() @@ -856,10 +856,10 @@ class MediaViewerPresenterTest { ) presenter.test { val initialState = awaitItem() - initialState.eventSink(MediaViewerEvents.OpenInfo(aMediaViewerPageData())) + initialState.eventSink(MediaViewerEvent.OpenInfo(aMediaViewerPageData())) val withBottomSheetState = awaitItem() 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() assertThat(finalState.mediaBottomSheetState).isEqualTo(MediaBottomSheetState.Hidden) onForwardClickLambda.assertions().isCalledOnce() diff --git a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerViewTest.kt b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerViewTest.kt index b1114945c2..d735497ece 100644 --- a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerViewTest.kt +++ b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerViewTest.kt @@ -43,7 +43,7 @@ class MediaViewerViewTest { @Test fun `clicking on back invokes expected callback`() { - val eventsRecorder = EventsRecorder() + val eventsRecorder = EventsRecorder() val state = aMediaViewerState( eventSink = eventsRecorder ) @@ -56,8 +56,8 @@ class MediaViewerViewTest { } eventsRecorder.assertList( listOf( - MediaViewerEvents.OnNavigateTo(0), - MediaViewerEvents.LoadMedia(state.listData.first() as MediaViewerPageData.MediaViewerData), + MediaViewerEvent.OnNavigateTo(0), + MediaViewerEvent.LoadMedia(state.listData.first() as MediaViewerPageData.MediaViewerData), ) ) } @@ -70,7 +70,7 @@ class MediaViewerViewTest { testMenuAction( data, CommonStrings.action_open_with, - MediaViewerEvents.OpenWith(data), + MediaViewerEvent.OpenWith(data), ) } @@ -82,16 +82,16 @@ class MediaViewerViewTest { testMenuAction( data, CommonStrings.a11y_view_details, - MediaViewerEvents.OpenInfo(data), + MediaViewerEvent.OpenInfo(data), ) } private fun testMenuAction( data: MediaViewerPageData.MediaViewerData, contentDescriptionRes: Int, - expectedEvent: MediaViewerEvents, + expectedEvent: MediaViewerEvent, ) { - val eventsRecorder = EventsRecorder() + val eventsRecorder = EventsRecorder() rule.setMediaViewerView( aMediaViewerState( listData = listOf(data), @@ -102,8 +102,8 @@ class MediaViewerViewTest { rule.onNodeWithContentDescription(contentDescription).performClick() eventsRecorder.assertList( listOf( - MediaViewerEvents.OnNavigateTo(0), - MediaViewerEvents.LoadMedia(data), + MediaViewerEvent.OnNavigateTo(0), + MediaViewerEvent.LoadMedia(data), expectedEvent, ) ) @@ -116,7 +116,7 @@ class MediaViewerViewTest { testBottomSheetAction( data, CommonStrings.action_save, - MediaViewerEvents.SaveOnDisk(data), + MediaViewerEvent.SaveOnDisk(data), ) } @@ -127,16 +127,16 @@ class MediaViewerViewTest { testBottomSheetAction( data, CommonStrings.action_share, - MediaViewerEvents.Share(data), + MediaViewerEvent.Share(data), ) } private fun testBottomSheetAction( data: MediaViewerPageData.MediaViewerData, contentDescriptionRes: Int, - expectedEvent: MediaViewerEvents, + expectedEvent: MediaViewerEvent, ) { - val eventsRecorder = EventsRecorder() + val eventsRecorder = EventsRecorder() rule.setMediaViewerView( aMediaViewerState( listData = listOf(data), @@ -147,8 +147,8 @@ class MediaViewerViewTest { rule.clickOn(contentDescriptionRes) eventsRecorder.assertList( listOf( - MediaViewerEvents.OnNavigateTo(0), - MediaViewerEvents.LoadMedia(data), + MediaViewerEvent.OnNavigateTo(0), + MediaViewerEvent.LoadMedia(data), expectedEvent, ) ) @@ -156,7 +156,7 @@ class MediaViewerViewTest { @Test fun `clicking on image hides the overlay`() { - val eventsRecorder = EventsRecorder() + val eventsRecorder = EventsRecorder() val state = aMediaViewerState( eventSink = eventsRecorder ) @@ -176,15 +176,15 @@ class MediaViewerViewTest { .assertDoesNotExist() eventsRecorder.assertList( listOf( - MediaViewerEvents.OnNavigateTo(0), - MediaViewerEvents.LoadMedia(state.listData.first() as MediaViewerPageData.MediaViewerData), + MediaViewerEvent.OnNavigateTo(0), + MediaViewerEvent.LoadMedia(state.listData.first() as MediaViewerPageData.MediaViewerData), ) ) } @Test fun `clicking swipe on the image invokes the expected callback`() { - val eventsRecorder = EventsRecorder() + val eventsRecorder = EventsRecorder() val state = aMediaViewerState( eventSink = eventsRecorder ) @@ -199,15 +199,15 @@ class MediaViewerViewTest { } eventsRecorder.assertList( listOf( - MediaViewerEvents.OnNavigateTo(0), - MediaViewerEvents.LoadMedia(state.listData.first() as MediaViewerPageData.MediaViewerData), + MediaViewerEvent.OnNavigateTo(0), + MediaViewerEvent.LoadMedia(state.listData.first() as MediaViewerPageData.MediaViewerData), ) ) } @Test fun `error case, click on retry emits the expected Event`() { - val eventsRecorder = EventsRecorder() + val eventsRecorder = EventsRecorder() val data = aMediaViewerPageData( downloadedMedia = AsyncData.Failure(IllegalStateException("error")), ) @@ -220,16 +220,16 @@ class MediaViewerViewTest { rule.clickOn(CommonStrings.action_retry) eventsRecorder.assertList( listOf( - MediaViewerEvents.OnNavigateTo(0), - MediaViewerEvents.LoadMedia(data), - MediaViewerEvents.LoadMedia(data), + MediaViewerEvent.OnNavigateTo(0), + MediaViewerEvent.LoadMedia(data), + MediaViewerEvent.LoadMedia(data), ) ) } @Test fun `error case, click on cancel emits the expected Event`() { - val eventsRecorder = EventsRecorder() + val eventsRecorder = EventsRecorder() val data = aMediaViewerPageData( downloadedMedia = AsyncData.Failure(IllegalStateException("error")), ) @@ -242,9 +242,9 @@ class MediaViewerViewTest { rule.clickOn(CommonStrings.action_cancel) eventsRecorder.assertList( listOf( - MediaViewerEvents.OnNavigateTo(0), - MediaViewerEvents.LoadMedia(data), - MediaViewerEvents.ClearLoadingError(data) + MediaViewerEvent.OnNavigateTo(0), + MediaViewerEvent.LoadMedia(data), + MediaViewerEvent.ClearLoadingError(data) ) ) } From 97ae775df58de642a5f0d27d4db4b984f7c7edfa Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 21 Apr 2026 16:14:07 +0200 Subject: [PATCH 02/22] MediaViewer: add Share action as a main action. --- .../mediaviewer/impl/viewer/MediaViewerView.kt | 13 +++++++++++++ .../mediaviewer/impl/viewer/MediaViewerViewTest.kt | 12 ++++++++++++ 2 files changed, 25 insertions(+) diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerView.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerView.kt index aa1d95f6e5..b2a7f3fdff 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerView.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerView.kt @@ -214,6 +214,9 @@ fun MediaViewerView( data = currentData, canShowInfo = state.canShowInfo, onBackClick = onBackClick, + onShareClick = { + state.eventSink(MediaViewerEvent.Share(currentData)) + }, onInfoClick = { state.eventSink(MediaViewerEvent.OpenInfo(currentData)) }, @@ -457,6 +460,7 @@ private fun MediaViewerTopBar( data: MediaViewerPageData.MediaViewerData, canShowInfo: Boolean, onBackClick: () -> Unit, + onShareClick: () -> Unit, onInfoClick: () -> Unit, eventSink: (MediaViewerEvent) -> Unit, ) { @@ -514,6 +518,15 @@ private fun MediaViewerTopBar( ) } } + IconButton( + onClick = onShareClick, + enabled = actionsEnabled, + ) { + Icon( + imageVector = CompoundIcons.ShareAndroid(), + contentDescription = stringResource(id = CommonStrings.action_share), + ) + } if (canShowInfo) { IconButton( onClick = onInfoClick, diff --git a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerViewTest.kt b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerViewTest.kt index d735497ece..34c67683cd 100644 --- a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerViewTest.kt +++ b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerViewTest.kt @@ -86,6 +86,18 @@ class MediaViewerViewTest { ) } + @Test + fun `clicking on top action share emits expected Event`() { + val data = aMediaViewerPageData( + downloadedMedia = AsyncData.Success(aLocalMedia(uri = mockMediaUrl)), + ) + testMenuAction( + data, + CommonStrings.action_share, + MediaViewerEvent.Share(data), + ) + } + private fun testMenuAction( data: MediaViewerPageData.MediaViewerData, contentDescriptionRes: Int, From 79afb1d9e07be39d591dee71ab5c09201f20811e Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 21 Apr 2026 16:21:01 +0200 Subject: [PATCH 03/22] MediaViewer: add Save action as a main action. --- .../mediaviewer/impl/viewer/MediaViewerView.kt | 13 +++++++++++++ .../mediaviewer/impl/viewer/MediaViewerViewTest.kt | 12 ++++++++++++ 2 files changed, 25 insertions(+) diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerView.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerView.kt index b2a7f3fdff..ee7a235390 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerView.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerView.kt @@ -217,6 +217,9 @@ fun MediaViewerView( onShareClick = { state.eventSink(MediaViewerEvent.Share(currentData)) }, + onSaveClick = { + state.eventSink(MediaViewerEvent.SaveOnDisk(currentData)) + }, onInfoClick = { state.eventSink(MediaViewerEvent.OpenInfo(currentData)) }, @@ -461,6 +464,7 @@ private fun MediaViewerTopBar( canShowInfo: Boolean, onBackClick: () -> Unit, onShareClick: () -> Unit, + onSaveClick: () -> Unit, onInfoClick: () -> Unit, eventSink: (MediaViewerEvent) -> Unit, ) { @@ -527,6 +531,15 @@ private fun MediaViewerTopBar( contentDescription = stringResource(id = CommonStrings.action_share), ) } + IconButton( + onClick = onSaveClick, + enabled = actionsEnabled, + ) { + Icon( + imageVector = CompoundIcons.Download(), + contentDescription = stringResource(id = CommonStrings.action_save), + ) + } if (canShowInfo) { IconButton( onClick = onInfoClick, diff --git a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerViewTest.kt b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerViewTest.kt index 34c67683cd..1522f5d5c1 100644 --- a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerViewTest.kt +++ b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerViewTest.kt @@ -98,6 +98,18 @@ class MediaViewerViewTest { ) } + @Test + fun `clicking on top action save emits expected Event`() { + val data = aMediaViewerPageData( + downloadedMedia = AsyncData.Success(aLocalMedia(uri = mockMediaUrl)), + ) + testMenuAction( + data, + CommonStrings.action_save, + MediaViewerEvent.SaveOnDisk(data), + ) + } + private fun testMenuAction( data: MediaViewerPageData.MediaViewerData, contentDescriptionRes: Int, From a0632b216c316dc0f9ee23678e760cde52627df1 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 21 Apr 2026 16:35:52 +0200 Subject: [PATCH 04/22] MediaDetailsBottomSheet: update wording and dividers. --- .../impl/details/MediaDetailsBottomSheet.kt | 9 +++++++-- .../mediaviewer/impl/viewer/MediaViewerView.kt | 5 ++++- .../impl/details/MediaDetailsBottomSheetTest.kt | 10 +++++----- .../mediaviewer/impl/viewer/MediaViewerViewTest.kt | 8 ++++---- libraries/ui-strings/src/main/res/values/localazy.xml | 1 + 5 files changed, 21 insertions(+), 12 deletions(-) diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDetailsBottomSheet.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDetailsBottomSheet.kt index e25f2ffde1..0e1e3a04c0 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDetailsBottomSheet.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDetailsBottomSheet.kt @@ -46,6 +46,9 @@ import io.element.android.libraries.mediaviewer.api.MediaInfo import io.element.android.libraries.mediaviewer.impl.R import io.element.android.libraries.ui.strings.CommonStrings +/** + * Ref: https://www.figma.com/design/pDlJZGBsri47FNTXMnEdXB/Compound-Android-Templates?node-id=2229-149220 + */ @OptIn(ExperimentalMaterial3Api::class) @Composable fun MediaDetailsBottomSheet( @@ -99,6 +102,7 @@ fun MediaDetailsBottomSheet( onViewInTimeline(state.eventId) } ) + HorizontalDivider() ListItem( leadingContent = ListItemContent.Icon(IconSource.Vector(CompoundIcons.ShareAndroid())), headlineContent = { Text(stringResource(CommonStrings.action_share)) }, @@ -115,9 +119,10 @@ fun MediaDetailsBottomSheet( onForward(state.eventId) } ) + HorizontalDivider() ListItem( leadingContent = ListItemContent.Icon(IconSource.Vector(CompoundIcons.Download())), - headlineContent = { Text(stringResource(CommonStrings.action_save)) }, + headlineContent = { Text(stringResource(CommonStrings.action_download)) }, style = ListItemStyle.Primary, onClick = { onDownload(state.eventId) @@ -127,7 +132,7 @@ fun MediaDetailsBottomSheet( HorizontalDivider() ListItem( leadingContent = ListItemContent.Icon(IconSource.Vector(CompoundIcons.Delete())), - headlineContent = { Text(stringResource(CommonStrings.action_remove)) }, + headlineContent = { Text(stringResource(CommonStrings.action_delete)) }, style = ListItemStyle.Destructive, onClick = { onDelete(state.eventId) diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerView.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerView.kt index ee7a235390..6b62a04d0f 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerView.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerView.kt @@ -101,6 +101,9 @@ import me.saket.telephoto.zoomable.rememberZoomableState val topAppBarHeight = 88.dp +/** + * Ref: https://www.figma.com/design/pDlJZGBsri47FNTXMnEdXB/Compound-Android-Templates?node-id=3361-16623 + */ @Composable fun MediaViewerView( state: MediaViewerState, @@ -537,7 +540,7 @@ private fun MediaViewerTopBar( ) { Icon( imageVector = CompoundIcons.Download(), - contentDescription = stringResource(id = CommonStrings.action_save), + contentDescription = stringResource(id = CommonStrings.action_download), ) } if (canShowInfo) { diff --git a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDetailsBottomSheetTest.kt b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDetailsBottomSheetTest.kt index 580cd89c72..74bc1bd648 100644 --- a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDetailsBottomSheetTest.kt +++ b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDetailsBottomSheetTest.kt @@ -72,28 +72,28 @@ class MediaDetailsBottomSheetTest { @Test @Config(qualifiers = "h1024dp") - fun `clicking on Save invokes expected callback`() { + fun `clicking on Download invokes expected callback`() { val state = aMediaDetailsBottomSheetState() ensureCalledOnceWithParam(state.eventId) { callback -> rule.setMediaDetailsBottomSheet( state = state, onDownload = callback, ) - rule.clickOn(CommonStrings.action_save) + rule.clickOn(CommonStrings.action_download) } } @Config(qualifiers = "h1024dp") @Test - fun `clicking on Remove invokes expected callback`() { + fun `clicking on Delete invokes expected callback`() { val state = aMediaDetailsBottomSheetState() ensureCalledOnceWithParam(state.eventId) { callback -> rule.setMediaDetailsBottomSheet( state = state, onDelete = callback, ) - rule.onNodeWithText(rule.activity.getString(CommonStrings.action_remove)).assertExists() - rule.clickOn(CommonStrings.action_remove) + rule.onNodeWithText(rule.activity.getString(CommonStrings.action_delete)).assertExists() + rule.clickOn(CommonStrings.action_delete) } } diff --git a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerViewTest.kt b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerViewTest.kt index 1522f5d5c1..d41841a9f0 100644 --- a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerViewTest.kt +++ b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerViewTest.kt @@ -99,13 +99,13 @@ class MediaViewerViewTest { } @Test - fun `clicking on top action save emits expected Event`() { + fun `clicking on top action download emits expected Event`() { val data = aMediaViewerPageData( downloadedMedia = AsyncData.Success(aLocalMedia(uri = mockMediaUrl)), ) testMenuAction( data, - CommonStrings.action_save, + CommonStrings.action_download, MediaViewerEvent.SaveOnDisk(data), ) } @@ -135,11 +135,11 @@ class MediaViewerViewTest { @Test @Config(qualifiers = "h1024dp") - fun `clicking on save emit expected Event`() { + fun `clicking on download emit expected Event`() { val data = aMediaViewerPageData() testBottomSheetAction( data, - CommonStrings.action_save, + CommonStrings.action_download, MediaViewerEvent.SaveOnDisk(data), ) } diff --git a/libraries/ui-strings/src/main/res/values/localazy.xml b/libraries/ui-strings/src/main/res/values/localazy.xml index a8a7b90dee..28b28e814a 100644 --- a/libraries/ui-strings/src/main/res/values/localazy.xml +++ b/libraries/ui-strings/src/main/res/values/localazy.xml @@ -96,6 +96,7 @@ "Discard" "Dismiss" "Done" + "Download" "Edit" "Edit caption" "Edit poll" From 83b4bfad96039923cae6caea86499778ad192766 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 21 Apr 2026 17:22:22 +0200 Subject: [PATCH 05/22] Move "Open with" action to bottom sheet --- .../impl/details/MediaDetailsBottomSheet.kt | 23 +++++++++++ .../impl/gallery/MediaGalleryEvents.kt | 1 + .../impl/gallery/MediaGalleryPresenter.kt | 17 +++++++++ .../impl/gallery/MediaGalleryView.kt | 3 ++ .../impl/viewer/MediaViewerView.kt | 27 +++---------- .../details/MediaDetailsBottomSheetTest.kt | 2 + .../impl/viewer/MediaViewerViewTest.kt | 38 +++++++++---------- 7 files changed, 70 insertions(+), 41 deletions(-) diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDetailsBottomSheet.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDetailsBottomSheet.kt index 0e1e3a04c0..fc377e5cae 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDetailsBottomSheet.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDetailsBottomSheet.kt @@ -28,6 +28,7 @@ import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import io.element.android.compound.theme.ElementTheme import io.element.android.compound.tokens.generated.CompoundIcons +import io.element.android.libraries.core.mimetype.MimeTypes import io.element.android.libraries.designsystem.colors.AvatarColorsProvider import io.element.android.libraries.designsystem.components.avatar.Avatar import io.element.android.libraries.designsystem.components.avatar.AvatarData @@ -57,6 +58,7 @@ fun MediaDetailsBottomSheet( onShare: (EventId) -> Unit, onForward: (EventId) -> Unit, onDownload: (EventId) -> Unit, + onOpenWith: (EventId) -> Unit, onDelete: (EventId) -> Unit, onDismiss: () -> Unit, modifier: Modifier = Modifier, @@ -128,6 +130,26 @@ fun MediaDetailsBottomSheet( onDownload(state.eventId) } ) + val mimeType = state.mediaInfo.mimeType + val icon = when (mimeType) { + MimeTypes.Apk -> + ListItemContent.Icon(IconSource.Resource(R.drawable.ic_apk_install)) + else -> + ListItemContent.Icon(IconSource.Vector(CompoundIcons.PopOut())) + } + val wording = when (mimeType) { + MimeTypes.Apk -> stringResource(id = CommonStrings.common_install_apk_android) + else -> stringResource(id = CommonStrings.action_open_with) + } + HorizontalDivider() + ListItem( + leadingContent = icon, + headlineContent = { Text(wording) }, + style = ListItemStyle.Primary, + onClick = { + onOpenWith(state.eventId) + } + ) if (state.canDelete) { HorizontalDivider() ListItem( @@ -236,6 +258,7 @@ internal fun MediaDetailsBottomSheetPreview() = ElementPreview { onShare = {}, onForward = {}, onDownload = {}, + onOpenWith = {}, onDelete = {}, onDismiss = {}, ) diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryEvents.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryEvents.kt index 2bf4f6b37d..767ca04c31 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryEvents.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryEvents.kt @@ -20,6 +20,7 @@ sealed interface MediaGalleryEvents { data class Share(val eventId: EventId) : MediaGalleryEvents data class Forward(val eventId: EventId) : MediaGalleryEvents data class SaveOnDisk(val eventId: EventId) : MediaGalleryEvents + data class OpenWith(val eventId: EventId) : MediaGalleryEvents data class OpenInfo(val mediaItem: MediaItem.Event) : MediaGalleryEvents data class ViewInTimeline(val eventId: EventId) : MediaGalleryEvents diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryPresenter.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryPresenter.kt index cc26e69c33..2e669fefb2 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryPresenter.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryPresenter.kt @@ -105,6 +105,12 @@ class MediaGalleryPresenter( saveOnDisk(it) } } + is MediaGalleryEvents.OpenWith -> coroutineScope.launch { + mediaBottomSheetState = MediaBottomSheetState.Hidden + groupedMediaItems.dataOrNull().find(event.eventId)?.let { + openWith(it) + } + } is MediaGalleryEvents.Share -> coroutineScope.launch { mediaBottomSheetState = MediaBottomSheetState.Hidden groupedMediaItems.dataOrNull().find(event.eventId)?.let { @@ -200,6 +206,17 @@ class MediaGalleryPresenter( } } + private suspend fun openWith(mediaItem: MediaItem.Event) { + downloadMedia(mediaItem) + .mapCatchingExceptions { localMedia -> + localMediaActions.open(localMedia) + } + .onFailure { + val snackbarMessage = SnackbarMessage(mediaActionsError(it)) + snackbarDispatcher.post(snackbarMessage) + } + } + private fun mediaActionsError(throwable: Throwable): Int { return if (throwable is ActivityNotFoundException) { R.string.error_no_compatible_app_found diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryView.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryView.kt index 6f7a201fdc..fe22376dee 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryView.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryView.kt @@ -173,6 +173,9 @@ fun MediaGalleryView( onDownload = { eventId -> state.eventSink(MediaGalleryEvents.SaveOnDisk(eventId)) }, + onOpenWith = { eventId -> + state.eventSink(MediaGalleryEvents.OpenWith(eventId)) + }, onDelete = { eventId -> state.eventSink( MediaGalleryEvents.ConfirmDelete( diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerView.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerView.kt index 6b62a04d0f..5119198ff4 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerView.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerView.kt @@ -65,7 +65,6 @@ import io.element.android.compound.tokens.generated.CompoundIcons import io.element.android.features.viewfolder.api.TextFileViewer import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.audio.api.AudioFocus -import io.element.android.libraries.core.mimetype.MimeTypes import io.element.android.libraries.core.mimetype.MimeTypes.isMimeTypeVideo import io.element.android.libraries.designsystem.components.async.AsyncFailure import io.element.android.libraries.designsystem.components.async.AsyncLoading @@ -85,7 +84,6 @@ import io.element.android.libraries.matrix.api.media.MediaSource import io.element.android.libraries.matrix.ui.media.MediaRequestData import io.element.android.libraries.mediaviewer.api.MediaInfo import io.element.android.libraries.mediaviewer.api.local.LocalMedia -import io.element.android.libraries.mediaviewer.impl.R import io.element.android.libraries.mediaviewer.impl.details.MediaBottomSheetState import io.element.android.libraries.mediaviewer.impl.details.MediaDeleteConfirmationBottomSheet import io.element.android.libraries.mediaviewer.impl.details.MediaDetailsBottomSheet @@ -226,7 +224,6 @@ fun MediaViewerView( onInfoClick = { state.eventSink(MediaViewerEvent.OpenInfo(currentData)) }, - eventSink = state.eventSink ) } else -> { @@ -275,6 +272,11 @@ fun MediaViewerView( state.eventSink(MediaViewerEvent.SaveOnDisk(currentData)) } }, + onOpenWith = { + (currentData as? MediaViewerPageData.MediaViewerData)?.let { + state.eventSink(MediaViewerEvent.OpenWith(currentData)) + } + }, onDelete = { eventId -> (currentData as? MediaViewerPageData.MediaViewerData)?.let { state.eventSink( @@ -469,11 +471,9 @@ private fun MediaViewerTopBar( onShareClick: () -> Unit, onSaveClick: () -> Unit, onInfoClick: () -> Unit, - eventSink: (MediaViewerEvent) -> Unit, ) { val downloadedMedia by data.downloadedMedia val actionsEnabled = downloadedMedia.isSuccess() - val mimeType = data.mediaInfo.mimeType val senderName = data.mediaInfo.senderName val dateSent = data.mediaInfo.dateSent TopAppBar( @@ -508,23 +508,6 @@ private fun MediaViewerTopBar( ), navigationIcon = { BackButton(onClick = onBackClick) }, actions = { - IconButton( - enabled = actionsEnabled, - onClick = { - eventSink(MediaViewerEvent.OpenWith(data)) - }, - ) { - when (mimeType) { - MimeTypes.Apk -> Icon( - resourceId = R.drawable.ic_apk_install, - contentDescription = stringResource(id = CommonStrings.common_install_apk_android) - ) - else -> Icon( - imageVector = CompoundIcons.PopOut(), - contentDescription = stringResource(id = CommonStrings.action_open_with) - ) - } - } IconButton( onClick = onShareClick, enabled = actionsEnabled, diff --git a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDetailsBottomSheetTest.kt b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDetailsBottomSheetTest.kt index 74bc1bd648..b6b8b68466 100644 --- a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDetailsBottomSheetTest.kt +++ b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDetailsBottomSheetTest.kt @@ -116,6 +116,7 @@ private fun AndroidComposeTestRule.setMedia onShare: (EventId) -> Unit = EnsureNeverCalledWithParam(), onForward: (EventId) -> Unit = EnsureNeverCalledWithParam(), onDownload: (EventId) -> Unit = EnsureNeverCalledWithParam(), + onOpenWith: (EventId) -> Unit = EnsureNeverCalledWithParam(), onDelete: (EventId) -> Unit = EnsureNeverCalledWithParam(), onDismiss: () -> Unit = EnsureNeverCalled(), ) { @@ -126,6 +127,7 @@ private fun AndroidComposeTestRule.setMedia onShare = onShare, onForward = onForward, onDownload = onDownload, + onOpenWith = onOpenWith, onDelete = onDelete, onDismiss = onDismiss, ) diff --git a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerViewTest.kt b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerViewTest.kt index d41841a9f0..e5eb07b871 100644 --- a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerViewTest.kt +++ b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerViewTest.kt @@ -10,6 +10,7 @@ package io.element.android.libraries.mediaviewer.impl.viewer import android.net.Uri import androidx.activity.ComponentActivity +import androidx.annotation.StringRes import androidx.compose.ui.test.assertHasClickAction import androidx.compose.ui.test.junit4.AndroidComposeTestRule import androidx.compose.ui.test.junit4.createAndroidComposeRule @@ -63,19 +64,7 @@ class MediaViewerViewTest { } @Test - fun `clicking on open emit expected Event`() { - val data = aMediaViewerPageData( - downloadedMedia = AsyncData.Success(aLocalMedia(uri = mockMediaUrl)), - ) - testMenuAction( - data, - CommonStrings.action_open_with, - MediaViewerEvent.OpenWith(data), - ) - } - - @Test - fun `clicking on info emit expected Event`() { + fun `clicking on info emits expected Event`() { val data = aMediaViewerPageData( downloadedMedia = AsyncData.Success(aLocalMedia(uri = mockMediaUrl)), ) @@ -112,7 +101,7 @@ class MediaViewerViewTest { private fun testMenuAction( data: MediaViewerPageData.MediaViewerData, - contentDescriptionRes: Int, + @StringRes contentDescriptionRes: Int, expectedEvent: MediaViewerEvent, ) { val eventsRecorder = EventsRecorder() @@ -135,7 +124,7 @@ class MediaViewerViewTest { @Test @Config(qualifiers = "h1024dp") - fun `clicking on download emit expected Event`() { + fun `clicking on download emits expected Event`() { val data = aMediaViewerPageData() testBottomSheetAction( data, @@ -146,7 +135,7 @@ class MediaViewerViewTest { @Test @Config(qualifiers = "h1024dp") - fun `clicking on share emit expected Event`() { + fun `clicking on share emits expected Event`() { val data = aMediaViewerPageData() testBottomSheetAction( data, @@ -155,9 +144,20 @@ class MediaViewerViewTest { ) } + @Config(qualifiers = "h1024dp") + @Test + fun `clicking on open in emits expected Event`() { + val data = aMediaViewerPageData() + testBottomSheetAction( + data, + CommonStrings.action_open_with, + MediaViewerEvent.OpenWith(data), + ) + } + private fun testBottomSheetAction( data: MediaViewerPageData.MediaViewerData, - contentDescriptionRes: Int, + @StringRes textRes: Int, expectedEvent: MediaViewerEvent, ) { val eventsRecorder = EventsRecorder() @@ -168,7 +168,7 @@ class MediaViewerViewTest { eventSink = eventsRecorder ), ) - rule.clickOn(contentDescriptionRes) + rule.clickOn(textRes) eventsRecorder.assertList( listOf( MediaViewerEvent.OnNavigateTo(0), @@ -188,7 +188,7 @@ class MediaViewerViewTest { state = state, ) // Ensure that the action are visible - val contentDescription = rule.activity.getString(CommonStrings.action_open_with) + val contentDescription = rule.activity.getString(CommonStrings.action_share) rule.onNodeWithContentDescription(contentDescription) .assertExists() .assertHasClickAction() From 1e39736797b92c1d036ebc432799ed364e628d72 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 22 Apr 2026 11:01:36 +0200 Subject: [PATCH 06/22] `MediaGalleryEvents` -> `MediaGalleryEvent` --- ...aGalleryEvents.kt => MediaGalleryEvent.kt} | 24 +++++----- .../impl/gallery/MediaGalleryPresenter.kt | 24 +++++----- .../impl/gallery/MediaGalleryState.kt | 2 +- .../impl/gallery/MediaGalleryView.kt | 44 +++++++++---------- .../impl/gallery/MediaGalleryPresenterTest.kt | 40 ++++++++--------- 5 files changed, 67 insertions(+), 67 deletions(-) rename libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/{MediaGalleryEvents.kt => MediaGalleryEvent.kt} (79%) diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryEvents.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryEvent.kt similarity index 79% rename from libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryEvents.kt rename to libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryEvent.kt index 767ca04c31..219d5dbfb4 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryEvents.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryEvent.kt @@ -14,22 +14,22 @@ import io.element.android.libraries.matrix.api.timeline.Timeline import io.element.android.libraries.mediaviewer.api.MediaInfo import io.element.android.libraries.mediaviewer.impl.model.MediaItem -sealed interface MediaGalleryEvents { - data class ChangeMode(val mode: MediaGalleryMode) : MediaGalleryEvents - data class LoadMore(val direction: Timeline.PaginationDirection) : MediaGalleryEvents - data class Share(val eventId: EventId) : MediaGalleryEvents - data class Forward(val eventId: EventId) : MediaGalleryEvents - data class SaveOnDisk(val eventId: EventId) : MediaGalleryEvents - data class OpenWith(val eventId: EventId) : MediaGalleryEvents - data class OpenInfo(val mediaItem: MediaItem.Event) : MediaGalleryEvents - data class ViewInTimeline(val eventId: EventId) : MediaGalleryEvents +sealed interface MediaGalleryEvent { + data class ChangeMode(val mode: MediaGalleryMode) : MediaGalleryEvent + data class LoadMore(val direction: Timeline.PaginationDirection) : MediaGalleryEvent + data class Share(val eventId: EventId) : MediaGalleryEvent + data class Forward(val eventId: EventId) : MediaGalleryEvent + data class SaveOnDisk(val eventId: EventId) : MediaGalleryEvent + data class OpenWith(val eventId: EventId) : MediaGalleryEvent + data class OpenInfo(val mediaItem: MediaItem.Event) : MediaGalleryEvent + data class ViewInTimeline(val eventId: EventId) : MediaGalleryEvent data class ConfirmDelete( val eventId: EventId, val mediaInfo: MediaInfo, val thumbnailSource: MediaSource?, - ) : MediaGalleryEvents + ) : MediaGalleryEvent - data object CloseBottomSheet : MediaGalleryEvents - data class Delete(val eventId: EventId) : MediaGalleryEvents + data object CloseBottomSheet : MediaGalleryEvent + data class Delete(val eventId: EventId) : MediaGalleryEvent } diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryPresenter.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryPresenter.kt index 2e669fefb2..e56267e291 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryPresenter.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryPresenter.kt @@ -88,44 +88,44 @@ class MediaGalleryPresenter( val snackbarMessage by snackbarDispatcher.collectSnackbarMessageAsState() localMediaActions.Configure() - fun handleEvent(event: MediaGalleryEvents) { + fun handleEvent(event: MediaGalleryEvent) { when (event) { - is MediaGalleryEvents.ChangeMode -> { + is MediaGalleryEvent.ChangeMode -> { mode = event.mode } - is MediaGalleryEvents.LoadMore -> coroutineScope.launch { + is MediaGalleryEvent.LoadMore -> coroutineScope.launch { mediaGalleryDataSource.loadMore(event.direction) } - is MediaGalleryEvents.Delete -> coroutineScope.launch { + is MediaGalleryEvent.Delete -> coroutineScope.launch { mediaGalleryDataSource.deleteItem(event.eventId) } - is MediaGalleryEvents.SaveOnDisk -> coroutineScope.launch { + is MediaGalleryEvent.SaveOnDisk -> coroutineScope.launch { mediaBottomSheetState = MediaBottomSheetState.Hidden groupedMediaItems.dataOrNull().find(event.eventId)?.let { saveOnDisk(it) } } - is MediaGalleryEvents.OpenWith -> coroutineScope.launch { + is MediaGalleryEvent.OpenWith -> coroutineScope.launch { mediaBottomSheetState = MediaBottomSheetState.Hidden groupedMediaItems.dataOrNull().find(event.eventId)?.let { openWith(it) } } - is MediaGalleryEvents.Share -> coroutineScope.launch { + is MediaGalleryEvent.Share -> coroutineScope.launch { mediaBottomSheetState = MediaBottomSheetState.Hidden groupedMediaItems.dataOrNull().find(event.eventId)?.let { share(it) } } - is MediaGalleryEvents.Forward -> { + is MediaGalleryEvent.Forward -> { mediaBottomSheetState = MediaBottomSheetState.Hidden navigator.onForwardClick(event.eventId) } - is MediaGalleryEvents.ViewInTimeline -> { + is MediaGalleryEvent.ViewInTimeline -> { mediaBottomSheetState = MediaBottomSheetState.Hidden navigator.onViewInTimelineClick(event.eventId) } - is MediaGalleryEvents.OpenInfo -> coroutineScope.launch { + is MediaGalleryEvent.OpenInfo -> coroutineScope.launch { mediaBottomSheetState = MediaBottomSheetState.MediaDetailsBottomSheetState( eventId = event.mediaItem.eventId(), canDelete = when (event.mediaItem.mediaInfo().senderId) { @@ -143,14 +143,14 @@ class MediaGalleryPresenter( }, ) } - is MediaGalleryEvents.ConfirmDelete -> { + is MediaGalleryEvent.ConfirmDelete -> { mediaBottomSheetState = MediaBottomSheetState.MediaDeleteConfirmationState( eventId = event.eventId, mediaInfo = event.mediaInfo, thumbnailSource = event.thumbnailSource, ) } - MediaGalleryEvents.CloseBottomSheet -> { + MediaGalleryEvent.CloseBottomSheet -> { mediaBottomSheetState = MediaBottomSheetState.Hidden } } diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryState.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryState.kt index 897e5d1e97..5dcb487632 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryState.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryState.kt @@ -20,7 +20,7 @@ data class MediaGalleryState( val groupedMediaItems: AsyncData, val mediaBottomSheetState: MediaBottomSheetState, val snackbarMessage: SnackbarMessage?, - val eventSink: (MediaGalleryEvents) -> Unit, + val eventSink: (MediaGalleryEvent) -> Unit, ) enum class MediaGalleryMode(val stringResource: Int) { diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryView.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryView.kt index fe22376dee..be4faa6941 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryView.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryView.kt @@ -132,7 +132,7 @@ fun MediaGalleryView( index = mode.ordinal, count = MediaGalleryMode.entries.size, selected = state.mode == mode, - onClick = { state.eventSink(MediaGalleryEvents.ChangeMode(mode)) }, + onClick = { state.eventSink(MediaGalleryEvent.ChangeMode(mode)) }, text = stringResource(mode.stringResource), ) } @@ -162,23 +162,23 @@ fun MediaGalleryView( MediaDetailsBottomSheet( state = bottomSheetState, onViewInTimeline = { eventId -> - state.eventSink(MediaGalleryEvents.ViewInTimeline(eventId)) + state.eventSink(MediaGalleryEvent.ViewInTimeline(eventId)) }, onShare = { eventId -> - state.eventSink(MediaGalleryEvents.Share(eventId)) + state.eventSink(MediaGalleryEvent.Share(eventId)) }, onForward = { eventId -> - state.eventSink(MediaGalleryEvents.Forward(eventId)) + state.eventSink(MediaGalleryEvent.Forward(eventId)) }, onDownload = { eventId -> - state.eventSink(MediaGalleryEvents.SaveOnDisk(eventId)) + state.eventSink(MediaGalleryEvent.SaveOnDisk(eventId)) }, onOpenWith = { eventId -> - state.eventSink(MediaGalleryEvents.OpenWith(eventId)) + state.eventSink(MediaGalleryEvent.OpenWith(eventId)) }, onDelete = { eventId -> state.eventSink( - MediaGalleryEvents.ConfirmDelete( + MediaGalleryEvent.ConfirmDelete( eventId = eventId, mediaInfo = bottomSheetState.mediaInfo, thumbnailSource = bottomSheetState.thumbnailSource, @@ -186,7 +186,7 @@ fun MediaGalleryView( ) }, onDismiss = { - state.eventSink(MediaGalleryEvents.CloseBottomSheet) + state.eventSink(MediaGalleryEvent.CloseBottomSheet) }, ) } @@ -194,10 +194,10 @@ fun MediaGalleryView( MediaDeleteConfirmationBottomSheet( state = bottomSheetState, onDelete = { - state.eventSink(MediaGalleryEvents.Delete(it)) + state.eventSink(MediaGalleryEvent.Delete(it)) }, onDismiss = { - state.eventSink(MediaGalleryEvents.CloseBottomSheet) + state.eventSink(MediaGalleryEvent.CloseBottomSheet) }, ) } @@ -216,7 +216,7 @@ private fun MediaGalleryPage( val loadingItem = groupedMediaItems.dataOrNull()?.getItems(mode)?.singleOrNull() as? MediaItem.LoadingIndicator if (loadingItem != null) { LaunchedEffect(loadingItem.timestamp) { - state.eventSink(MediaGalleryEvents.LoadMore(loadingItem.direction)) + state.eventSink(MediaGalleryEvent.LoadMore(loadingItem.direction)) } } LoadingContent(mode) @@ -261,7 +261,7 @@ private fun AsyncData.isLoadingItems(mode: MediaGalleryMode): @Composable private fun MediaGalleryImages( imagesAndVideos: ImmutableList, - eventSink: (MediaGalleryEvents) -> Unit, + eventSink: (MediaGalleryEvent) -> Unit, onItemClick: (MediaItem.Event) -> Unit, ) { if (imagesAndVideos.isEmpty()) { @@ -282,7 +282,7 @@ private fun MediaGalleryImages( @Composable private fun MediaGalleryFiles( files: ImmutableList, - eventSink: (MediaGalleryEvents) -> Unit, + eventSink: (MediaGalleryEvent) -> Unit, onItemClick: (MediaItem.Event) -> Unit, ) { if (files.isEmpty()) { @@ -303,7 +303,7 @@ private fun MediaGalleryFiles( @Composable private fun MediaGalleryFilesList( files: ImmutableList, - eventSink: (MediaGalleryEvents) -> Unit, + eventSink: (MediaGalleryEvent) -> Unit, onItemClick: (MediaItem.Event) -> Unit, ) { val presenterFactories = LocalMediaItemPresenterFactories.current @@ -321,7 +321,7 @@ private fun MediaGalleryFilesList( file = item, onClick = { onItemClick(item) }, onLongClick = { - eventSink(MediaGalleryEvents.OpenInfo(item)) + eventSink(MediaGalleryEvent.OpenInfo(item)) }, ) is MediaItem.Audio -> AudioItemView( @@ -329,7 +329,7 @@ private fun MediaGalleryFilesList( audio = item, onClick = { onItemClick(item) }, onLongClick = { - eventSink(MediaGalleryEvents.OpenInfo(item)) + eventSink(MediaGalleryEvent.OpenInfo(item)) }, ) is MediaItem.Voice -> { @@ -339,7 +339,7 @@ private fun MediaGalleryFilesList( state = presenter.present(), voice = item, onLongClick = { - eventSink(MediaGalleryEvents.OpenInfo(item)) + eventSink(MediaGalleryEvent.OpenInfo(item)) }, ) } @@ -364,7 +364,7 @@ private fun MediaGalleryFilesList( @Composable private fun MediaGalleryImageGrid( imagesAndVideos: ImmutableList, - eventSink: (MediaGalleryEvents) -> Unit, + eventSink: (MediaGalleryEvent) -> Unit, onItemClick: (MediaItem.Event) -> Unit, ) { LazyVerticalGrid( @@ -406,7 +406,7 @@ private fun MediaGalleryImageGrid( image = item, onClick = { onItemClick(item) }, onLongClick = { - eventSink(MediaGalleryEvents.OpenInfo(item)) + eventSink(MediaGalleryEvent.OpenInfo(item)) }, ) is MediaItem.Video -> VideoItemView( @@ -414,7 +414,7 @@ private fun MediaGalleryImageGrid( video = item, onClick = { onItemClick(item) }, onLongClick = { - eventSink(MediaGalleryEvents.OpenInfo(item)) + eventSink(MediaGalleryEvent.OpenInfo(item)) }, ) is MediaItem.LoadingIndicator -> LoadingMoreIndicator( @@ -430,7 +430,7 @@ private fun MediaGalleryImageGrid( @Composable private fun LoadingMoreIndicator( item: MediaItem.LoadingIndicator, - eventSink: (MediaGalleryEvents) -> Unit, + eventSink: (MediaGalleryEvent) -> Unit, modifier: Modifier = Modifier ) { Box( @@ -455,7 +455,7 @@ private fun LoadingMoreIndicator( } val latestEventSink by rememberUpdatedState(eventSink) LaunchedEffect(item.timestamp) { - latestEventSink(MediaGalleryEvents.LoadMore(item.direction)) + latestEventSink(MediaGalleryEvent.LoadMore(item.direction)) } } } diff --git a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryPresenterTest.kt b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryPresenterTest.kt index 3069a4fd9d..9f1ad0e4a2 100644 --- a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryPresenterTest.kt +++ b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryPresenterTest.kt @@ -84,10 +84,10 @@ class MediaGalleryPresenterTest { presenter.test { val initialState = awaitFirstItem() assertThat(initialState.mode).isEqualTo(MediaGalleryMode.Images) - initialState.eventSink(MediaGalleryEvents.ChangeMode(MediaGalleryMode.Files)) + initialState.eventSink(MediaGalleryEvent.ChangeMode(MediaGalleryMode.Files)) val state = awaitItem() assertThat(state.mode).isEqualTo(MediaGalleryMode.Files) - state.eventSink(MediaGalleryEvents.ChangeMode(MediaGalleryMode.Images)) + state.eventSink(MediaGalleryEvent.ChangeMode(MediaGalleryMode.Images)) val imageModeState = awaitItem() assertThat(imageModeState.mode).isEqualTo(MediaGalleryMode.Images) } @@ -123,7 +123,7 @@ class MediaGalleryPresenterTest { eventId = AN_EVENT_ID, senderId = A_USER_ID, ) - initialState.eventSink(MediaGalleryEvents.OpenInfo(item)) + initialState.eventSink(MediaGalleryEvent.OpenInfo(item)) val state = awaitItem() assertThat(state.mediaBottomSheetState).isEqualTo( MediaBottomSheetState.MediaDetailsBottomSheetState( @@ -134,7 +134,7 @@ class MediaGalleryPresenterTest { ) ) // Close the bottom sheet - state.eventSink(MediaGalleryEvents.CloseBottomSheet) + state.eventSink(MediaGalleryEvent.CloseBottomSheet) val closedState = awaitItem() assertThat(closedState.mediaBottomSheetState).isEqualTo(MediaBottomSheetState.Hidden) } @@ -170,7 +170,7 @@ class MediaGalleryPresenterTest { eventId = AN_EVENT_ID, senderId = A_USER_ID_2, ) - initialState.eventSink(MediaGalleryEvents.OpenInfo(item)) + initialState.eventSink(MediaGalleryEvent.OpenInfo(item)) val state = awaitItem() assertThat(state.mediaBottomSheetState).isEqualTo( MediaBottomSheetState.MediaDetailsBottomSheetState( @@ -181,7 +181,7 @@ class MediaGalleryPresenterTest { ) ) // Close the bottom sheet - state.eventSink(MediaGalleryEvents.CloseBottomSheet) + state.eventSink(MediaGalleryEvent.CloseBottomSheet) val closedState = awaitItem() assertThat(closedState.mediaBottomSheetState).isEqualTo(MediaBottomSheetState.Hidden) } @@ -199,7 +199,7 @@ class MediaGalleryPresenterTest { val initialState = awaitFirstItem() // Delete bottom sheet val item = aMediaItemImage() - initialState.eventSink(MediaGalleryEvents.ConfirmDelete(AN_EVENT_ID, item.mediaInfo, item.thumbnailSource)) + initialState.eventSink(MediaGalleryEvent.ConfirmDelete(AN_EVENT_ID, item.mediaInfo, item.thumbnailSource)) val deleteState = awaitItem() assertThat(deleteState.mediaBottomSheetState).isEqualTo( MediaBottomSheetState.MediaDeleteConfirmationState( @@ -209,7 +209,7 @@ class MediaGalleryPresenterTest { ) ) // Close the bottom sheet - deleteState.eventSink(MediaGalleryEvents.CloseBottomSheet) + deleteState.eventSink(MediaGalleryEvent.CloseBottomSheet) val deleteClosedState = awaitItem() assertThat(deleteClosedState.mediaBottomSheetState).isEqualTo(MediaBottomSheetState.Hidden) } @@ -226,7 +226,7 @@ class MediaGalleryPresenterTest { ) presenter.test { val initialState = awaitFirstItem() - initialState.eventSink(MediaGalleryEvents.Delete(AN_EVENT_ID)) + initialState.eventSink(MediaGalleryEvent.Delete(AN_EVENT_ID)) deleteItemLambda.assertions().isCalledOnce().with(value(AN_EVENT_ID)) } } @@ -236,7 +236,7 @@ class MediaGalleryPresenterTest { val presenter = createMediaGalleryPresenter() presenter.test { val initialState = awaitFirstItem() - initialState.eventSink(MediaGalleryEvents.Share(AN_EVENT_ID)) + initialState.eventSink(MediaGalleryEvent.Share(AN_EVENT_ID)) } } @@ -258,7 +258,7 @@ class MediaGalleryPresenterTest { ) presenter.test { val initialState = awaitFirstItem() - initialState.eventSink(MediaGalleryEvents.Share(AN_EVENT_ID)) + initialState.eventSink(MediaGalleryEvent.Share(AN_EVENT_ID)) val finalState = awaitItem() assertThat(finalState.snackbarMessage).isNull() } @@ -283,7 +283,7 @@ class MediaGalleryPresenterTest { ) presenter.test { val initialState = awaitFirstItem() - initialState.eventSink(MediaGalleryEvents.Share(AN_EVENT_ID)) + initialState.eventSink(MediaGalleryEvent.Share(AN_EVENT_ID)) skipItems(1) val finalState = awaitItem() assertThat(finalState.snackbarMessage).isInstanceOf(SnackbarMessage::class.java) @@ -295,7 +295,7 @@ class MediaGalleryPresenterTest { val presenter = createMediaGalleryPresenter() presenter.test { val initialState = awaitFirstItem() - initialState.eventSink(MediaGalleryEvents.SaveOnDisk(AN_EVENT_ID)) + initialState.eventSink(MediaGalleryEvent.SaveOnDisk(AN_EVENT_ID)) } } @@ -317,7 +317,7 @@ class MediaGalleryPresenterTest { ) presenter.test { val initialState = awaitFirstItem() - initialState.eventSink(MediaGalleryEvents.SaveOnDisk(AN_EVENT_ID)) + initialState.eventSink(MediaGalleryEvent.SaveOnDisk(AN_EVENT_ID)) skipItems(1) val finalState = awaitItem() assertThat(finalState.snackbarMessage?.messageResId).isEqualTo(CommonStrings.common_file_saved_on_disk_android) @@ -343,7 +343,7 @@ class MediaGalleryPresenterTest { ) presenter.test { val initialState = awaitFirstItem() - initialState.eventSink(MediaGalleryEvents.SaveOnDisk(AN_EVENT_ID)) + initialState.eventSink(MediaGalleryEvent.SaveOnDisk(AN_EVENT_ID)) skipItems(1) val finalState = awaitItem() assertThat(finalState.snackbarMessage).isInstanceOf(SnackbarMessage::class.java) @@ -373,10 +373,10 @@ class MediaGalleryPresenterTest { eventId = AN_EVENT_ID, senderId = A_USER_ID, ) - initialState.eventSink(MediaGalleryEvents.OpenInfo(item)) + initialState.eventSink(MediaGalleryEvent.OpenInfo(item)) val withBottomSheetState = awaitItem() assertThat(withBottomSheetState.mediaBottomSheetState).isInstanceOf(MediaBottomSheetState.MediaDetailsBottomSheetState::class.java) - withBottomSheetState.eventSink(MediaGalleryEvents.ViewInTimeline(AN_EVENT_ID)) + withBottomSheetState.eventSink(MediaGalleryEvent.ViewInTimeline(AN_EVENT_ID)) val finalState = awaitItem() assertThat(finalState.mediaBottomSheetState).isEqualTo(MediaBottomSheetState.Hidden) onViewInTimelineClickLambda.assertions().isCalledOnce().with(value(AN_EVENT_ID)) @@ -406,10 +406,10 @@ class MediaGalleryPresenterTest { eventId = AN_EVENT_ID, senderId = A_USER_ID, ) - initialState.eventSink(MediaGalleryEvents.OpenInfo(item)) + initialState.eventSink(MediaGalleryEvent.OpenInfo(item)) val withBottomSheetState = awaitItem() assertThat(withBottomSheetState.mediaBottomSheetState).isInstanceOf(MediaBottomSheetState.MediaDetailsBottomSheetState::class.java) - withBottomSheetState.eventSink(MediaGalleryEvents.Forward(AN_EVENT_ID)) + withBottomSheetState.eventSink(MediaGalleryEvent.Forward(AN_EVENT_ID)) val finalState = awaitItem() assertThat(finalState.mediaBottomSheetState).isEqualTo(MediaBottomSheetState.Hidden) onForwardClickLambda.assertions().isCalledOnce().with(value(AN_EVENT_ID)) @@ -427,7 +427,7 @@ class MediaGalleryPresenterTest { ) presenter.test { val initialState = awaitFirstItem() - initialState.eventSink(MediaGalleryEvents.LoadMore(Timeline.PaginationDirection.BACKWARDS)) + initialState.eventSink(MediaGalleryEvent.LoadMore(Timeline.PaginationDirection.BACKWARDS)) loadMoreLambda.assertions().isCalledOnce().with(value(Timeline.PaginationDirection.BACKWARDS)) } } From 630b0c8098b4e00e9990d00283333a47793d75e1 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 22 Apr 2026 12:07:56 +0200 Subject: [PATCH 07/22] Improve and add test --- .../impl/gallery/MediaGalleryPresenterTest.kt | 78 ++++++++++++++++++- .../mediaviewer/test/FakeLocalMediaActions.kt | 30 +++---- 2 files changed, 88 insertions(+), 20 deletions(-) diff --git a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryPresenterTest.kt b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryPresenterTest.kt index 9f1ad0e4a2..6dd58a6086 100644 --- a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryPresenterTest.kt +++ b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryPresenterTest.kt @@ -6,6 +6,8 @@ * Please see LICENSE files in the repository root for full details. */ +@file:OptIn(ExperimentalCoroutinesApi::class) + package io.element.android.libraries.mediaviewer.impl.gallery import android.net.Uri @@ -27,6 +29,7 @@ import io.element.android.libraries.matrix.test.room.FakeJoinedRoom import io.element.android.libraries.matrix.test.room.aRoomInfo import io.element.android.libraries.matrix.test.room.powerlevels.FakeRoomPermissions import io.element.android.libraries.matrix.test.timeline.FakeTimeline +import io.element.android.libraries.mediaviewer.api.local.LocalMedia import io.element.android.libraries.mediaviewer.impl.datasource.FakeMediaGalleryDataSource import io.element.android.libraries.mediaviewer.impl.datasource.MediaGalleryDataSource import io.element.android.libraries.mediaviewer.impl.details.MediaBottomSheetState @@ -39,6 +42,8 @@ import io.element.android.tests.testutils.lambda.lambdaRecorder import io.element.android.tests.testutils.lambda.value import io.element.android.tests.testutils.test import io.mockk.mockk +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.advanceUntilIdle import kotlinx.coroutines.test.runTest import org.junit.Rule import org.junit.Test @@ -52,8 +57,12 @@ class MediaGalleryPresenterTest { @Test fun `present - initial state`() = runTest { + val configureLambda = lambdaRecorder { } val startLambda = lambdaRecorder { } val presenter = createMediaGalleryPresenter( + localMediaActions = FakeLocalMediaActions( + configureResult = configureLambda, + ), mediaGalleryDataSource = FakeMediaGalleryDataSource( startLambda = startLambda, ), @@ -70,6 +79,7 @@ class MediaGalleryPresenterTest { assertThat(initialState.groupedMediaItems.isUninitialized()).isTrue() assertThat(initialState.snackbarMessage).isNull() } + configureLambda.assertions().isCalledOnce() startLambda.assertions().isCalledOnce() } @@ -304,15 +314,20 @@ class MediaGalleryPresenterTest { val mediaGalleryDataSource = FakeMediaGalleryDataSource( startLambda = { }, ) + val saveOnDiskResult = lambdaRecorder> { _ -> Result.success(Unit) } + val media = aMediaItemImage(eventId = AN_EVENT_ID) mediaGalleryDataSource.emitGroupedMediaItems( AsyncData.Success( aGroupedMediaItems( - imageAndVideoItems = listOf(aMediaItemImage(eventId = AN_EVENT_ID)), + imageAndVideoItems = listOf(media), fileItems = emptyList(), ) ) ) val presenter = createMediaGalleryPresenter( + localMediaActions = FakeLocalMediaActions( + saveOnDiskResult = saveOnDiskResult, + ), mediaGalleryDataSource = mediaGalleryDataSource, ) presenter.test { @@ -321,6 +336,67 @@ class MediaGalleryPresenterTest { skipItems(1) val finalState = awaitItem() assertThat(finalState.snackbarMessage?.messageResId).isEqualTo(CommonStrings.common_file_saved_on_disk_android) + saveOnDiskResult.assertions().isCalledOnce().with( + value( + LocalMedia( + uri = mockMediaUri, + info = media.mediaInfo, + ) + ) + ) + } + } + + @Test + fun `present - open with closes the bottom sheet and invokes the navigator`() = runTest { + val mediaGalleryDataSource = FakeMediaGalleryDataSource( + startLambda = { }, + ) + val openWithResult = lambdaRecorder> { _ -> Result.success(Unit) } + val item = aMediaItemImage( + eventId = AN_EVENT_ID, + senderId = A_USER_ID, + ) + mediaGalleryDataSource.emitGroupedMediaItems( + AsyncData.Success( + aGroupedMediaItems( + imageAndVideoItems = listOf(item), + fileItems = emptyList(), + ) + ) + ) + val presenter = createMediaGalleryPresenter( + localMediaActions = FakeLocalMediaActions( + openResult = openWithResult, + ), + mediaGalleryDataSource = mediaGalleryDataSource, + room = FakeJoinedRoom( + createTimelineResult = { Result.success(FakeTimeline()) }, + baseRoom = FakeBaseRoom( + roomPermissions = FakeRoomPermissions( + canRedactOwn = true + ), + ), + ), + ) + presenter.test { + skipItems(1) + val initialState = awaitFirstItem() + initialState.eventSink(MediaGalleryEvent.OpenInfo(item)) + val withBottomSheetState = awaitItem() + assertThat(withBottomSheetState.mediaBottomSheetState).isInstanceOf(MediaBottomSheetState.MediaDetailsBottomSheetState::class.java) + withBottomSheetState.eventSink(MediaGalleryEvent.OpenWith(AN_EVENT_ID)) + val finalState = awaitItem() + assertThat(finalState.mediaBottomSheetState).isEqualTo(MediaBottomSheetState.Hidden) + advanceUntilIdle() + openWithResult.assertions().isCalledOnce().with( + value( + LocalMedia( + uri = mockMediaUri, + info = item.mediaInfo, + ) + ) + ) } } diff --git a/libraries/mediaviewer/test/src/main/kotlin/io/element/android/libraries/mediaviewer/test/FakeLocalMediaActions.kt b/libraries/mediaviewer/test/src/main/kotlin/io/element/android/libraries/mediaviewer/test/FakeLocalMediaActions.kt index 875be941db..d048f73eab 100644 --- a/libraries/mediaviewer/test/src/main/kotlin/io/element/android/libraries/mediaviewer/test/FakeLocalMediaActions.kt +++ b/libraries/mediaviewer/test/src/main/kotlin/io/element/android/libraries/mediaviewer/test/FakeLocalMediaActions.kt @@ -11,37 +11,29 @@ package io.element.android.libraries.mediaviewer.test import androidx.compose.runtime.Composable import io.element.android.libraries.mediaviewer.api.local.LocalMedia import io.element.android.libraries.mediaviewer.impl.local.LocalMediaActions +import io.element.android.tests.testutils.lambda.lambdaError import io.element.android.tests.testutils.simulateLongTask -class FakeLocalMediaActions : LocalMediaActions { - var shouldFail = false - +class FakeLocalMediaActions( + val configureResult: () -> Unit = { }, + val saveOnDiskResult: (LocalMedia) -> Result = { lambdaError() }, + val shareResult: (LocalMedia) -> Result = { lambdaError() }, + val openResult: (LocalMedia) -> Result = { lambdaError() }, +) : LocalMediaActions { @Composable override fun Configure() { - // NOOP + configureResult() } override suspend fun saveOnDisk(localMedia: LocalMedia): Result = simulateLongTask { - if (shouldFail) { - Result.failure(RuntimeException()) - } else { - Result.success(Unit) - } + saveOnDiskResult(localMedia) } override suspend fun share(localMedia: LocalMedia): Result = simulateLongTask { - if (shouldFail) { - Result.failure(RuntimeException()) - } else { - Result.success(Unit) - } + shareResult(localMedia) } override suspend fun open(localMedia: LocalMedia): Result = simulateLongTask { - if (shouldFail) { - Result.failure(RuntimeException()) - } else { - Result.success(Unit) - } + openResult(localMedia) } } From 769341e4f2d557da53cf9f1d17230674ad8f8804 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 22 Apr 2026 12:16:52 +0200 Subject: [PATCH 08/22] Remove some dividers. --- .../mediaviewer/impl/details/MediaDetailsBottomSheet.kt | 3 --- 1 file changed, 3 deletions(-) diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDetailsBottomSheet.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDetailsBottomSheet.kt index fc377e5cae..3c29bd9044 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDetailsBottomSheet.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDetailsBottomSheet.kt @@ -104,7 +104,6 @@ fun MediaDetailsBottomSheet( onViewInTimeline(state.eventId) } ) - HorizontalDivider() ListItem( leadingContent = ListItemContent.Icon(IconSource.Vector(CompoundIcons.ShareAndroid())), headlineContent = { Text(stringResource(CommonStrings.action_share)) }, @@ -121,7 +120,6 @@ fun MediaDetailsBottomSheet( onForward(state.eventId) } ) - HorizontalDivider() ListItem( leadingContent = ListItemContent.Icon(IconSource.Vector(CompoundIcons.Download())), headlineContent = { Text(stringResource(CommonStrings.action_download)) }, @@ -141,7 +139,6 @@ fun MediaDetailsBottomSheet( MimeTypes.Apk -> stringResource(id = CommonStrings.common_install_apk_android) else -> stringResource(id = CommonStrings.action_open_with) } - HorizontalDivider() ListItem( leadingContent = icon, headlineContent = { Text(wording) }, From c1678f22e6e304aa9cf907b8a063bf396bba423a Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 22 Apr 2026 12:21:20 +0200 Subject: [PATCH 09/22] Add more preview for MediaDetailsBottomSheetPreview --- .../impl/details/MediaDetailsBottomSheet.kt | 7 ++- .../MediaDetailsBottomSheetStateProvider.kt | 43 +++++++++++++++++++ .../mediaviewer/impl/details/Preview.kt | 15 ------- 3 files changed, 48 insertions(+), 17 deletions(-) create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDetailsBottomSheetStateProvider.kt diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDetailsBottomSheet.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDetailsBottomSheet.kt index 3c29bd9044..3450989c95 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDetailsBottomSheet.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDetailsBottomSheet.kt @@ -25,6 +25,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clipToBounds import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.unit.dp import io.element.android.compound.theme.ElementTheme import io.element.android.compound.tokens.generated.CompoundIcons @@ -248,9 +249,11 @@ private fun SectionText( @PreviewsDayNight @Composable -internal fun MediaDetailsBottomSheetPreview() = ElementPreview { +internal fun MediaDetailsBottomSheetPreview( + @PreviewParameter(MediaDetailsBottomSheetStateProvider::class) state: MediaBottomSheetState.MediaDetailsBottomSheetState, +) = ElementPreview { MediaDetailsBottomSheet( - state = aMediaDetailsBottomSheetState(), + state = state, onViewInTimeline = {}, onShare = {}, onForward = {}, diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDetailsBottomSheetStateProvider.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDetailsBottomSheetStateProvider.kt new file mode 100644 index 0000000000..5da48a0838 --- /dev/null +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDetailsBottomSheetStateProvider.kt @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2026 Element Creations 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.mediaviewer.api.MediaInfo +import io.element.android.libraries.mediaviewer.api.anApkMediaInfo +import io.element.android.libraries.mediaviewer.api.anImageMediaInfo + +open class MediaDetailsBottomSheetStateProvider : PreviewParameterProvider { + override val values: Sequence + get() = sequenceOf( + aMediaDetailsBottomSheetState(), + aMediaDetailsBottomSheetState( + canDelete = false, + ), + aMediaDetailsBottomSheetState( + mediaInfo = anApkMediaInfo(), + ), + ) +} + +fun aMediaDetailsBottomSheetState( + dateSentFull: String = "December 6, 2024 at 12:59", + canDelete: Boolean = true, + mediaInfo: MediaInfo = anImageMediaInfo( + senderName = "Alice", + dateSentFull = dateSentFull, + ), +): MediaBottomSheetState.MediaDetailsBottomSheetState { + return MediaBottomSheetState.MediaDetailsBottomSheetState( + eventId = EventId("\$eventId"), + canDelete = canDelete, + mediaInfo = mediaInfo, + thumbnailSource = null, + ) +} diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/Preview.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/Preview.kt index a152a32091..17138b4fa7 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/Preview.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/Preview.kt @@ -11,21 +11,6 @@ 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 aMediaDetailsBottomSheetState( - dateSentFull: String = "December 6, 2024 at 12:59", - canDelete: Boolean = true, -): MediaBottomSheetState.MediaDetailsBottomSheetState { - return MediaBottomSheetState.MediaDetailsBottomSheetState( - eventId = EventId("\$eventId"), - canDelete = canDelete, - mediaInfo = anImageMediaInfo( - senderName = "Alice", - dateSentFull = dateSentFull, - ), - thumbnailSource = null, - ) -} - fun aMediaDeleteConfirmationState(): MediaBottomSheetState.MediaDeleteConfirmationState { return MediaBottomSheetState.MediaDeleteConfirmationState( eventId = EventId("\$eventId"), From c9b48d32b0dbcbd94ef67e816bcc3986edec2079 Mon Sep 17 00:00:00 2001 From: ElementBot Date: Wed, 22 Apr 2026 10:40:25 +0000 Subject: [PATCH 10/22] Update screenshots --- ...iaviewer.impl.details_MediaDetailsBottomSheet_Day_0_en.png | 4 ++-- ...iaviewer.impl.details_MediaDetailsBottomSheet_Day_1_en.png | 3 +++ ...iaviewer.impl.details_MediaDetailsBottomSheet_Day_2_en.png | 3 +++ ...viewer.impl.details_MediaDetailsBottomSheet_Night_0_en.png | 4 ++-- ...viewer.impl.details_MediaDetailsBottomSheet_Night_1_en.png | 3 +++ ...viewer.impl.details_MediaDetailsBottomSheet_Night_2_en.png | 3 +++ ...ies.mediaviewer.impl.gallery_MediaGalleryView_Day_8_en.png | 4 ++-- ...s.mediaviewer.impl.gallery_MediaGalleryView_Night_8_en.png | 4 ++-- ....mediaviewer.impl.viewer_MediaViewerViewLandscape_0_en.png | 4 ++-- ...mediaviewer.impl.viewer_MediaViewerViewLandscape_10_en.png | 4 ++-- ...mediaviewer.impl.viewer_MediaViewerViewLandscape_13_en.png | 4 ++-- ...mediaviewer.impl.viewer_MediaViewerViewLandscape_16_en.png | 4 ++-- ...mediaviewer.impl.viewer_MediaViewerViewLandscape_17_en.png | 4 ++-- ....mediaviewer.impl.viewer_MediaViewerViewLandscape_1_en.png | 4 ++-- ....mediaviewer.impl.viewer_MediaViewerViewLandscape_2_en.png | 4 ++-- ....mediaviewer.impl.viewer_MediaViewerViewLandscape_3_en.png | 4 ++-- ....mediaviewer.impl.viewer_MediaViewerViewLandscape_4_en.png | 4 ++-- ....mediaviewer.impl.viewer_MediaViewerViewLandscape_5_en.png | 4 ++-- ....mediaviewer.impl.viewer_MediaViewerViewLandscape_6_en.png | 4 ++-- ....mediaviewer.impl.viewer_MediaViewerViewLandscape_7_en.png | 4 ++-- ....mediaviewer.impl.viewer_MediaViewerViewLandscape_8_en.png | 4 ++-- ....mediaviewer.impl.viewer_MediaViewerViewLandscape_9_en.png | 4 ++-- ...libraries.mediaviewer.impl.viewer_MediaViewerView_0_en.png | 4 ++-- ...ibraries.mediaviewer.impl.viewer_MediaViewerView_10_en.png | 4 ++-- ...ibraries.mediaviewer.impl.viewer_MediaViewerView_11_en.png | 4 ++-- ...ibraries.mediaviewer.impl.viewer_MediaViewerView_12_en.png | 4 ++-- ...ibraries.mediaviewer.impl.viewer_MediaViewerView_13_en.png | 4 ++-- ...ibraries.mediaviewer.impl.viewer_MediaViewerView_16_en.png | 4 ++-- ...ibraries.mediaviewer.impl.viewer_MediaViewerView_17_en.png | 4 ++-- ...libraries.mediaviewer.impl.viewer_MediaViewerView_1_en.png | 4 ++-- ...libraries.mediaviewer.impl.viewer_MediaViewerView_2_en.png | 4 ++-- ...libraries.mediaviewer.impl.viewer_MediaViewerView_3_en.png | 4 ++-- ...libraries.mediaviewer.impl.viewer_MediaViewerView_4_en.png | 4 ++-- ...libraries.mediaviewer.impl.viewer_MediaViewerView_5_en.png | 4 ++-- ...libraries.mediaviewer.impl.viewer_MediaViewerView_6_en.png | 4 ++-- ...libraries.mediaviewer.impl.viewer_MediaViewerView_7_en.png | 4 ++-- ...libraries.mediaviewer.impl.viewer_MediaViewerView_8_en.png | 4 ++-- ...libraries.mediaviewer.impl.viewer_MediaViewerView_9_en.png | 4 ++-- 38 files changed, 80 insertions(+), 68 deletions(-) create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_2_en.png diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_0_en.png index 595aae659f..5a9605e9dd 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_0_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:684f94bece9c9cc117eef1cdad6fca99bb085158454a890592254f27c57e9b0e -size 39715 +oid sha256:fd9027f3684b91a8867bf0cb7c1eb3925edfc4982d40cc33414997e38c068d45 +size 40887 diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_1_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_1_en.png new file mode 100644 index 0000000000..c48dc8fdf9 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_1_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:736ac91d14dd16f8d1cc7040fc69c08c97d2525c3876b90376a85764157e2910 +size 40859 diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_2_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_2_en.png new file mode 100644 index 0000000000..909387767f --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_2_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:070e17d4807133d5966bd3f2ae52df258294466479e2fe96a7943571b0fa81e7 +size 40068 diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_0_en.png index 847d2f35db..cdddf1c59c 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_0_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:881a6235b66bd13269103bcc7070e389041652da49ecdba68c6caf151301b6c0 -size 38428 +oid sha256:6c9d002e8d23dc85be883fae56d1266dadfd9fbd73a9b8a396b8953be9b7ff23 +size 39445 diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_1_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_1_en.png new file mode 100644 index 0000000000..6c2870a35f --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_1_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7982c873e18aeb3c2ae32638bc0c6be7a36f9b2326e303306c5c63a2ebeebbab +size 39429 diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_2_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_2_en.png new file mode 100644 index 0000000000..a77470a1b0 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_2_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b3b0f78545228d76ef59bd777eec4dd72b0dbcef8b7bae51b6f3c05b0f1cbd87 +size 38943 diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_8_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_8_en.png index acc977cd8d..f6769f22ba 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_8_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_8_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9dd2d35e1c0a3b3a9576e35b8a5ad4a3d08441b8257bb48edd0a0816c9f24c68 -size 39634 +oid sha256:41d66efcb35b7c75452311d7646c73a66e2906cda1ee6da99d9b216121a8f073 +size 40805 diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_8_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_8_en.png index 47027cdf92..253add27e2 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_8_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_8_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:fa2ca41cebe2e37843f74319a56f3c18103929f06765f0950cd1945440909e63 -size 38223 +oid sha256:b704a5672030f94f4d331784c5307f38b156e11dc69e9b17890a0aef3de26241 +size 39241 diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_0_en.png index 60c5e812ba..9c0c4b40f2 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_0_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9e514d7f36fe25150d66c2d2092982a696196a5a0a2674eef97b7231c0c03bef -size 699410 +oid sha256:64d834437c7049ec9d81331b382c4bf0cdbc603de8e403e0addf6a4947e815a6 +size 700141 diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_10_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_10_en.png index 5a96554c0a..bcbfc91e12 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_10_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_10_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:712af2723a0656ffe927f1cd488d3117f5b450fa405dad307b0c88a9f2483f9c -size 698704 +oid sha256:398c2908d73fb30117ce917b25e930c578eaf2da5e0c41e126f262f129bda8cc +size 699710 diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_13_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_13_en.png index d0139ec184..d2231ed54c 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_13_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_13_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:52174b55b1737787260a454c59f243b0e3f6327ef5ec71464744def928d165d4 -size 206785 +oid sha256:041669475888f2f0c3b2d34502ae72098547340d8c2422ea2a674d38eb6a6241 +size 207620 diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_16_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_16_en.png index a32a45029c..a737f60d1b 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_16_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_16_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:99478fe3d9d44e9cda39f33748c70017203a2cce5cb855605740a29360221bd5 -size 184910 +oid sha256:348a194ad17a0a0dffda47c7387edde99436d543e9bff1726608946e92558830 +size 185553 diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_17_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_17_en.png index a855818ac6..36ecce8294 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_17_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_17_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:062f8342a3a3715498ca34488c2d9ffe09c1e6dbbe04df09e88fd107a33b174a -size 653228 +oid sha256:5aa3bca6cd248ac4725fb35aa11a465029dc534b8b167aedbf3e9bc240577e9c +size 654171 diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_1_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_1_en.png index accbd26985..312b19a389 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_1_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_1_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3effa629295c12d2248924cf298599f3bd28975ecc76fac84f771c16266d738e -size 698895 +oid sha256:b23ef4fb29f51e308b74681017fcee257308edbd1e218e4daf5736501c70e0de +size 699637 diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_2_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_2_en.png index b9dabc97ee..88e1c15416 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_2_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_2_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1fd3b7065860d1e51fe51a0a6e3f4a9e61a77ea91cefe85cc3aa3560c4cc6bb2 -size 252253 +oid sha256:af91214346ed087a8cf936b9ddc5b78e8840a48f6dab6b856ad79abb5fef1ea0 +size 252778 diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_3_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_3_en.png index f11d4fc3fc..c63d5a9110 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_3_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_3_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7f9ee78e2a034f34d77a438d305a5cc63ea583df80f83a14b1d81fcf74ca93f4 -size 665416 +oid sha256:bd5b76aefb0fde0605556e78c7286bf8ee8dd465def0e3095ebc97ce3427eafa +size 666239 diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_4_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_4_en.png index 5e081d3c4e..8a6ebb2746 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_4_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_4_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d1e91c66363a5af74d4345f7837db178410c078e390b0cf9296d0ba4b3dfd7cb -size 207004 +oid sha256:c56b22d79924d1f463f01428d5be1c69c8068b94a953160fae59a9f6faa112ad +size 206047 diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_5_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_5_en.png index d61e0a50b9..8311ff7878 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_5_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_5_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9eb950f3c0d34a796ebd7635ff736023742d5e6a243912f3ad2234ecf08694b2 -size 183220 +oid sha256:1fcaacd813136d9cb22d0542480fcef2be05cae7ec44c0c3683874086e1c7a4b +size 184107 diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_6_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_6_en.png index f2352c88f8..a092bf37ac 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_6_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_6_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7f6c84fbd21949a3d9d355bfb627b8a70f65fc669cb6b6818a325fe4577351f9 -size 196092 +oid sha256:9e23aad00065523bf1ee0e26cd094eb6a9bdd73d65f0bd9cac62cb79e7876481 +size 196533 diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_7_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_7_en.png index bd37e3eb79..619bd4e8c6 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_7_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_7_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:26bd927acc578cb3585f6e101c066f0a6adb6a6e424dcd196388d5a838d8b22b -size 196396 +oid sha256:9d98ceaeb669342160d04783f07fbb21929d8be46d30181b60e0f09a99abfe79 +size 197127 diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_8_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_8_en.png index 69515d4326..bbea97e0b3 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_8_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_8_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2c4440f5ed01f2c1b405bb2d444c52455ea8ee1c094baf7d2f85bd9a9ff98b02 -size 210117 +oid sha256:e72ef42ad838837ce2427af5677931f5db68f876eccc297894c7a2cdd437cffa +size 210729 diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_9_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_9_en.png index 5d254988c9..67bec8b0d3 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_9_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_9_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:11f140569061e21e6b546118b57340a0830779580498a31627acb2e6c7313471 -size 210490 +oid sha256:58a323c4f06745a877ea546870fbe69ec927aea50584001b3871cad833fca1d4 +size 211343 diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_0_en.png index 03f85f5233..0b90eca670 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_0_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2b5af8a5aae566e72e0223d40a5978ab191911c68739e417503d8fd5058f19e7 -size 389408 +oid sha256:f17669c1a3a65bafa5786ac23245117b6956d154a4ddea2e95de9070a5bff07e +size 390004 diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_10_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_10_en.png index 7aa5cf885d..db9cb01f26 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_10_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_10_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:aec4a5e70320024eb053c56445c226758818550745f2d2ddfec16721e43b6d90 -size 388674 +oid sha256:2bd5c7a42aebb6c2ebce9a529bafb23145e5a3a1d10270385386ecde9ca03c19 +size 389486 diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_11_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_11_en.png index 47027cdf92..253add27e2 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_11_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_11_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:fa2ca41cebe2e37843f74319a56f3c18103929f06765f0950cd1945440909e63 -size 38223 +oid sha256:b704a5672030f94f4d331784c5307f38b156e11dc69e9b17890a0aef3de26241 +size 39241 diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_12_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_12_en.png index 4094507bdd..1259041506 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_12_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_12_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1e53770850ee2e0d011ed91360a2c02abf80b27cc2cee66699331684637d469a -size 30960 +oid sha256:7e15267ee448fae18a63022ab464769528b07585f13ccdb2e8c5589584759d69 +size 31485 diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_13_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_13_en.png index 89b6cfbfba..d5b81bb469 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_13_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_13_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9c7c09c4ff8e66c23d3cdf5c79ffe2d3305d569e3aa1e239dfbb981537e467cd -size 133920 +oid sha256:55671428c52d37c3f63f8b3410817d4e893e2f4327b31b227bc7b7d9ff84b884 +size 134680 diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_16_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_16_en.png index 9836fe106f..7ff9c8a971 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_16_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_16_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:df718693c63e4de07d17486a80103240f8f2d56a21aaf1a2b18a9237f105364d -size 113630 +oid sha256:730cffc57e88440ec4607238b383e68aada1907e6f9829a3bdc4bf8a467c1788 +size 114080 diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_17_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_17_en.png index dc06b5afc9..5b167203f5 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_17_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_17_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8e353d24c2b9b49abaa11e064b1581215ad65154d0e67372fe24684ba2695a0e -size 442063 +oid sha256:6bddbe3b0e66e0a2ce49b39321057c94427933de81663f680237a398e9929ba3 +size 442729 diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_1_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_1_en.png index 5b86c94b5b..aa35a1751a 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_1_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_1_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d0ed6080a007c98867a5c4f9b32570ab3042b34030b5210867110374064ee8fc -size 389436 +oid sha256:9d8a4b42d3857ddaa1ea86d4ab3a872c5fa0014061b2a116895616bee25424d1 +size 390037 diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_2_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_2_en.png index eb7fa67df4..5663001649 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_2_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_2_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4feb42b25bd952a0305ad2b1c4cab9934586693d804336e1ba23e9b247f712c0 -size 94961 +oid sha256:1c4b715349adcfdf5c3cdd95844846170b43dc191801156b2e822f0eaeb92033 +size 95392 diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_3_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_3_en.png index f55ed35a60..167467d515 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_3_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_3_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:eaf4fb4908967c6092de9be0d7ca33108f0f507605d7591395a08594763fb0fe -size 396202 +oid sha256:3bd4a96daaa24c01b7d0007fdd14460dc80c65c13d0ccc7a887b04fd90e9fa99 +size 396805 diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_4_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_4_en.png index 8a41530aee..26dcbe4099 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_4_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_4_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:bb6999796f9275adce6b5e05b362649cb738c759af649f7bbb9c0ff01548a579 -size 131776 +oid sha256:f7bee65567cced59131d471b5c3795347a2ef52cf64ff74b47f1c983a0b4a36f +size 130718 diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_5_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_5_en.png index fbddf16dfd..56e01cbc01 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_5_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_5_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:04ba5da6b618ae3abf4ca06b4ae1baa13e46673b0be73ada2b15cefd79063122 -size 112146 +oid sha256:3aef5ebd6889b0fc8345db6aefeb6d2cc26a5a2349632dac2e258caa87c28b53 +size 112850 diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_6_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_6_en.png index f13a902fe0..31403f8980 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_6_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_6_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8273abc2f10e6c42a65fb6aef2e237d58b6e4d858df1f35be255b7030fb63c44 -size 123522 +oid sha256:b9cd21b6d9a9d0a9ef656bf895d6d135ba76160695355ce034fe985991d6955b +size 123949 diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_7_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_7_en.png index ce0848b5b3..bc0720e4b4 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_7_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_7_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:456dc57223044ece1f4136dc01765e41a0b649c827ad6e6b08370e53a7015dbb -size 14378 +oid sha256:2dce0794e50116043fde9f6eb76b0c05ca21fc9cee26bde01618024c24c154b2 +size 14952 diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_8_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_8_en.png index 06e1c13225..f2ff11333d 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_8_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_8_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b5fdeb06fb15486d2d4949a38da2f6eed5ef94a0386e9daaa83a6b00bec9e392 -size 137096 +oid sha256:f3cea16c42488306fe29fd22362a0d37c1eeb0fbb1db48f26ad7ff18f6b196ae +size 137605 diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_9_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_9_en.png index dfe63cccae..62de7a4953 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_9_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_9_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9b64a6f9fe548897b6b34961bc077718265acdb8f894d5d2d697d5409c633368 -size 137247 +oid sha256:58655e1846dbe73c287073ac909ee6c881a0ad800e8852653116fdbfd043b9a0 +size 137881 From 7bbdecc7a87b1790e3a8d7ec14ee726c62f3ddf8 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 22 Apr 2026 14:42:56 +0200 Subject: [PATCH 11/22] Rename sub classes of MediaBottomSheetState and improve preview of MediaDeleteConfirmationBottomSheet --- .../impl/details/MediaBottomSheetState.kt | 14 ++++---- ...tomSheetStateDeleteConfirmationProvider.kt | 36 +++++++++++++++++++ ...> MediaBottomSheetStateDetailsProvider.kt} | 29 +++++++-------- .../MediaDeleteConfirmationBottomSheet.kt | 11 +++--- .../impl/details/MediaDetailsBottomSheet.kt | 4 +-- .../mediaviewer/impl/details/Preview.kt | 22 ------------ .../impl/gallery/MediaGalleryPresenter.kt | 4 +-- .../impl/gallery/MediaGalleryStateProvider.kt | 4 +-- .../impl/gallery/MediaGalleryView.kt | 4 +-- .../impl/viewer/MediaViewerPresenter.kt | 4 +-- .../impl/viewer/MediaViewerStateProvider.kt | 8 ++--- .../impl/viewer/MediaViewerView.kt | 4 +-- .../MediaDeleteConfirmationBottomSheetTest.kt | 6 ++-- .../details/MediaDetailsBottomSheetTest.kt | 14 ++++---- .../impl/gallery/MediaGalleryPresenterTest.kt | 12 +++---- .../impl/viewer/MediaViewerPresenterTest.kt | 12 +++---- .../impl/viewer/MediaViewerViewTest.kt | 4 +-- 17 files changed, 103 insertions(+), 89 deletions(-) create mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaBottomSheetStateDeleteConfirmationProvider.kt rename libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/{MediaDetailsBottomSheetStateProvider.kt => MediaBottomSheetStateDetailsProvider.kt} (53%) delete mode 100644 libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/Preview.kt diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaBottomSheetState.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaBottomSheetState.kt index 7cd4dee318..722126fac6 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaBottomSheetState.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaBottomSheetState.kt @@ -15,16 +15,16 @@ import io.element.android.libraries.mediaviewer.api.MediaInfo sealed interface MediaBottomSheetState { data object Hidden : MediaBottomSheetState - data class MediaDeleteConfirmationState( - val eventId: EventId, - val mediaInfo: MediaInfo, - val thumbnailSource: MediaSource?, - ) : MediaBottomSheetState - - data class MediaDetailsBottomSheetState( + data class Details( val eventId: EventId?, val canDelete: Boolean, val mediaInfo: MediaInfo, val thumbnailSource: MediaSource?, ) : MediaBottomSheetState + + data class DeleteConfirmation( + val eventId: EventId, + val mediaInfo: MediaInfo, + val thumbnailSource: MediaSource?, + ) : MediaBottomSheetState } diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaBottomSheetStateDeleteConfirmationProvider.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaBottomSheetStateDeleteConfirmationProvider.kt new file mode 100644 index 0000000000..d5fd46d507 --- /dev/null +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaBottomSheetStateDeleteConfirmationProvider.kt @@ -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 { + override val values: Sequence + 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, +) diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDetailsBottomSheetStateProvider.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaBottomSheetStateDetailsProvider.kt similarity index 53% rename from libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDetailsBottomSheetStateProvider.kt rename to libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaBottomSheetStateDetailsProvider.kt index 5da48a0838..ad8e6e30a0 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDetailsBottomSheetStateProvider.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaBottomSheetStateDetailsProvider.kt @@ -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.anImageMediaInfo -open class MediaDetailsBottomSheetStateProvider : PreviewParameterProvider { - override val values: Sequence +open class MediaBottomSheetStateDetailsProvider : PreviewParameterProvider { + override val values: Sequence get() = sequenceOf( - aMediaDetailsBottomSheetState(), - aMediaDetailsBottomSheetState( + aMediaBottomSheetStateDetails(), + aMediaBottomSheetStateDetails( canDelete = false, ), - aMediaDetailsBottomSheetState( + aMediaBottomSheetStateDetails( mediaInfo = anApkMediaInfo(), ), ) } -fun aMediaDetailsBottomSheetState( - dateSentFull: String = "December 6, 2024 at 12:59", +fun aMediaBottomSheetStateDetails( canDelete: Boolean = true, mediaInfo: MediaInfo = anImageMediaInfo( senderName = "Alice", - dateSentFull = dateSentFull, + dateSentFull = "December 6, 2024 at 12:59", ), -): MediaBottomSheetState.MediaDetailsBottomSheetState { - return MediaBottomSheetState.MediaDetailsBottomSheetState( - eventId = EventId("\$eventId"), - canDelete = canDelete, - mediaInfo = mediaInfo, - thumbnailSource = null, - ) -} +) = MediaBottomSheetState.Details( + eventId = EventId("\$eventId"), + canDelete = canDelete, + mediaInfo = mediaInfo, + thumbnailSource = null, +) diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDeleteConfirmationBottomSheet.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDeleteConfirmationBottomSheet.kt index e3b16df684..84712eb10a 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDeleteConfirmationBottomSheet.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDeleteConfirmationBottomSheet.kt @@ -30,6 +30,7 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.unit.dp import coil3.compose.AsyncImage import io.element.android.compound.theme.ElementTheme @@ -49,7 +50,7 @@ import io.element.android.libraries.ui.strings.CommonStrings @OptIn(ExperimentalMaterial3Api::class) @Composable fun MediaDeleteConfirmationBottomSheet( - state: MediaBottomSheetState.MediaDeleteConfirmationState, + state: MediaBottomSheetState.DeleteConfirmation, onDelete: (EventId) -> Unit, onDismiss: () -> Unit, modifier: Modifier = Modifier, @@ -105,7 +106,7 @@ fun MediaDeleteConfirmationBottomSheet( @Composable private fun MediaRow( - state: MediaBottomSheetState.MediaDeleteConfirmationState, + state: MediaBottomSheetState.DeleteConfirmation, modifier: Modifier = Modifier, ) { Row( @@ -160,9 +161,11 @@ private fun MediaRow( @PreviewsDayNight @Composable -internal fun MediaDeleteConfirmationBottomSheetPreview() = ElementPreview { +internal fun MediaDeleteConfirmationBottomSheetPreview( + @PreviewParameter(provider = MediaBottomSheetStateDeleteConfirmationProvider::class) state: MediaBottomSheetState.DeleteConfirmation, +) = ElementPreview { MediaDeleteConfirmationBottomSheet( - state = aMediaDeleteConfirmationState(), + state = state, onDelete = {}, onDismiss = {}, ) diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDetailsBottomSheet.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDetailsBottomSheet.kt index 3450989c95..a3c3d02de8 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDetailsBottomSheet.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDetailsBottomSheet.kt @@ -54,7 +54,7 @@ import io.element.android.libraries.ui.strings.CommonStrings @OptIn(ExperimentalMaterial3Api::class) @Composable fun MediaDetailsBottomSheet( - state: MediaBottomSheetState.MediaDetailsBottomSheetState, + state: MediaBottomSheetState.Details, onViewInTimeline: (EventId) -> Unit, onShare: (EventId) -> Unit, onForward: (EventId) -> Unit, @@ -250,7 +250,7 @@ private fun SectionText( @PreviewsDayNight @Composable internal fun MediaDetailsBottomSheetPreview( - @PreviewParameter(MediaDetailsBottomSheetStateProvider::class) state: MediaBottomSheetState.MediaDetailsBottomSheetState, + @PreviewParameter(MediaBottomSheetStateDetailsProvider::class) state: MediaBottomSheetState.Details, ) = ElementPreview { MediaDetailsBottomSheet( state = state, diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/Preview.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/Preview.kt deleted file mode 100644 index 17138b4fa7..0000000000 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/Preview.kt +++ /dev/null @@ -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, - ) -} diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryPresenter.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryPresenter.kt index e56267e291..ac9b365099 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryPresenter.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryPresenter.kt @@ -126,7 +126,7 @@ class MediaGalleryPresenter( navigator.onViewInTimelineClick(event.eventId) } is MediaGalleryEvent.OpenInfo -> coroutineScope.launch { - mediaBottomSheetState = MediaBottomSheetState.MediaDetailsBottomSheetState( + mediaBottomSheetState = MediaBottomSheetState.Details( eventId = event.mediaItem.eventId(), canDelete = when (event.mediaItem.mediaInfo().senderId) { null -> false @@ -144,7 +144,7 @@ class MediaGalleryPresenter( ) } is MediaGalleryEvent.ConfirmDelete -> { - mediaBottomSheetState = MediaBottomSheetState.MediaDeleteConfirmationState( + mediaBottomSheetState = MediaBottomSheetState.DeleteConfirmation( eventId = event.eventId, mediaInfo = event.mediaInfo, thumbnailSource = event.thumbnailSource, diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryStateProvider.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryStateProvider.kt index a19f810e45..7b5edf594a 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryStateProvider.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryStateProvider.kt @@ -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.matrix.api.core.UniqueId 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.MediaItem import io.element.android.libraries.mediaviewer.impl.model.aMediaItemAudio @@ -79,7 +79,7 @@ open class MediaGalleryStateProvider : PreviewParameterProvider Unit - is MediaBottomSheetState.MediaDetailsBottomSheetState -> { + is MediaBottomSheetState.Details -> { MediaDetailsBottomSheet( state = bottomSheetState, onViewInTimeline = { eventId -> @@ -190,7 +190,7 @@ fun MediaGalleryView( }, ) } - is MediaBottomSheetState.MediaDeleteConfirmationState -> { + is MediaBottomSheetState.DeleteConfirmation -> { MediaDeleteConfirmationBottomSheet( state = bottomSheetState, onDelete = { diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerPresenter.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerPresenter.kt index 0128e40e65..b7631a7039 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerPresenter.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerPresenter.kt @@ -131,7 +131,7 @@ class MediaViewerPresenter( ) } is MediaViewerEvent.OpenInfo -> coroutineScope.launch { - mediaBottomSheetState = MediaBottomSheetState.MediaDetailsBottomSheetState( + mediaBottomSheetState = MediaBottomSheetState.Details( eventId = event.data.eventId, canDelete = when (event.data.mediaInfo.senderId) { null -> false @@ -143,7 +143,7 @@ class MediaViewerPresenter( ) } is MediaViewerEvent.ConfirmDelete -> { - mediaBottomSheetState = MediaBottomSheetState.MediaDeleteConfirmationState( + mediaBottomSheetState = MediaBottomSheetState.DeleteConfirmation( eventId = event.eventId, mediaInfo = event.data.mediaInfo, thumbnailSource = event.data.thumbnailSource ?: event.data.mediaSource, diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerStateProvider.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerStateProvider.kt index e7d8fd55ae..ef9b533586 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerStateProvider.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerStateProvider.kt @@ -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.local.LocalMedia 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.aMediaDetailsBottomSheetState +import io.element.android.libraries.mediaviewer.impl.details.aMediaBottomSheetStateDeleteConfirmation +import io.element.android.libraries.mediaviewer.impl.details.aMediaBottomSheetStateDetails import kotlinx.collections.immutable.toImmutableList 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 ) }, aMediaViewerState( - mediaBottomSheetState = aMediaDetailsBottomSheetState(), + mediaBottomSheetState = aMediaBottomSheetStateDetails(), ), aMediaViewerState( - mediaBottomSheetState = aMediaDeleteConfirmationState(), + mediaBottomSheetState = aMediaBottomSheetStateDeleteConfirmation(), ), anAudioMediaInfo( waveForm = WaveFormSamples.realisticWaveForm, diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerView.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerView.kt index 5119198ff4..abea2f66d2 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerView.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerView.kt @@ -253,7 +253,7 @@ fun MediaViewerView( when (val bottomSheetState = state.mediaBottomSheetState) { MediaBottomSheetState.Hidden -> Unit - is MediaBottomSheetState.MediaDetailsBottomSheetState -> { + is MediaBottomSheetState.Details -> { MediaDetailsBottomSheet( state = bottomSheetState, onViewInTimeline = { @@ -292,7 +292,7 @@ fun MediaViewerView( }, ) } - is MediaBottomSheetState.MediaDeleteConfirmationState -> { + is MediaBottomSheetState.DeleteConfirmation -> { MediaDeleteConfirmationBottomSheet( state = bottomSheetState, onDelete = { diff --git a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDeleteConfirmationBottomSheetTest.kt b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDeleteConfirmationBottomSheetTest.kt index 4d8b81a2dd..4cbb35a85e 100644 --- a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDeleteConfirmationBottomSheetTest.kt +++ b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDeleteConfirmationBottomSheetTest.kt @@ -33,7 +33,7 @@ class MediaDeleteConfirmationBottomSheetTest { @Test fun `clicking on Cancel invokes expected callback`() { - val state = aMediaDeleteConfirmationState() + val state = aMediaBottomSheetStateDeleteConfirmation() ensureCalledOnce { callback -> rule.setMediaDeleteConfirmationBottomSheet( state = state, @@ -45,7 +45,7 @@ class MediaDeleteConfirmationBottomSheetTest { @Test fun `clicking on Remove invokes expected callback`() { - val state = aMediaDeleteConfirmationState() + val state = aMediaBottomSheetStateDeleteConfirmation() ensureCalledOnceWithParam(state.eventId) { callback -> rule.setMediaDeleteConfirmationBottomSheet( state = state, @@ -58,7 +58,7 @@ class MediaDeleteConfirmationBottomSheetTest { } private fun AndroidComposeTestRule.setMediaDeleteConfirmationBottomSheet( - state: MediaBottomSheetState.MediaDeleteConfirmationState, + state: MediaBottomSheetState.DeleteConfirmation, onDelete: (EventId) -> Unit = EnsureNeverCalledWithParam(), onDismiss: () -> Unit = EnsureNeverCalled(), ) { diff --git a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDetailsBottomSheetTest.kt b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDetailsBottomSheetTest.kt index b6b8b68466..21a06f9568 100644 --- a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDetailsBottomSheetTest.kt +++ b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDetailsBottomSheetTest.kt @@ -34,7 +34,7 @@ class MediaDetailsBottomSheetTest { @Test @Config(qualifiers = "h1024dp") fun `clicking on View in timeline invokes expected callback`() { - val state = aMediaDetailsBottomSheetState() + val state = aMediaBottomSheetStateDetails() ensureCalledOnceWithParam(state.eventId) { callback -> rule.setMediaDetailsBottomSheet( state = state, @@ -47,7 +47,7 @@ class MediaDetailsBottomSheetTest { @Test @Config(qualifiers = "h1024dp") fun `clicking on Share invokes expected callback`() { - val state = aMediaDetailsBottomSheetState() + val state = aMediaBottomSheetStateDetails() ensureCalledOnceWithParam(state.eventId) { callback -> rule.setMediaDetailsBottomSheet( state = state, @@ -60,7 +60,7 @@ class MediaDetailsBottomSheetTest { @Test @Config(qualifiers = "h1024dp") fun `clicking on Forward invokes expected callback`() { - val state = aMediaDetailsBottomSheetState() + val state = aMediaBottomSheetStateDetails() ensureCalledOnceWithParam(state.eventId) { callback -> rule.setMediaDetailsBottomSheet( state = state, @@ -73,7 +73,7 @@ class MediaDetailsBottomSheetTest { @Test @Config(qualifiers = "h1024dp") fun `clicking on Download invokes expected callback`() { - val state = aMediaDetailsBottomSheetState() + val state = aMediaBottomSheetStateDetails() ensureCalledOnceWithParam(state.eventId) { callback -> rule.setMediaDetailsBottomSheet( state = state, @@ -86,7 +86,7 @@ class MediaDetailsBottomSheetTest { @Config(qualifiers = "h1024dp") @Test fun `clicking on Delete invokes expected callback`() { - val state = aMediaDetailsBottomSheetState() + val state = aMediaBottomSheetStateDetails() ensureCalledOnceWithParam(state.eventId) { callback -> rule.setMediaDetailsBottomSheet( state = state, @@ -100,7 +100,7 @@ class MediaDetailsBottomSheetTest { @Config(qualifiers = "h1024dp") @Test fun `Remove is not present if canDelete is false`() { - val state = aMediaDetailsBottomSheetState( + val state = aMediaBottomSheetStateDetails( canDelete = false, ) rule.setMediaDetailsBottomSheet( @@ -111,7 +111,7 @@ class MediaDetailsBottomSheetTest { } private fun AndroidComposeTestRule.setMediaDetailsBottomSheet( - state: MediaBottomSheetState.MediaDetailsBottomSheetState, + state: MediaBottomSheetState.Details, onViewInTimeline: (EventId) -> Unit = EnsureNeverCalledWithParam(), onShare: (EventId) -> Unit = EnsureNeverCalledWithParam(), onForward: (EventId) -> Unit = EnsureNeverCalledWithParam(), diff --git a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryPresenterTest.kt b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryPresenterTest.kt index 6dd58a6086..929f2a970e 100644 --- a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryPresenterTest.kt +++ b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryPresenterTest.kt @@ -136,7 +136,7 @@ class MediaGalleryPresenterTest { initialState.eventSink(MediaGalleryEvent.OpenInfo(item)) val state = awaitItem() assertThat(state.mediaBottomSheetState).isEqualTo( - MediaBottomSheetState.MediaDetailsBottomSheetState( + MediaBottomSheetState.Details( eventId = AN_EVENT_ID, canDelete = canDeleteOwn, mediaInfo = item.mediaInfo, @@ -183,7 +183,7 @@ class MediaGalleryPresenterTest { initialState.eventSink(MediaGalleryEvent.OpenInfo(item)) val state = awaitItem() assertThat(state.mediaBottomSheetState).isEqualTo( - MediaBottomSheetState.MediaDetailsBottomSheetState( + MediaBottomSheetState.Details( eventId = AN_EVENT_ID, canDelete = canDeleteOther, mediaInfo = item.mediaInfo, @@ -212,7 +212,7 @@ class MediaGalleryPresenterTest { initialState.eventSink(MediaGalleryEvent.ConfirmDelete(AN_EVENT_ID, item.mediaInfo, item.thumbnailSource)) val deleteState = awaitItem() assertThat(deleteState.mediaBottomSheetState).isEqualTo( - MediaBottomSheetState.MediaDeleteConfirmationState( + MediaBottomSheetState.DeleteConfirmation( eventId = AN_EVENT_ID, mediaInfo = item.mediaInfo, thumbnailSource = item.thumbnailSource, @@ -384,7 +384,7 @@ class MediaGalleryPresenterTest { val initialState = awaitFirstItem() initialState.eventSink(MediaGalleryEvent.OpenInfo(item)) 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)) val finalState = awaitItem() assertThat(finalState.mediaBottomSheetState).isEqualTo(MediaBottomSheetState.Hidden) @@ -451,7 +451,7 @@ class MediaGalleryPresenterTest { ) initialState.eventSink(MediaGalleryEvent.OpenInfo(item)) 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)) val finalState = awaitItem() assertThat(finalState.mediaBottomSheetState).isEqualTo(MediaBottomSheetState.Hidden) @@ -484,7 +484,7 @@ class MediaGalleryPresenterTest { ) initialState.eventSink(MediaGalleryEvent.OpenInfo(item)) 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)) val finalState = awaitItem() assertThat(finalState.mediaBottomSheetState).isEqualTo(MediaBottomSheetState.Hidden) diff --git a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerPresenterTest.kt b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerPresenterTest.kt index 6cf846ff78..caacb03804 100644 --- a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerPresenterTest.kt +++ b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerPresenterTest.kt @@ -273,7 +273,7 @@ class MediaViewerPresenterTest { ) ) val withInfoState = awaitItem() - assertThat(withInfoState.mediaBottomSheetState).isInstanceOf(MediaBottomSheetState.MediaDetailsBottomSheetState::class.java) + assertThat(withInfoState.mediaBottomSheetState).isInstanceOf(MediaBottomSheetState.Details::class.java) withInfoState.eventSink( MediaViewerEvent.CloseBottomSheet ) @@ -446,7 +446,7 @@ class MediaViewerPresenterTest { ) ) val withBottomSheetState = awaitItem() - assertThat(withBottomSheetState.mediaBottomSheetState).isInstanceOf(MediaBottomSheetState.MediaDeleteConfirmationState::class.java) + assertThat(withBottomSheetState.mediaBottomSheetState).isInstanceOf(MediaBottomSheetState.DeleteConfirmation::class.java) withBottomSheetState.eventSink( MediaViewerEvent.CloseBottomSheet ) @@ -506,7 +506,7 @@ class MediaViewerPresenterTest { ) ) val withBottomSheetState = awaitItem() - assertThat(withBottomSheetState.mediaBottomSheetState).isInstanceOf(MediaBottomSheetState.MediaDeleteConfirmationState::class.java) + assertThat(withBottomSheetState.mediaBottomSheetState).isInstanceOf(MediaBottomSheetState.DeleteConfirmation::class.java) updatedState.eventSink( MediaViewerEvent.Delete( eventId = AN_EVENT_ID, @@ -798,7 +798,7 @@ class MediaViewerPresenterTest { val initialState = awaitItem() initialState.eventSink(MediaViewerEvent.OpenInfo(aMediaViewerPageData())) 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)) val finalState = awaitItem() assertThat(finalState.mediaBottomSheetState).isEqualTo(MediaBottomSheetState.Hidden) @@ -827,7 +827,7 @@ class MediaViewerPresenterTest { val initialState = awaitItem() initialState.eventSink(MediaViewerEvent.OpenInfo(aMediaViewerPageData())) 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)) val finalState = awaitItem() assertThat(finalState.mediaBottomSheetState).isEqualTo(MediaBottomSheetState.Hidden) @@ -858,7 +858,7 @@ class MediaViewerPresenterTest { val initialState = awaitItem() initialState.eventSink(MediaViewerEvent.OpenInfo(aMediaViewerPageData())) 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)) val finalState = awaitItem() assertThat(finalState.mediaBottomSheetState).isEqualTo(MediaBottomSheetState.Hidden) diff --git a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerViewTest.kt b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerViewTest.kt index e5eb07b871..9eded788aa 100644 --- a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerViewTest.kt +++ b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerViewTest.kt @@ -20,7 +20,7 @@ import androidx.compose.ui.test.performTouchInput import androidx.compose.ui.test.swipeDown import androidx.test.ext.junit.runners.AndroidJUnit4 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.ui.strings.CommonStrings import io.element.android.tests.testutils.EnsureNeverCalled @@ -164,7 +164,7 @@ class MediaViewerViewTest { rule.setMediaViewerView( aMediaViewerState( listData = listOf(data), - mediaBottomSheetState = aMediaDetailsBottomSheetState(), + mediaBottomSheetState = aMediaBottomSheetStateDetails(), eventSink = eventsRecorder ), ) From b12a9ff2b908e18a404634754444d825b95f484a Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 22 Apr 2026 14:57:18 +0200 Subject: [PATCH 12/22] Improve rendering when sender does not have a display name. --- .../impl/details/MediaDetailsBottomSheet.kt | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDetailsBottomSheet.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDetailsBottomSheet.kt index a3c3d02de8..b24067e807 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDetailsBottomSheet.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDetailsBottomSheet.kt @@ -192,23 +192,26 @@ private fun SenderRow( .weight(1f), ) { // Name + val bestName = mediaInfo.senderName ?: mediaInfo.senderId?.value.orEmpty() val avatarColors = AvatarColorsProvider.provide(id) Text( modifier = Modifier.clipToBounds(), - text = mediaInfo.senderName.orEmpty(), + text = bestName, maxLines = 1, overflow = TextOverflow.Ellipsis, color = avatarColors.foreground, style = ElementTheme.typography.fontBodyMdMedium, ) // Id - Text( - text = mediaInfo.senderId?.value.orEmpty(), - color = ElementTheme.colors.textSecondary, - maxLines = 1, - overflow = TextOverflow.Ellipsis, - style = ElementTheme.typography.fontBodyMdRegular, - ) + if (!mediaInfo.senderName.isNullOrEmpty()) { + Text( + text = mediaInfo.senderId?.value.orEmpty(), + color = ElementTheme.colors.textSecondary, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + style = ElementTheme.typography.fontBodyMdRegular, + ) + } } } } From 92add858832e419e9271f1bf6a8adae389a7aeb7 Mon Sep 17 00:00:00 2001 From: ElementBot Date: Wed, 22 Apr 2026 13:54:26 +0000 Subject: [PATCH 13/22] Update screenshots --- ...pl.details_MediaDeleteConfirmationBottomSheet_Day_1_en.png | 3 +++ ....details_MediaDeleteConfirmationBottomSheet_Night_1_en.png | 3 +++ ...iaviewer.impl.details_MediaDetailsBottomSheet_Day_2_en.png | 4 ++-- ...viewer.impl.details_MediaDetailsBottomSheet_Night_2_en.png | 4 ++-- 4 files changed, 10 insertions(+), 4 deletions(-) create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDeleteConfirmationBottomSheet_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDeleteConfirmationBottomSheet_Night_1_en.png diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDeleteConfirmationBottomSheet_Day_1_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDeleteConfirmationBottomSheet_Day_1_en.png new file mode 100644 index 0000000000..9738b22d77 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDeleteConfirmationBottomSheet_Day_1_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:18b494c43b9fa9535d7e3dd4a7b70f9b17bb630b1273495ce8318c397f4a8b5e +size 43556 diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDeleteConfirmationBottomSheet_Night_1_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDeleteConfirmationBottomSheet_Night_1_en.png new file mode 100644 index 0000000000..05c5ee2803 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDeleteConfirmationBottomSheet_Night_1_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:60e267a641d11da48b69caedddb3ee8827365ebd6bf252af12f59f5ddbaceece +size 42133 diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_2_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_2_en.png index 909387767f..115b18844c 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_2_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_2_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:070e17d4807133d5966bd3f2ae52df258294466479e2fe96a7943571b0fa81e7 -size 40068 +oid sha256:534e603e9cf5423d37f0cf710be1e49e424209306fa24ce68c53c10bc6e68c6a +size 40237 diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_2_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_2_en.png index a77470a1b0..8abc1bfa7e 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_2_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_2_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b3b0f78545228d76ef59bd777eec4dd72b0dbcef8b7bae51b6f3c05b0f1cbd87 -size 38943 +oid sha256:e29a3103f566ce4400f05366c921e1f50e6c31edb8443afd81e2873de504a397 +size 39135 From bbb4a47eff0986760138767c341372fcb5a035ae Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 23 Apr 2026 11:20:20 +0200 Subject: [PATCH 14/22] MediaDetailsBottomSheet: iterate on design. Closes #6645 --- .../components/avatar/AvatarSize.kt | 2 +- .../impl/details/MediaDetailsBottomSheet.kt | 143 ++++++++++-------- .../impl/src/main/res/values/localazy.xml | 1 + 3 files changed, 80 insertions(+), 66 deletions(-) diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/AvatarSize.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/AvatarSize.kt index 660b071983..320457cedd 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/AvatarSize.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/AvatarSize.kt @@ -65,7 +65,7 @@ enum class AvatarSize(val dp: Dp) { KnockRequestItem(52.dp), KnockRequestBanner(32.dp), - MediaSender(32.dp), + MediaSender(52.dp), DmCreationConfirmation(64.dp), diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDetailsBottomSheet.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDetailsBottomSheet.kt index b24067e807..74e4621066 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDetailsBottomSheet.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDetailsBottomSheet.kt @@ -10,6 +10,7 @@ package io.element.android.libraries.mediaviewer.impl.details import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.ColumnScope import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth @@ -24,6 +25,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clipToBounds import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.unit.dp @@ -72,9 +74,8 @@ fun MediaDetailsBottomSheet( modifier = Modifier .fillMaxWidth() .verticalScroll(rememberScrollState()), - horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.spacedBy(24.dp), ) { + Title() Section( title = stringResource(R.string.screen_media_details_uploaded_by), ) { @@ -94,73 +95,72 @@ fun MediaDetailsBottomSheet( title = stringResource(R.string.screen_media_details_file_format), text = state.mediaInfo.mimeType + " - " + state.mediaInfo.formattedFileSize, ) + Spacer(modifier = Modifier.height(16.dp)) if (state.eventId != null) { - Column { + HorizontalDivider() + ListItem( + leadingContent = ListItemContent.Icon(IconSource.Vector(CompoundIcons.VisibilityOn())), + headlineContent = { Text(stringResource(CommonStrings.action_view_in_timeline)) }, + style = ListItemStyle.Primary, + onClick = { + onViewInTimeline(state.eventId) + } + ) + ListItem( + leadingContent = ListItemContent.Icon(IconSource.Vector(CompoundIcons.ShareAndroid())), + headlineContent = { Text(stringResource(CommonStrings.action_share)) }, + style = ListItemStyle.Primary, + onClick = { + onShare(state.eventId) + } + ) + ListItem( + leadingContent = ListItemContent.Icon(IconSource.Vector(CompoundIcons.Forward())), + headlineContent = { Text(stringResource(CommonStrings.action_forward)) }, + style = ListItemStyle.Primary, + onClick = { + onForward(state.eventId) + } + ) + ListItem( + leadingContent = ListItemContent.Icon(IconSource.Vector(CompoundIcons.Download())), + headlineContent = { Text(stringResource(CommonStrings.action_download)) }, + style = ListItemStyle.Primary, + onClick = { + onDownload(state.eventId) + } + ) + val mimeType = state.mediaInfo.mimeType + val icon = when (mimeType) { + MimeTypes.Apk -> + ListItemContent.Icon(IconSource.Resource(R.drawable.ic_apk_install)) + else -> + ListItemContent.Icon(IconSource.Vector(CompoundIcons.PopOut())) + } + val wording = when (mimeType) { + MimeTypes.Apk -> stringResource(id = CommonStrings.common_install_apk_android) + else -> stringResource(id = CommonStrings.action_open_with) + } + ListItem( + leadingContent = icon, + headlineContent = { Text(wording) }, + style = ListItemStyle.Primary, + onClick = { + onOpenWith(state.eventId) + } + ) + if (state.canDelete) { HorizontalDivider() ListItem( - leadingContent = ListItemContent.Icon(IconSource.Vector(CompoundIcons.VisibilityOn())), - headlineContent = { Text(stringResource(CommonStrings.action_view_in_timeline)) }, - style = ListItemStyle.Primary, + leadingContent = ListItemContent.Icon(IconSource.Vector(CompoundIcons.Delete())), + headlineContent = { Text(stringResource(CommonStrings.action_delete)) }, + style = ListItemStyle.Destructive, onClick = { - onViewInTimeline(state.eventId) + onDelete(state.eventId) } ) - ListItem( - leadingContent = ListItemContent.Icon(IconSource.Vector(CompoundIcons.ShareAndroid())), - headlineContent = { Text(stringResource(CommonStrings.action_share)) }, - style = ListItemStyle.Primary, - onClick = { - onShare(state.eventId) - } - ) - ListItem( - leadingContent = ListItemContent.Icon(IconSource.Vector(CompoundIcons.Forward())), - headlineContent = { Text(stringResource(CommonStrings.action_forward)) }, - style = ListItemStyle.Primary, - onClick = { - onForward(state.eventId) - } - ) - ListItem( - leadingContent = ListItemContent.Icon(IconSource.Vector(CompoundIcons.Download())), - headlineContent = { Text(stringResource(CommonStrings.action_download)) }, - style = ListItemStyle.Primary, - onClick = { - onDownload(state.eventId) - } - ) - val mimeType = state.mediaInfo.mimeType - val icon = when (mimeType) { - MimeTypes.Apk -> - ListItemContent.Icon(IconSource.Resource(R.drawable.ic_apk_install)) - else -> - ListItemContent.Icon(IconSource.Vector(CompoundIcons.PopOut())) - } - val wording = when (mimeType) { - MimeTypes.Apk -> stringResource(id = CommonStrings.common_install_apk_android) - else -> stringResource(id = CommonStrings.action_open_with) - } - ListItem( - leadingContent = icon, - headlineContent = { Text(wording) }, - style = ListItemStyle.Primary, - onClick = { - onOpenWith(state.eventId) - } - ) - if (state.canDelete) { - HorizontalDivider() - ListItem( - leadingContent = ListItemContent.Icon(IconSource.Vector(CompoundIcons.Delete())), - headlineContent = { Text(stringResource(CommonStrings.action_delete)) }, - style = ListItemStyle.Destructive, - onClick = { - onDelete(state.eventId) - } - ) - } - Spacer(modifier = Modifier.height(16.dp)) } + Spacer(modifier = Modifier.height(16.dp)) } } } @@ -216,6 +216,19 @@ private fun SenderRow( } } +@Composable +private fun ColumnScope.Title() { + Text( + modifier = Modifier + .align(Alignment.CenterHorizontally) + .padding(top = 16.dp, bottom = 8.dp, start = 16.dp, end = 16.dp), + text = stringResource(R.string.screen_media_details_title), + textAlign = TextAlign.Center, + style = ElementTheme.typography.fontBodyLgMedium, + color = ElementTheme.colors.textPrimary, + ) +} + @Composable private fun Section( title: String, @@ -224,12 +237,12 @@ private fun Section( Column( modifier = Modifier .fillMaxWidth() - .padding(horizontal = 16.dp), + .padding(vertical = 8.dp, horizontal = 16.dp), verticalArrangement = Arrangement.spacedBy(8.dp), ) { Text( - text = title.uppercase(), - style = ElementTheme.typography.fontBodySmRegular, + text = title, + style = ElementTheme.typography.fontBodyMdMedium, color = ElementTheme.colors.textSecondary, ) content() diff --git a/libraries/mediaviewer/impl/src/main/res/values/localazy.xml b/libraries/mediaviewer/impl/src/main/res/values/localazy.xml index 2982f8002f..760ba2e7dc 100644 --- a/libraries/mediaviewer/impl/src/main/res/values/localazy.xml +++ b/libraries/mediaviewer/impl/src/main/res/values/localazy.xml @@ -16,6 +16,7 @@ "File name" "No more files to show" "No more media to show" + "File info" "Uploaded by" "Uploaded on" From 09e0d2d1665a2d6c4691aa5cd8c4bc17b372ed2e Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 23 Apr 2026 11:22:47 +0200 Subject: [PATCH 15/22] MediaDetailsBottomSheet: Add missing preview case. --- .../impl/details/MediaBottomSheetStateDetailsProvider.kt | 6 +++++- .../mediaviewer/impl/details/MediaDetailsBottomSheet.kt | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaBottomSheetStateDetailsProvider.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaBottomSheetStateDetailsProvider.kt index ad8e6e30a0..de21ff667d 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaBottomSheetStateDetailsProvider.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaBottomSheetStateDetailsProvider.kt @@ -23,17 +23,21 @@ open class MediaBottomSheetStateDetailsProvider : PreviewParameterProvider Date: Thu, 23 Apr 2026 09:40:14 +0000 Subject: [PATCH 16/22] Update screenshots --- ...iaviewer.impl.details_MediaDetailsBottomSheet_Day_0_en.png | 4 ++-- ...iaviewer.impl.details_MediaDetailsBottomSheet_Day_1_en.png | 4 ++-- ...iaviewer.impl.details_MediaDetailsBottomSheet_Day_2_en.png | 4 ++-- ...iaviewer.impl.details_MediaDetailsBottomSheet_Day_3_en.png | 3 +++ ...viewer.impl.details_MediaDetailsBottomSheet_Night_0_en.png | 4 ++-- ...viewer.impl.details_MediaDetailsBottomSheet_Night_1_en.png | 4 ++-- ...viewer.impl.details_MediaDetailsBottomSheet_Night_2_en.png | 4 ++-- ...viewer.impl.details_MediaDetailsBottomSheet_Night_3_en.png | 3 +++ ...ies.mediaviewer.impl.gallery_MediaGalleryView_Day_8_en.png | 4 ++-- ...s.mediaviewer.impl.gallery_MediaGalleryView_Night_8_en.png | 4 ++-- ...mediaviewer.impl.viewer_MediaViewerViewLandscape_11_en.png | 4 ++-- ...ibraries.mediaviewer.impl.viewer_MediaViewerView_11_en.png | 4 ++-- 12 files changed, 26 insertions(+), 20 deletions(-) create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_3_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_3_en.png diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_0_en.png index 5a9605e9dd..6875fb8c82 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_0_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:fd9027f3684b91a8867bf0cb7c1eb3925edfc4982d40cc33414997e38c068d45 -size 40887 +oid sha256:e630a264276ce61b6661bbd907c9c66d57471d5ae3a0194c4f452ad865410f21 +size 41161 diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_1_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_1_en.png index c48dc8fdf9..6875fb8c82 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_1_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_1_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:736ac91d14dd16f8d1cc7040fc69c08c97d2525c3876b90376a85764157e2910 -size 40859 +oid sha256:e630a264276ce61b6661bbd907c9c66d57471d5ae3a0194c4f452ad865410f21 +size 41161 diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_2_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_2_en.png index 115b18844c..9f41fd0cb9 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_2_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_2_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:534e603e9cf5423d37f0cf710be1e49e424209306fa24ce68c53c10bc6e68c6a -size 40237 +oid sha256:d842fb5cacf27fcb2bb0a983d34b5955475f8c127f129e9e22f064e1716a2ff5 +size 40596 diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_3_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_3_en.png new file mode 100644 index 0000000000..d8e71e8e59 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_3_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:865e66b2d88ad172deea40315da88e8d0bd4647ebeaa3327646ebaaf9101fa10 +size 31414 diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_0_en.png index cdddf1c59c..6e1fabefb6 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_0_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6c9d002e8d23dc85be883fae56d1266dadfd9fbd73a9b8a396b8953be9b7ff23 -size 39445 +oid sha256:5b637a243fdbcb212a644b5250a3b7840150bc2de250184cfd8d503ca0fa0400 +size 39983 diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_1_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_1_en.png index 6c2870a35f..6e1fabefb6 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_1_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_1_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7982c873e18aeb3c2ae32638bc0c6be7a36f9b2326e303306c5c63a2ebeebbab -size 39429 +oid sha256:5b637a243fdbcb212a644b5250a3b7840150bc2de250184cfd8d503ca0fa0400 +size 39983 diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_2_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_2_en.png index 8abc1bfa7e..68241c9cfe 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_2_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_2_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e29a3103f566ce4400f05366c921e1f50e6c31edb8443afd81e2873de504a397 -size 39135 +oid sha256:273b69361a9190b0e6c0a5487f22c910e803afc5cde5bc91d2cbe920b0bcaa14 +size 39662 diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_3_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_3_en.png new file mode 100644 index 0000000000..e7db1044b7 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_3_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:821914e5a21df26cf8cec6f391f9560bef3392f8d1ffae2ec862f87686a02149 +size 29996 diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_8_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_8_en.png index f6769f22ba..2449b7450a 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_8_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_8_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:41d66efcb35b7c75452311d7646c73a66e2906cda1ee6da99d9b216121a8f073 -size 40805 +oid sha256:a99991c09e28f2cb87dcecebc83fe62c77323cc1126e643a11cc66d198f0b2da +size 41079 diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_8_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_8_en.png index 253add27e2..5c7c878b2e 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_8_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_8_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b704a5672030f94f4d331784c5307f38b156e11dc69e9b17890a0aef3de26241 -size 39241 +oid sha256:ca9a11f1bce2572ad55e8763470f9498754613ac2b3cc2960cc6ee22ccb2a422 +size 39764 diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_11_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_11_en.png index e4424188e6..09797bc372 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_11_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_11_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8d6ab1331e65a4d02accb4d20c899a06c37a022d9f9080133799e30763969300 -size 26774 +oid sha256:36de9783112b421c13530eff9eda026b7ba4e6a721cfd75bb2bca7e2b32cb84a +size 26140 diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_11_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_11_en.png index 253add27e2..5c7c878b2e 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_11_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_11_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b704a5672030f94f4d331784c5307f38b156e11dc69e9b17890a0aef3de26241 -size 39241 +oid sha256:ca9a11f1bce2572ad55e8763470f9498754613ac2b3cc2960cc6ee22ccb2a422 +size 39764 From 1c229e7229b148fb7653dcbcf459d39d93d62dc5 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 24 Apr 2026 14:28:52 +0200 Subject: [PATCH 17/22] =?UTF-8?q?Replace=20"=20-=20"=20by=20"=20=E2=80=A2?= =?UTF-8?q?=20"=20as=20it=20renders=20better.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/ui/VerificationContentVerifying.kt | 3 ++- .../details/MediaDeleteConfirmationBottomSheet.kt | 3 ++- .../impl/details/MediaDetailsBottomSheet.kt | 3 ++- .../mediaviewer/impl/local/audio/MediaMetadata.kt | 5 +++-- .../element/android/libraries/ui/strings/Strings.kt | 12 ++++++++++++ 5 files changed, 21 insertions(+), 5 deletions(-) create mode 100644 libraries/ui-strings/src/main/kotlin/io/element/android/libraries/ui/strings/Strings.kt diff --git a/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/ui/VerificationContentVerifying.kt b/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/ui/VerificationContentVerifying.kt index 6fc593ffb2..891b2a108c 100644 --- a/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/ui/VerificationContentVerifying.kt +++ b/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/ui/VerificationContentVerifying.kt @@ -35,6 +35,7 @@ import io.element.android.features.verifysession.impl.emoji.toEmojiResource import io.element.android.libraries.designsystem.theme.components.Text import io.element.android.libraries.matrix.api.verification.SessionVerificationData import io.element.android.libraries.matrix.api.verification.VerificationEmoji +import io.element.android.libraries.ui.strings.Strings @Composable internal fun VerificationContentVerifying( @@ -49,7 +50,7 @@ internal fun VerificationContentVerifying( ) { when (data) { is SessionVerificationData.Decimals -> { - val text = data.decimals.joinToString(separator = " - ") + val text = data.decimals.joinToString(separator = Strings.NICE_SEPARATOR) Text( modifier = Modifier .fillMaxWidth() diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDeleteConfirmationBottomSheet.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDeleteConfirmationBottomSheet.kt index 84712eb10a..f13e2f1600 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDeleteConfirmationBottomSheet.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDeleteConfirmationBottomSheet.kt @@ -46,6 +46,7 @@ import io.element.android.libraries.matrix.api.core.EventId import io.element.android.libraries.matrix.ui.media.MediaRequestData import io.element.android.libraries.mediaviewer.impl.R import io.element.android.libraries.ui.strings.CommonStrings +import io.element.android.libraries.ui.strings.Strings @OptIn(ExperimentalMaterial3Api::class) @Composable @@ -149,7 +150,7 @@ private fun MediaRow( ) // Info Text( - text = state.mediaInfo.mimeType + " - " + state.mediaInfo.formattedFileSize, + text = state.mediaInfo.mimeType + Strings.NICE_SEPARATOR + state.mediaInfo.formattedFileSize, color = ElementTheme.colors.textSecondary, maxLines = 1, overflow = TextOverflow.Ellipsis, diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDetailsBottomSheet.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDetailsBottomSheet.kt index 5ace40a0d1..a433abbf39 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDetailsBottomSheet.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDetailsBottomSheet.kt @@ -49,6 +49,7 @@ import io.element.android.libraries.matrix.api.core.EventId import io.element.android.libraries.mediaviewer.api.MediaInfo import io.element.android.libraries.mediaviewer.impl.R import io.element.android.libraries.ui.strings.CommonStrings +import io.element.android.libraries.ui.strings.Strings /** * Ref: https://www.figma.com/design/pDlJZGBsri47FNTXMnEdXB/Compound-Android-Templates?node-id=2229-149220 @@ -93,7 +94,7 @@ fun MediaDetailsBottomSheet( ) SectionText( title = stringResource(R.string.screen_media_details_file_format), - text = state.mediaInfo.mimeType + " - " + state.mediaInfo.formattedFileSize, + text = state.mediaInfo.mimeType + Strings.NICE_SEPARATOR + state.mediaInfo.formattedFileSize, ) Spacer(modifier = Modifier.height(16.dp)) if (state.eventId != null) { diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/audio/MediaMetadata.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/audio/MediaMetadata.kt index 4c267a54dc..dc0090298c 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/audio/MediaMetadata.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/audio/MediaMetadata.kt @@ -9,6 +9,7 @@ package io.element.android.libraries.mediaviewer.impl.local.audio import androidx.media3.common.MediaMetadata +import io.element.android.libraries.ui.strings.Strings fun MediaMetadata?.hasArtwork(): Boolean { return this?.artworkData != null || this?.artworkUri != null @@ -22,13 +23,13 @@ fun MediaMetadata?.buildInfo(): String { } if (title != null) { if (isNotEmpty()) { - append(" - ") + append(Strings.NICE_SEPARATOR) } append(title) } if (recordingYear != null) { if (isNotEmpty()) { - append(" - ") + append(Strings.NICE_SEPARATOR) } append(recordingYear) } diff --git a/libraries/ui-strings/src/main/kotlin/io/element/android/libraries/ui/strings/Strings.kt b/libraries/ui-strings/src/main/kotlin/io/element/android/libraries/ui/strings/Strings.kt new file mode 100644 index 0000000000..c4566a5db2 --- /dev/null +++ b/libraries/ui-strings/src/main/kotlin/io/element/android/libraries/ui/strings/Strings.kt @@ -0,0 +1,12 @@ +/* + * Copyright (c) 2026 Element Creations 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.ui.strings + +object Strings { + const val NICE_SEPARATOR = " • " +} From de7b4002d8d5953a7304fc01237b1a666124f0c0 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 24 Apr 2026 15:16:26 +0200 Subject: [PATCH 18/22] MediaDetailsBottomSheet: update wording. --- libraries/mediaviewer/impl/src/main/res/values/localazy.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/mediaviewer/impl/src/main/res/values/localazy.xml b/libraries/mediaviewer/impl/src/main/res/values/localazy.xml index 760ba2e7dc..02a16a8736 100644 --- a/libraries/mediaviewer/impl/src/main/res/values/localazy.xml +++ b/libraries/mediaviewer/impl/src/main/res/values/localazy.xml @@ -12,8 +12,8 @@ "Images and videos uploaded to this room will be shown here." "No media uploaded yet" "Media and files" - "File format" - "File name" + "Format" + "Name" "No more files to show" "No more media to show" "File info" From 592980613793b82ac389c0b4061bbe6b09320013 Mon Sep 17 00:00:00 2001 From: ElementBot Date: Fri, 24 Apr 2026 13:34:34 +0000 Subject: [PATCH 19/22] Update screenshots --- ...ession.impl.incoming_IncomingVerificationView_Day_9_en.png | 4 ++-- ...sion.impl.incoming_IncomingVerificationView_Night_9_en.png | 4 ++-- ...ession.impl.outgoing_OutgoingVerificationView_Day_9_en.png | 4 ++-- ...sion.impl.outgoing_OutgoingVerificationView_Night_9_en.png | 4 ++-- ...pl.details_MediaDeleteConfirmationBottomSheet_Day_0_en.png | 4 ++-- ...pl.details_MediaDeleteConfirmationBottomSheet_Day_1_en.png | 4 ++-- ....details_MediaDeleteConfirmationBottomSheet_Night_0_en.png | 4 ++-- ....details_MediaDeleteConfirmationBottomSheet_Night_1_en.png | 4 ++-- ...iaviewer.impl.details_MediaDetailsBottomSheet_Day_0_en.png | 4 ++-- ...iaviewer.impl.details_MediaDetailsBottomSheet_Day_1_en.png | 4 ++-- ...iaviewer.impl.details_MediaDetailsBottomSheet_Day_2_en.png | 4 ++-- ...iaviewer.impl.details_MediaDetailsBottomSheet_Day_3_en.png | 4 ++-- ...viewer.impl.details_MediaDetailsBottomSheet_Night_0_en.png | 4 ++-- ...viewer.impl.details_MediaDetailsBottomSheet_Night_1_en.png | 4 ++-- ...viewer.impl.details_MediaDetailsBottomSheet_Night_2_en.png | 4 ++-- ...viewer.impl.details_MediaDetailsBottomSheet_Night_3_en.png | 4 ++-- ...ies.mediaviewer.impl.gallery_MediaGalleryView_Day_8_en.png | 4 ++-- ...s.mediaviewer.impl.gallery_MediaGalleryView_Night_8_en.png | 4 ++-- ...mediaviewer.impl.viewer_MediaViewerViewLandscape_11_en.png | 4 ++-- ...mediaviewer.impl.viewer_MediaViewerViewLandscape_12_en.png | 4 ++-- ...ibraries.mediaviewer.impl.viewer_MediaViewerView_11_en.png | 4 ++-- ...ibraries.mediaviewer.impl.viewer_MediaViewerView_12_en.png | 4 ++-- 22 files changed, 44 insertions(+), 44 deletions(-) diff --git a/tests/uitests/src/test/snapshots/images/features.verifysession.impl.incoming_IncomingVerificationView_Day_9_en.png b/tests/uitests/src/test/snapshots/images/features.verifysession.impl.incoming_IncomingVerificationView_Day_9_en.png index 59ce066fe9..3639cb1312 100644 --- a/tests/uitests/src/test/snapshots/images/features.verifysession.impl.incoming_IncomingVerificationView_Day_9_en.png +++ b/tests/uitests/src/test/snapshots/images/features.verifysession.impl.incoming_IncomingVerificationView_Day_9_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e40914567317a9cbecd3638bf23cba6ffbaa9be24733909aa58cb8d84a64c463 -size 31169 +oid sha256:4c1298d7a7bef09a72be97f859448a877594088482de6e1fc2660e1a5dcb0869 +size 31354 diff --git a/tests/uitests/src/test/snapshots/images/features.verifysession.impl.incoming_IncomingVerificationView_Night_9_en.png b/tests/uitests/src/test/snapshots/images/features.verifysession.impl.incoming_IncomingVerificationView_Night_9_en.png index 8315edcfd1..841dd9f1bc 100644 --- a/tests/uitests/src/test/snapshots/images/features.verifysession.impl.incoming_IncomingVerificationView_Night_9_en.png +++ b/tests/uitests/src/test/snapshots/images/features.verifysession.impl.incoming_IncomingVerificationView_Night_9_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:19e65122fd39fbf25050c9e982285fea34c4fec06647d713c8ea78c2c813ea5a -size 30478 +oid sha256:621db291024ceaa9bba2bc3e71a68b6fc67dab8055ede0595f0519499324b483 +size 30644 diff --git a/tests/uitests/src/test/snapshots/images/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_9_en.png b/tests/uitests/src/test/snapshots/images/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_9_en.png index 59ce066fe9..3639cb1312 100644 --- a/tests/uitests/src/test/snapshots/images/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_9_en.png +++ b/tests/uitests/src/test/snapshots/images/features.verifysession.impl.outgoing_OutgoingVerificationView_Day_9_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e40914567317a9cbecd3638bf23cba6ffbaa9be24733909aa58cb8d84a64c463 -size 31169 +oid sha256:4c1298d7a7bef09a72be97f859448a877594088482de6e1fc2660e1a5dcb0869 +size 31354 diff --git a/tests/uitests/src/test/snapshots/images/features.verifysession.impl.outgoing_OutgoingVerificationView_Night_9_en.png b/tests/uitests/src/test/snapshots/images/features.verifysession.impl.outgoing_OutgoingVerificationView_Night_9_en.png index 8315edcfd1..841dd9f1bc 100644 --- a/tests/uitests/src/test/snapshots/images/features.verifysession.impl.outgoing_OutgoingVerificationView_Night_9_en.png +++ b/tests/uitests/src/test/snapshots/images/features.verifysession.impl.outgoing_OutgoingVerificationView_Night_9_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:19e65122fd39fbf25050c9e982285fea34c4fec06647d713c8ea78c2c813ea5a -size 30478 +oid sha256:621db291024ceaa9bba2bc3e71a68b6fc67dab8055ede0595f0519499324b483 +size 30644 diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDeleteConfirmationBottomSheet_Day_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDeleteConfirmationBottomSheet_Day_0_en.png index 9b60b2ece6..355afd8b64 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDeleteConfirmationBottomSheet_Day_0_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDeleteConfirmationBottomSheet_Day_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:08a9c400585956485c4a18bafa78ba4fa8eee8b98fce657077777686871041b5 -size 31010 +oid sha256:2222b0d2d1589df67d73aad8eee9a1f30efb1392e0c5493f47f69cac01c8710b +size 31044 diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDeleteConfirmationBottomSheet_Day_1_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDeleteConfirmationBottomSheet_Day_1_en.png index 9738b22d77..851f4f8125 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDeleteConfirmationBottomSheet_Day_1_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDeleteConfirmationBottomSheet_Day_1_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:18b494c43b9fa9535d7e3dd4a7b70f9b17bb630b1273495ce8318c397f4a8b5e -size 43556 +oid sha256:20fa72623728a8f1b8206af75dcba3b83384aeab2977fde952bc4d3000aa7d7b +size 43579 diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDeleteConfirmationBottomSheet_Night_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDeleteConfirmationBottomSheet_Night_0_en.png index d913afbcbd..e1cf8ac4eb 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDeleteConfirmationBottomSheet_Night_0_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDeleteConfirmationBottomSheet_Night_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6e7825e195725479409a23b626771fe207debec55953c0869e5dd9bcae210dc7 -size 29529 +oid sha256:ada067f89b469fccaaf4b9751c0469a9f776ef6206d5ebbb68b7b2128d77ce3c +size 29564 diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDeleteConfirmationBottomSheet_Night_1_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDeleteConfirmationBottomSheet_Night_1_en.png index 05c5ee2803..24793ec7c9 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDeleteConfirmationBottomSheet_Night_1_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDeleteConfirmationBottomSheet_Night_1_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:60e267a641d11da48b69caedddb3ee8827365ebd6bf252af12f59f5ddbaceece -size 42133 +oid sha256:f717f0e4ea67364e505e8c756931d11bdb696d7be5f11bb155f085c9f2a668cc +size 42149 diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_0_en.png index 6875fb8c82..8a527331d9 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_0_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e630a264276ce61b6661bbd907c9c66d57471d5ae3a0194c4f452ad865410f21 -size 41161 +oid sha256:67be1e8e93d0c10366f4b37f14ca0f90c1f4ccd5da9024c9a396d3d46507e18c +size 40339 diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_1_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_1_en.png index 6875fb8c82..8a527331d9 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_1_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_1_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e630a264276ce61b6661bbd907c9c66d57471d5ae3a0194c4f452ad865410f21 -size 41161 +oid sha256:67be1e8e93d0c10366f4b37f14ca0f90c1f4ccd5da9024c9a396d3d46507e18c +size 40339 diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_2_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_2_en.png index 9f41fd0cb9..31159650e7 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_2_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_2_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d842fb5cacf27fcb2bb0a983d34b5955475f8c127f129e9e22f064e1716a2ff5 -size 40596 +oid sha256:6fd553034a694bcba932cfe2bf575b413a98b46f49bdcfd7426eff9571a89204 +size 39786 diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_3_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_3_en.png index d8e71e8e59..69da701004 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_3_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_3_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:865e66b2d88ad172deea40315da88e8d0bd4647ebeaa3327646ebaaf9101fa10 -size 31414 +oid sha256:6144f221b9d11c70d15b54321bfbff3d1de1454e6c73be34d7b2e82bd1625a94 +size 30701 diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_0_en.png index 6e1fabefb6..e16a2bc691 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_0_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5b637a243fdbcb212a644b5250a3b7840150bc2de250184cfd8d503ca0fa0400 -size 39983 +oid sha256:a512016e96b933f6089e60b634fa77f140dfa7de50d3a8c1a62092ad552d7f2d +size 39216 diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_1_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_1_en.png index 6e1fabefb6..e16a2bc691 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_1_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_1_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5b637a243fdbcb212a644b5250a3b7840150bc2de250184cfd8d503ca0fa0400 -size 39983 +oid sha256:a512016e96b933f6089e60b634fa77f140dfa7de50d3a8c1a62092ad552d7f2d +size 39216 diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_2_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_2_en.png index 68241c9cfe..94c9bdb789 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_2_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_2_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:273b69361a9190b0e6c0a5487f22c910e803afc5cde5bc91d2cbe920b0bcaa14 -size 39662 +oid sha256:e17cfdc4028958cafd87a82754c033290010223558ef2115253c9384a547a31e +size 38925 diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_3_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_3_en.png index e7db1044b7..2534bd5d0c 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_3_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_3_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:821914e5a21df26cf8cec6f391f9560bef3392f8d1ffae2ec862f87686a02149 -size 29996 +oid sha256:2898f00a828a69ce9cdd56994d7878f6aae8c5b2ea5d1150df57aa2ebd7e537b +size 29233 diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_8_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_8_en.png index 2449b7450a..809459297c 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_8_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_8_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a99991c09e28f2cb87dcecebc83fe62c77323cc1126e643a11cc66d198f0b2da -size 41079 +oid sha256:3ddbddbf5303bb86f901cdd880ca2fde15c7c4af22dd7cf1a7903dcab5df25b3 +size 40254 diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_8_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_8_en.png index 5c7c878b2e..1ceb7c6b68 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_8_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_8_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ca9a11f1bce2572ad55e8763470f9498754613ac2b3cc2960cc6ee22ccb2a422 -size 39764 +oid sha256:89e17d0b8fdd749b6e97385e8369132d52b0e10adf7d23157c3bdbeb7721e694 +size 39007 diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_11_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_11_en.png index 09797bc372..41e45ad002 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_11_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_11_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:36de9783112b421c13530eff9eda026b7ba4e6a721cfd75bb2bca7e2b32cb84a -size 26140 +oid sha256:e641d1d6604b6c5f489ab38438d9f3b8dcea9802113011200e9ea589c4e2dbee +size 25310 diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_12_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_12_en.png index 3dccb4c068..99f5bb1dae 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_12_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_12_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:010120cbcbfed1e7bfa3fb4c88df6e1098d0382cb1834f1a8046e312434f201d -size 26549 +oid sha256:89da32776c436ca00045afb76f42c5f0e5c59f6d682d59a3204461b10ea95474 +size 26617 diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_11_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_11_en.png index 5c7c878b2e..1ceb7c6b68 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_11_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_11_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ca9a11f1bce2572ad55e8763470f9498754613ac2b3cc2960cc6ee22ccb2a422 -size 39764 +oid sha256:89e17d0b8fdd749b6e97385e8369132d52b0e10adf7d23157c3bdbeb7721e694 +size 39007 diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_12_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_12_en.png index 1259041506..c38069d18e 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_12_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.viewer_MediaViewerView_12_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7e15267ee448fae18a63022ab464769528b07585f13ccdb2e8c5589584759d69 -size 31485 +oid sha256:4c9c5240346788914d7ab6a825c38f6fc2d6dba8bdc2879c2657cdafe3718b34 +size 31511 From c283f0109be5321be8ca4755a4354c6da6cf0aec Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 24 Apr 2026 16:16:15 +0200 Subject: [PATCH 20/22] a11y: add heading to the title. --- .../mediaviewer/impl/details/MediaDetailsBottomSheet.kt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDetailsBottomSheet.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDetailsBottomSheet.kt index a433abbf39..9ce2dc4a7f 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDetailsBottomSheet.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDetailsBottomSheet.kt @@ -25,6 +25,8 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clipToBounds import androidx.compose.ui.res.stringResource +import androidx.compose.ui.semantics.heading +import androidx.compose.ui.semantics.semantics import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.PreviewParameter @@ -222,7 +224,10 @@ private fun ColumnScope.Title() { Text( modifier = Modifier .align(Alignment.CenterHorizontally) - .padding(top = 16.dp, bottom = 8.dp, start = 16.dp, end = 16.dp), + .padding(top = 16.dp, bottom = 8.dp, start = 16.dp, end = 16.dp) + .semantics { + heading() + }, text = stringResource(R.string.screen_media_details_title), textAlign = TextAlign.Center, style = ElementTheme.typography.fontBodyLgMedium, From fb50fce64936f61834a8aa0ea30fba94fb05dc37 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 24 Apr 2026 16:53:30 +0200 Subject: [PATCH 21/22] Ensure preview has a date --- .../impl/details/MediaBottomSheetStateDetailsProvider.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaBottomSheetStateDetailsProvider.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaBottomSheetStateDetailsProvider.kt index de21ff667d..e79bfa5e77 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaBottomSheetStateDetailsProvider.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaBottomSheetStateDetailsProvider.kt @@ -21,7 +21,9 @@ open class MediaBottomSheetStateDetailsProvider : PreviewParameterProvider Date: Fri, 24 Apr 2026 15:12:13 +0000 Subject: [PATCH 22/22] Update screenshots --- ...iaviewer.impl.details_MediaDetailsBottomSheet_Day_2_en.png | 4 ++-- ...viewer.impl.details_MediaDetailsBottomSheet_Night_2_en.png | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_2_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_2_en.png index 31159650e7..d53b0ecf7e 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_2_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_2_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6fd553034a694bcba932cfe2bf575b413a98b46f49bdcfd7426eff9571a89204 -size 39786 +oid sha256:3f89a1039bc2d101af319c0b6259d8eebc9d313ae34947aedee525945be23799 +size 44604 diff --git a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_2_en.png b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_2_en.png index 94c9bdb789..e36f282ba2 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_2_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_2_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e17cfdc4028958cafd87a82754c033290010223558ef2115253c9384a547a31e -size 38925 +oid sha256:8608e63ef9ff79fd698c202d60a8c73f8874f8610601a0ff6dc85663ed82c7da +size 43537