Merge pull request #617 from vector-im/feature/fga/fix_media_pre_processing

Feature/fga/fix media pre processing
This commit is contained in:
ganfra 2023-06-20 16:17:50 +02:00 committed by GitHub
commit c7b2ac5acd
25 changed files with 296 additions and 214 deletions

View file

@ -24,22 +24,24 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import kotlin.math.min
private const val MAX_HEIGHT_IN_DP = 360f
private const val MIN_ASPECT_RATIO = 0.6f
private const val MAX_ASPECT_RATIO = 4f
private const val DEFAULT_ASPECT_RATIO = 1.33f
@Composable
fun TimelineItemAspectRatioBox(
height: Int?,
aspectRatio: Float,
aspectRatio: Float?,
modifier: Modifier = Modifier,
contentAlignment: Alignment = Alignment.TopStart,
content: @Composable BoxScope.() -> Unit,
content: @Composable (BoxScope.() -> Unit),
) {
// TODO should probably be moved to an ElementTheme.dimensions
val maxHeight = min(300, height ?: 0)
val safeAspectRatio = (aspectRatio ?: DEFAULT_ASPECT_RATIO).coerceIn(MIN_ASPECT_RATIO, MAX_ASPECT_RATIO)
Box(
modifier = modifier
.heightIn(max = maxHeight.dp)
.aspectRatio(aspectRatio, matchHeightConstraintsFirst = true),
.heightIn(max = MAX_HEIGHT_IN_DP.dp)
.aspectRatio(safeAspectRatio, true),
contentAlignment = contentAlignment,
content = content
)

View file

@ -16,7 +16,6 @@
package io.element.android.features.messages.impl.timeline.components.event
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.layout.ContentScale
@ -28,25 +27,20 @@ import io.element.android.libraries.designsystem.components.BlurHashAsyncImage
import io.element.android.libraries.designsystem.preview.ElementPreviewDark
import io.element.android.libraries.designsystem.preview.ElementPreviewLight
import io.element.android.libraries.matrix.ui.media.MediaRequestData
import kotlin.math.max
@Composable
fun TimelineItemImageView(
content: TimelineItemImageContent,
modifier: Modifier = Modifier,
) {
// TODO place this value somewhere else?
val minHeight = max(100, content.height ?: 0)
TimelineItemAspectRatioBox(
height = minHeight,
aspectRatio = content.aspectRatio,
modifier = modifier
) {
BlurHashAsyncImage(
model = MediaRequestData(content.preferredMediaSource, MediaRequestData.Kind.File(content.body, content.mimeType)),
blurHash = content.blurhash,
modifier = Modifier.fillMaxSize(),
contentScale = ContentScale.Fit,
contentScale = ContentScale.Crop,
)
}
}

View file

@ -43,7 +43,6 @@ fun TimelineItemVideoView(
modifier: Modifier = Modifier,
) {
TimelineItemAspectRatioBox(
height = content.height,
aspectRatio = content.aspectRatio,
modifier = modifier,
contentAlignment = Alignment.Center,
@ -51,8 +50,7 @@ fun TimelineItemVideoView(
BlurHashAsyncImage(
model = MediaRequestData(content.thumbnailSource, MediaRequestData.Kind.File(content.body, content.mimeType)),
blurHash = content.blurHash,
modifier = Modifier.fillMaxSize(),
contentScale = ContentScale.Fit,
contentScale = ContentScale.Crop,
)
Box(
modifier = Modifier.roundedBackground(),

View file

@ -102,11 +102,11 @@ class TimelineItemContentMessageFactory @Inject constructor(
}
}
private fun aspectRatioOf(width: Long?, height: Long?): Float {
private fun aspectRatioOf(width: Long?, height: Long?): Float? {
return if (height != null && width != null) {
width.toFloat() / height.toFloat()
} else {
0.7f
null
}
}
}

View file

@ -29,7 +29,7 @@ data class TimelineItemImageContent(
val blurhash: String?,
val width: Int?,
val height: Int?,
val aspectRatio: Float
val aspectRatio: Float?
) : TimelineItemEventContent {
override val type: String = "TimelineItemImageContent"

View file

@ -23,7 +23,7 @@ data class TimelineItemVideoContent(
val duration: Long,
val videoSource: MediaSource,
val thumbnailSource: MediaSource?,
val aspectRatio: Float,
val aspectRatio: Float?,
val blurHash: String?,
val height: Int?,
val width: Int?,

View file

@ -36,7 +36,6 @@ import io.element.android.libraries.featureflag.api.FeatureFlagService
import io.element.android.libraries.featureflag.api.FeatureFlags
import io.element.android.libraries.featureflag.test.FakeFeatureFlagService
import io.element.android.libraries.matrix.api.media.ImageInfo
import io.element.android.libraries.matrix.api.media.ThumbnailInfo
import io.element.android.libraries.matrix.api.media.VideoInfo
import io.element.android.libraries.matrix.api.room.MatrixRoom
import io.element.android.libraries.matrix.test.ANOTHER_MESSAGE
@ -50,7 +49,6 @@ import io.element.android.libraries.mediapickers.test.FakePickerProvider
import io.element.android.libraries.mediaupload.api.MediaPreProcessor
import io.element.android.libraries.mediaupload.api.MediaSender
import io.element.android.libraries.mediaupload.api.MediaUploadInfo
import io.element.android.libraries.mediaupload.api.ThumbnailProcessingInfo
import io.element.android.libraries.mediaupload.test.FakeMediaPreProcessor
import io.element.android.libraries.textcomposer.MessageComposerMode
import io.mockk.mockk
@ -301,16 +299,7 @@ class MessageComposerPresenterTest {
thumbnailSource = null,
blurhash = null,
),
thumbnailInfo = ThumbnailProcessingInfo(
file = File("/some/path"),
info = ThumbnailInfo(
width = null,
height = null,
mimetype = null,
size = null,
),
blurhash = "",
)
thumbnailFile = File("/some/path")
)
)
)
@ -344,16 +333,7 @@ class MessageComposerPresenterTest {
thumbnailSource = null,
blurhash = null,
),
thumbnailInfo = ThumbnailProcessingInfo(
file = File("/some/path"),
info = ThumbnailInfo(
width = null,
height = null,
mimetype = null,
size = null,
),
blurhash = "",
)
thumbnailFile = File("/some/path")
)
)
)