Merge branch 'develop' into feature/fga/fix_timeline_back_pagination_loop

This commit is contained in:
ganfra
2023-12-15 15:14:11 +01:00
42 changed files with 86 additions and 89 deletions

1
changelog.d/1940.bugfix Normal file
View File

@@ -0,0 +1 @@
Fix scaling of timeline images: don't crop, don't set min/max aspect ratio values.

View File

@@ -213,7 +213,8 @@ class TimelinePresenter @AssistedInject constructor(
newMostRecentItemId != prevMostRecentItemIdValue
if (hasNewEvent) {
val newMostRecentEvent = newMostRecentItem as? TimelineItem.Event
val fromMe = newMostRecentEvent?.localSendState != null
// Scroll to bottom if the new event is from me, even if sent from another device
val fromMe = newMostRecentEvent?.isMine == true
newEventState.value = if (fromMe) {
NewEventState.FromMe
} else {

View File

@@ -99,10 +99,9 @@ fun MessageEventBubble(
}
// Ignore state.isHighlighted for now, we need a design decision on it.
val backgroundBubbleColor = if (state.isMine) {
ElementTheme.colors.messageFromMeBackground
} else {
ElementTheme.colors.messageFromOtherBackground
val backgroundBubbleColor = when {
state.isMine -> ElementTheme.colors.messageFromMeBackground
else -> ElementTheme.colors.messageFromOtherBackground
}
val bubbleShape = bubbleShape()
Box(

View File

@@ -439,7 +439,7 @@ private fun MessageEventBubbleContent(
) {
when (timestampPosition) {
TimestampPosition.Overlay ->
Box(modifier) {
Box(modifier, contentAlignment = Alignment.Center) {
content()
TimelineEventTimestampView(
event = event,
@@ -650,7 +650,7 @@ internal fun TimelineItemEventRowPreview() = ElementPreview {
event = aTimelineItemEvent(
isMine = it,
content = aTimelineItemImageContent().copy(
aspectRatio = 5f
aspectRatio = 2.5f
),
groupPosition = TimelineItemGroupPosition.Last,
),

View File

@@ -71,7 +71,7 @@ internal fun TimelineItemEventRowWithReplyPreview(
isMine = it,
timelineItemReactions = aTimelineItemReactions(count = 0),
content = aTimelineItemImageContent().copy(
aspectRatio = 5f
aspectRatio = 2.5f
),
inReplyTo = inReplyToDetails,
isThreaded = true,

View File

@@ -25,9 +25,8 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
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 MIN_HEIGHT_IN_DP = 100
private const val MAX_HEIGHT_IN_DP = 360
private const val DEFAULT_ASPECT_RATIO = 1.33f
@Composable
@@ -37,11 +36,11 @@ fun TimelineItemAspectRatioBox(
contentAlignment: Alignment = Alignment.TopStart,
content: @Composable (BoxScope.() -> Unit),
) {
val safeAspectRatio = (aspectRatio ?: DEFAULT_ASPECT_RATIO).coerceIn(MIN_ASPECT_RATIO, MAX_ASPECT_RATIO)
val safeAspectRatio = aspectRatio ?: DEFAULT_ASPECT_RATIO
Box(
modifier = modifier
.heightIn(max = MAX_HEIGHT_IN_DP.dp)
.aspectRatio(safeAspectRatio, true),
.heightIn(min = MIN_HEIGHT_IN_DP.dp, max = MAX_HEIGHT_IN_DP.dp)
.aspectRatio(safeAspectRatio, false),
contentAlignment = contentAlignment,
content = content
)

View File

@@ -18,13 +18,12 @@ package io.element.android.features.messages.impl.timeline.components.event
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.tooling.preview.PreviewParameter
import io.element.android.features.messages.impl.timeline.model.event.TimelineItemImageContent
import io.element.android.features.messages.impl.timeline.model.event.TimelineItemImageContentProvider
import io.element.android.libraries.designsystem.components.BlurHashAsyncImage
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.matrix.ui.media.MediaRequestData
@Composable
@@ -34,12 +33,11 @@ fun TimelineItemImageView(
) {
TimelineItemAspectRatioBox(
aspectRatio = content.aspectRatio,
modifier = modifier
modifier = modifier,
) {
BlurHashAsyncImage(
model = MediaRequestData(content.preferredMediaSource, MediaRequestData.Kind.File(content.body, content.mimeType)),
blurHash = content.blurhash,
contentScale = ContentScale.Crop,
)
}
}

View File

@@ -37,7 +37,6 @@ import io.element.android.libraries.featureflag.test.FakeFeatureFlagService
import io.element.android.libraries.matrix.api.timeline.MatrixTimeline
import io.element.android.libraries.matrix.api.timeline.MatrixTimelineItem
import io.element.android.libraries.matrix.api.timeline.item.event.EventReaction
import io.element.android.libraries.matrix.api.timeline.item.event.LocalEventSendState
import io.element.android.libraries.matrix.api.timeline.item.event.ReactionSender
import io.element.android.libraries.matrix.api.timeline.item.virtual.VirtualTimelineItem
import io.element.android.libraries.matrix.test.AN_EVENT_ID
@@ -205,7 +204,7 @@ class TimelinePresenterTest {
consumeItemsUntilPredicate { it.timelineItems.size == 1 }
// Mimics sending a message, and assert newEventState is FromMe
timeline.updateTimelineItems { items ->
val event = anEventTimelineItem(content = aMessageContent(), localSendState = LocalEventSendState.Sent(AN_EVENT_ID))
val event = anEventTimelineItem(content = aMessageContent(), isOwn = true)
items + listOf(MatrixTimelineItem.Event("1", event))
}
consumeItemsUntilPredicate { it.timelineItems.size == 2 }
@@ -366,7 +365,7 @@ class TimelinePresenterTest {
messagesNavigator: FakeMessagesNavigator = FakeMessagesNavigator(),
endPollAction: EndPollAction = FakeEndPollAction(),
sendPollResponseAction: SendPollResponseAction = FakeSendPollResponseAction(),
): TimelinePresenter {
): TimelinePresenter {
return TimelinePresenter(
timelineItemsFactory = timelineItemsFactory,
room = FakeMatrixRoom(matrixTimeline = timeline),