diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/EventItemFactory.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/EventItemFactory.kt index fbd4f647bc..b039cef4e8 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/EventItemFactory.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/EventItemFactory.kt @@ -104,7 +104,6 @@ class EventItemFactory @Inject constructor( waveform = null, ), mediaSource = type.source, - duration = type.info?.duration?.inWholeMilliseconds?.toHumanReadableDuration(), ) is FileMessageType -> MediaItem.File( id = currentTimelineItem.uniqueId, 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 f0497250b0..9508fb42d3 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 @@ -267,24 +267,18 @@ private fun MediaGalleryFilesList( items(files) { item -> when (item) { is MediaItem.File -> FileItemView( - item, + file = item, onClick = { onItemClick(item) }, - onShareClick = { eventSink(MediaGalleryEvents.Share(item)) }, - onDownloadClick = { eventSink(MediaGalleryEvents.SaveOnDisk(item)) }, - onInfoClick = { eventSink(MediaGalleryEvents.OpenInfo(item)) }, ) is MediaItem.Audio -> AudioItemView( - item, + audio = item, onClick = { onItemClick(item) }, - onShareClick = { eventSink(MediaGalleryEvents.Share(item)) }, - onDownloadClick = { eventSink(MediaGalleryEvents.SaveOnDisk(item)) }, - onInfoClick = { eventSink(MediaGalleryEvents.OpenInfo(item)) }, ) is MediaItem.Voice -> { val presenter: Presenter = presenterFactories.rememberPresenter(item) VoiceItemView( - presenter.present(), - item, + state = presenter.present(), + voice = item, onShareClick = { eventSink(MediaGalleryEvents.Share(item)) }, onDownloadClick = { eventSink(MediaGalleryEvents.SaveOnDisk(item)) }, onInfoClick = { eventSink(MediaGalleryEvents.OpenInfo(item)) }, diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaItem.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaItem.kt index 222f620ec5..05b6937c15 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaItem.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaItem.kt @@ -57,7 +57,6 @@ sealed interface MediaItem { val eventId: EventId?, val mediaInfo: MediaInfo, val mediaSource: MediaSource, - val duration: String?, ) : Event data class Voice( diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/ui/AudioItemView.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/ui/AudioItemView.kt index 9a7d498119..dd06fa1bf8 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/ui/AudioItemView.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/ui/AudioItemView.kt @@ -9,7 +9,6 @@ package io.element.android.libraries.mediaviewer.impl.gallery.ui import androidx.compose.foundation.background import androidx.compose.foundation.clickable -import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer @@ -30,13 +29,11 @@ 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 import io.element.android.libraries.core.extensions.withBrackets import io.element.android.libraries.designsystem.preview.ElementPreview import io.element.android.libraries.designsystem.preview.PreviewsDayNight import io.element.android.libraries.designsystem.theme.components.HorizontalDivider import io.element.android.libraries.designsystem.theme.components.Icon -import io.element.android.libraries.designsystem.theme.components.IconButton import io.element.android.libraries.designsystem.theme.components.Text import io.element.android.libraries.mediaviewer.impl.gallery.MediaItem @@ -44,31 +41,24 @@ import io.element.android.libraries.mediaviewer.impl.gallery.MediaItem fun AudioItemView( audio: MediaItem.Audio, onClick: () -> Unit, - onShareClick: () -> Unit, - onDownloadClick: () -> Unit, - onInfoClick: () -> Unit, modifier: Modifier = Modifier, ) { Column( modifier = modifier .fillMaxWidth() - .padding(top = 20.dp, start = 16.dp, end = 16.dp), + .padding(horizontal = 16.dp), ) { + Spacer(modifier = Modifier.height(20.dp)) FilenameRow( audio = audio, onClick = onClick, ) val caption = audio.mediaInfo.caption if (caption != null) { - Spacer(modifier = Modifier.height(16.dp)) - Caption(caption) + CaptionView(caption) + } else { + Spacer(modifier = Modifier.height(20.dp)) } - Spacer(modifier = Modifier.height(16.dp)) - ActionIconsRow( - onShareClick = onShareClick, - onDownloadClick = onDownloadClick, - onInfoClick = onInfoClick, - ) HorizontalDivider() } } @@ -101,16 +91,6 @@ private fun FilenameRow( imageVector = Icons.Outlined.GraphicEq, contentDescription = null, ) - audio.duration?.let { - Spacer(modifier = Modifier.width(8.dp)) - Text( - text = audio.duration, - style = ElementTheme.typography.fontBodyMdMedium, - color = ElementTheme.colors.textSecondary, - maxLines = 1, - overflow = TextOverflow.Ellipsis, - ) - } Spacer(modifier = Modifier.width(8.dp)) Text( text = audio.mediaInfo.filename, @@ -131,55 +111,6 @@ private fun FilenameRow( } } -@Composable -private fun Caption(caption: String) { - Text( - modifier = Modifier.fillMaxWidth(), - text = caption, - maxLines = 5, - overflow = TextOverflow.Ellipsis, - style = ElementTheme.typography.fontBodyLgRegular, - color = ElementTheme.colors.textPrimary, - ) -} - -@Composable -private fun ActionIconsRow( - onShareClick: () -> Unit, - onDownloadClick: () -> Unit, - onInfoClick: () -> Unit, -) { - Row( - modifier = Modifier.fillMaxWidth(), - horizontalArrangement = Arrangement.End - ) { - IconButton( - onClick = onShareClick, - ) { - Icon( - imageVector = CompoundIcons.ShareAndroid(), - contentDescription = null, - ) - } - IconButton( - onClick = onDownloadClick, - ) { - Icon( - imageVector = CompoundIcons.Download(), - contentDescription = null, - ) - } - IconButton( - onClick = onInfoClick, - ) { - Icon( - imageVector = CompoundIcons.Info(), - contentDescription = null, - ) - } - } -} - @PreviewsDayNight @Composable internal fun AudioItemViewPreview( @@ -188,8 +119,5 @@ internal fun AudioItemViewPreview( AudioItemView( audio = audio, onClick = {}, - onShareClick = {}, - onDownloadClick = {}, - onInfoClick = {}, ) } diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/ui/CaptionView.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/ui/CaptionView.kt new file mode 100644 index 0000000000..6fc85336a8 --- /dev/null +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/ui/CaptionView.kt @@ -0,0 +1,34 @@ +/* + * Copyright 2024 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only + * Please see LICENSE in the repository root for full details. + */ + +package io.element.android.libraries.mediaviewer.impl.gallery.ui + +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import io.element.android.compound.theme.ElementTheme +import io.element.android.libraries.designsystem.theme.components.Text + +@Composable +fun CaptionView( + caption: String, + modifier: Modifier = Modifier, +) { + Text( + modifier = modifier + .fillMaxWidth() + .padding(vertical = 16.dp), + text = caption, + maxLines = 5, + overflow = TextOverflow.Ellipsis, + style = ElementTheme.typography.fontBodyLgRegular, + color = ElementTheme.colors.textPrimary, + ) +} diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/ui/FileItemView.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/ui/FileItemView.kt index 307ed89bdc..6618815c21 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/ui/FileItemView.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/ui/FileItemView.kt @@ -9,7 +9,6 @@ package io.element.android.libraries.mediaviewer.impl.gallery.ui import androidx.compose.foundation.background import androidx.compose.foundation.clickable -import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer @@ -34,7 +33,6 @@ import io.element.android.libraries.designsystem.preview.ElementPreview import io.element.android.libraries.designsystem.preview.PreviewsDayNight import io.element.android.libraries.designsystem.theme.components.HorizontalDivider import io.element.android.libraries.designsystem.theme.components.Icon -import io.element.android.libraries.designsystem.theme.components.IconButton import io.element.android.libraries.designsystem.theme.components.Text import io.element.android.libraries.mediaviewer.impl.gallery.MediaItem @@ -42,31 +40,24 @@ import io.element.android.libraries.mediaviewer.impl.gallery.MediaItem fun FileItemView( file: MediaItem.File, onClick: () -> Unit, - onShareClick: () -> Unit, - onDownloadClick: () -> Unit, - onInfoClick: () -> Unit, modifier: Modifier = Modifier, ) { Column( modifier = modifier .fillMaxWidth() - .padding(top = 20.dp, start = 16.dp, end = 16.dp), + .padding(horizontal = 16.dp), ) { + Spacer(modifier = Modifier.height(20.dp)) FilenameRow( file = file, onClick = onClick, ) val caption = file.mediaInfo.caption if (caption != null) { - Spacer(modifier = Modifier.height(16.dp)) - Caption(caption) + CaptionView(caption) + } else { + Spacer(modifier = Modifier.height(20.dp)) } - Spacer(modifier = Modifier.height(16.dp)) - ActionIconsRow( - onShareClick = onShareClick, - onDownloadClick = onDownloadClick, - onInfoClick = onInfoClick, - ) HorizontalDivider() } } @@ -119,55 +110,6 @@ private fun FilenameRow( } } -@Composable -private fun Caption(caption: String) { - Text( - modifier = Modifier.fillMaxWidth(), - text = caption, - maxLines = 5, - overflow = TextOverflow.Ellipsis, - style = ElementTheme.typography.fontBodyLgRegular, - color = ElementTheme.colors.textPrimary, - ) -} - -@Composable -private fun ActionIconsRow( - onShareClick: () -> Unit, - onDownloadClick: () -> Unit, - onInfoClick: () -> Unit, -) { - Row( - modifier = Modifier.fillMaxWidth(), - horizontalArrangement = Arrangement.End - ) { - IconButton( - onClick = onShareClick, - ) { - Icon( - imageVector = CompoundIcons.ShareAndroid(), - contentDescription = null, - ) - } - IconButton( - onClick = onDownloadClick, - ) { - Icon( - imageVector = CompoundIcons.Download(), - contentDescription = null, - ) - } - IconButton( - onClick = onInfoClick, - ) { - Icon( - imageVector = CompoundIcons.Info(), - contentDescription = null, - ) - } - } -} - @PreviewsDayNight @Composable internal fun FileItemViewPreview( @@ -176,8 +118,5 @@ internal fun FileItemViewPreview( FileItemView( file = file, onClick = {}, - onShareClick = {}, - onDownloadClick = {}, - onInfoClick = {}, ) } diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/ui/MediaItemAudioProvider.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/ui/MediaItemAudioProvider.kt index 1194449aef..5d4ebe0b94 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/ui/MediaItemAudioProvider.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/ui/MediaItemAudioProvider.kt @@ -32,7 +32,6 @@ fun aMediaItemAudio( id: UniqueId = UniqueId("fileId"), filename: String = "filename", caption: String? = null, - duration: String? = "1:23", ): MediaItem.Audio { return MediaItem.Audio( id = id, @@ -42,6 +41,5 @@ fun aMediaItemAudio( caption = caption, ), mediaSource = MediaSource(""), - duration = duration, ) } diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/ui/VoiceItemView.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/ui/VoiceItemView.kt index 472ea6555f..807be6c116 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/ui/VoiceItemView.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/ui/VoiceItemView.kt @@ -66,18 +66,19 @@ fun VoiceItemView( Column( modifier = modifier .fillMaxWidth() - .padding(top = 20.dp, start = 16.dp, end = 16.dp), + .padding(horizontal = 16.dp), ) { + Spacer(modifier = Modifier.height(20.dp)) VoiceInfoRow( state = state, voice = voice, ) val caption = voice.mediaInfo.caption if (caption != null) { + CaptionView(caption) + } else { Spacer(modifier = Modifier.height(16.dp)) - Caption(caption) } - Spacer(modifier = Modifier.height(16.dp)) ActionIconsRow( onShareClick = onShareClick, onDownloadClick = onDownloadClick, @@ -256,18 +257,6 @@ private fun CustomIconButton( ) } -@Composable -private fun Caption(caption: String) { - Text( - modifier = Modifier.fillMaxWidth(), - text = caption, - maxLines = 5, - overflow = TextOverflow.Ellipsis, - style = ElementTheme.typography.fontBodyLgRegular, - color = ElementTheme.colors.textPrimary, - ) -} - @Composable private fun ActionIconsRow( onShareClick: () -> Unit, diff --git a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/DefaultEventItemFactoryTest.kt b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/DefaultEventItemFactoryTest.kt index d074581f7d..c03ebc37c4 100644 --- a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/DefaultEventItemFactoryTest.kt +++ b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/DefaultEventItemFactoryTest.kt @@ -262,7 +262,6 @@ class DefaultEventItemFactoryTest { waveform = null, ), mediaSource = MediaSource(""), - duration = "7:36", ) ) }