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,