From d4eb60f2ebce7c1029141f67e8278beccfe46ffb Mon Sep 17 00:00:00 2001 From: ganfra Date: Thu, 1 Jun 2023 18:41:54 +0200 Subject: [PATCH] File: new design for file timeline item --- .../components/event/TimelineItemFileView.kt | 26 ++++++++----- .../TimelineItemContentMessageFactory.kt | 11 ++++-- .../model/event/TimelineItemFileContent.kt | 13 ++++++- .../event/TimelineItemFileContentProvider.kt | 6 +-- .../impl/timeline/util/FileSizeFormatter.kt | 38 +++++++++++++++++++ .../messages/fixtures/timelineItemsFactory.kt | 3 +- .../timeline/FakeFileSizeFormatter.kt | 25 ++++++++++++ 7 files changed, 104 insertions(+), 18 deletions(-) create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/util/FileSizeFormatter.kt create mode 100644 features/messages/impl/src/test/kotlin/io/element/android/features/messages/timeline/FakeFileSizeFormatter.kt diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemFileView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemFileView.kt index 0628b2050e..1df650e7bf 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemFileView.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemFileView.kt @@ -18,12 +18,13 @@ package io.element.android.features.messages.impl.timeline.components.event import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.shape.CircleShape import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Attachment +import androidx.compose.material.icons.filled.AttachFile import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment @@ -33,6 +34,7 @@ import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp import io.element.android.features.messages.impl.timeline.model.event.TimelineItemFileContent import io.element.android.features.messages.impl.timeline.model.event.TimelineItemFileContentProvider import io.element.android.libraries.designsystem.preview.ElementPreviewDark @@ -47,7 +49,6 @@ fun TimelineItemFileView( ) { Row( modifier = modifier, - verticalAlignment = Alignment.CenterVertically ) { Box( modifier = Modifier @@ -57,16 +58,23 @@ fun TimelineItemFileView( contentAlignment = Alignment.Center, ) { Icon( - imageVector = Icons.Filled.Attachment, + modifier = Modifier.size(20.dp), + imageVector = Icons.Filled.AttachFile, contentDescription = "OpenFile" ) } - Text( - text = content.body, - modifier = Modifier.padding(horizontal = 8.dp), - maxLines = 1, - overflow = TextOverflow.Ellipsis, - ) + Column(modifier = Modifier.padding(horizontal = 8.dp),) { + Text( + text = content.name, + maxLines = 2, + fontSize = 16.sp, + overflow = TextOverflow.Ellipsis + ) + Text( + text = content.fileExtensionAndSize, + color = MaterialTheme.colorScheme.secondary, + ) + } } } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentMessageFactory.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentMessageFactory.kt index 21a7a11e31..3341d654e0 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentMessageFactory.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentMessageFactory.kt @@ -24,6 +24,7 @@ import io.element.android.features.messages.impl.timeline.model.event.TimelineIt import io.element.android.features.messages.impl.timeline.model.event.TimelineItemTextContent import io.element.android.features.messages.impl.timeline.model.event.TimelineItemUnknownContent import io.element.android.features.messages.impl.timeline.model.event.TimelineItemVideoContent +import io.element.android.features.messages.impl.timeline.util.FileSizeFormatter import io.element.android.features.messages.impl.timeline.util.toHtmlDocument import io.element.android.libraries.matrix.api.timeline.item.event.EmoteMessageType import io.element.android.libraries.matrix.api.timeline.item.event.FileMessageType @@ -34,7 +35,9 @@ import io.element.android.libraries.matrix.api.timeline.item.event.TextMessageTy import io.element.android.libraries.matrix.api.timeline.item.event.VideoMessageType import javax.inject.Inject -class TimelineItemContentMessageFactory @Inject constructor() { +class TimelineItemContentMessageFactory @Inject constructor( + private val fileSizeFormatter: FileSizeFormatter +) { fun create(content: MessageContent): TimelineItemEventContent { return when (val messageType = content.type) { @@ -70,11 +73,13 @@ class TimelineItemContentMessageFactory @Inject constructor() { ) } is FileMessageType -> TimelineItemFileContent( - body = messageType.body, + name = messageType.body, thumbnailSource = messageType.info?.thumbnailSource, fileSource = messageType.source, mimeType = messageType.info?.mimetype, - size = messageType.info?.size, + formattedFileSize = messageType.info?.size?.let { + fileSizeFormatter.format(it) + }, ) is NoticeMessageType -> TimelineItemNoticeContent( body = messageType.body, diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemFileContent.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemFileContent.kt index d1fb7f0942..4557718561 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemFileContent.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemFileContent.kt @@ -19,11 +19,20 @@ package io.element.android.features.messages.impl.timeline.model.event import io.element.android.libraries.matrix.api.media.MediaSource data class TimelineItemFileContent( - val body: String, + val name: String, val fileSource: MediaSource, val thumbnailSource: MediaSource?, - val size: Long?, + val formattedFileSize: String?, val mimeType: String?, ) : TimelineItemEventContent { override val type: String = "TimelineItemFileContent" + + private val fileExtension = name.substringAfterLast('.', "").uppercase() + val fileExtensionAndSize = buildString { + append(fileExtension) + if (formattedFileSize != null) { + append(' ') + append("($formattedFileSize)") + } + } } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemFileContentProvider.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemFileContentProvider.kt index 1dfd87ce38..1eb0d6135c 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemFileContentProvider.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemFileContentProvider.kt @@ -25,14 +25,14 @@ open class TimelineItemFileContentProvider : PreviewParameterProvider