Merge pull request #1934 from vector-im/feature/bma/timelineFixes

Timeline fixes
This commit is contained in:
Benoit Marty 2023-12-01 09:37:41 +01:00 committed by GitHub
commit fa3422f858
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
33 changed files with 86 additions and 93 deletions

View file

@ -163,8 +163,6 @@ fun TimelineItemEventRow(
state = state.draggableState,
),
event = event,
showReadReceipts = showReadReceipts,
isLastOutgoingMessage = isLastOutgoingMessage,
isHighlighted = isHighlighted,
interactionSource = interactionSource,
onClick = onClick,
@ -175,7 +173,6 @@ fun TimelineItemEventRow(
onReactionClicked = { emoji -> onReactionClick(emoji, event) },
onReactionLongClicked = { emoji -> onReactionLongClick(emoji, event) },
onMoreReactionsClicked = { onMoreReactionsClick(event) },
onReadReceiptsClicked = { onReadReceiptClick(event) },
eventSink = eventSink,
)
}
@ -183,8 +180,6 @@ fun TimelineItemEventRow(
} else {
TimelineItemEventRowContent(
event = event,
showReadReceipts = showReadReceipts,
isLastOutgoingMessage = isLastOutgoingMessage,
isHighlighted = isHighlighted,
interactionSource = interactionSource,
onClick = onClick,
@ -195,10 +190,20 @@ fun TimelineItemEventRow(
onReactionClicked = { emoji -> onReactionClick(emoji, event) },
onReactionLongClicked = { emoji -> onReactionLongClick(emoji, event) },
onMoreReactionsClicked = { onMoreReactionsClick(event) },
onReadReceiptsClicked = { onReadReceiptClick(event) },
eventSink = eventSink,
)
}
// Read receipts / Send state
TimelineItemReadReceiptView(
state = ReadReceiptViewState(
sendState = event.localSendState,
isLastOutgoingMessage = isLastOutgoingMessage,
receipts = event.readReceiptState.receipts,
),
showReadReceipts = showReadReceipts,
onReadReceiptsClicked = { onReadReceiptClick(event) },
modifier = Modifier.padding(top = 4.dp),
)
}
}
@ -228,8 +233,6 @@ private fun SwipeSensitivity(
@Composable
private fun TimelineItemEventRowContent(
event: TimelineItem.Event,
showReadReceipts: Boolean,
isLastOutgoingMessage: Boolean,
isHighlighted: Boolean,
interactionSource: MutableInteractionSource,
onClick: () -> Unit,
@ -238,7 +241,6 @@ private fun TimelineItemEventRowContent(
inReplyToClicked: () -> Unit,
onUserDataClicked: () -> Unit,
onReactionClicked: (emoji: String) -> Unit,
onReadReceiptsClicked: () -> Unit,
onReactionLongClicked: (emoji: String) -> Unit,
onMoreReactionsClicked: (event: TimelineItem.Event) -> Unit,
eventSink: (TimelineEvents) -> Unit,
@ -259,7 +261,6 @@ private fun TimelineItemEventRowContent(
sender,
message,
reactions,
readReceipts,
) = createRefs()
// Sender
@ -326,25 +327,6 @@ private fun TimelineItemEventRowContent(
.padding(start = if (event.isMine) 16.dp else 36.dp, end = 16.dp)
)
}
// Read receipts / Send state
TimelineItemReadReceiptView(
state = ReadReceiptViewState(
sendState = event.localSendState,
isLastOutgoingMessage = isLastOutgoingMessage,
receipts = event.readReceiptState.receipts,
),
showReadReceipts = showReadReceipts,
onReadReceiptsClicked = onReadReceiptsClicked,
modifier = Modifier
.constrainAs(readReceipts) {
if (event.reactionsState.reactions.isNotEmpty()) {
top.linkTo(reactions.bottom, margin = 4.dp)
} else {
top.linkTo(message.bottom, margin = 4.dp)
}
}
)
}
}

View file

@ -148,7 +148,8 @@ private fun TimelineItemGroupedEventsRowContent(
receipts = timelineItem.aggregatedReadReceipts,
),
showReadReceipts = true,
onReadReceiptsClicked = { /* No op for group event */ })
onReadReceiptsClicked = onExpandGroupClick
)
}
}
}

View file

@ -16,6 +16,8 @@
package io.element.android.features.messages.impl.timeline.components.group
import androidx.compose.animation.core.animateFloatAsState
import androidx.compose.animation.core.tween
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
@ -26,6 +28,7 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
@ -76,9 +79,17 @@ fun GroupHeaderView(
color = MaterialTheme.colorScheme.secondary,
style = ElementTheme.typography.fontBodyMdRegular,
)
val rotation: Float by animateFloatAsState(
targetValue = if (isExpanded) 90f else 0f,
animationSpec = tween(
delayMillis = 0,
durationMillis = 300,
),
label = "chevron"
)
Icon(
modifier = Modifier.rotate(if (isExpanded) 180f else 0f),
imageVector = CompoundIcons.ChevronDown,
modifier = Modifier.rotate(rotation),
imageVector = CompoundIcons.ChevronRight,
contentDescription = null,
tint = MaterialTheme.colorScheme.secondary
)

View file

@ -25,7 +25,6 @@ import com.squareup.anvil.annotations.ContributesBinding
import io.element.android.libraries.di.SessionScope
import io.element.android.libraries.eventformatter.api.RoomLastMessageFormatter
import io.element.android.libraries.eventformatter.impl.mode.RenderingMode
import io.element.android.libraries.matrix.api.MatrixClient
import io.element.android.libraries.matrix.api.timeline.item.event.AudioMessageType
import io.element.android.libraries.matrix.api.timeline.item.event.EmoteMessageType
import io.element.android.libraries.matrix.api.timeline.item.event.EventTimelineItem
@ -58,14 +57,13 @@ import javax.inject.Inject
@ContributesBinding(SessionScope::class)
class DefaultRoomLastMessageFormatter @Inject constructor(
private val sp: StringProvider,
private val matrixClient: MatrixClient,
private val roomMembershipContentFormatter: RoomMembershipContentFormatter,
private val profileChangeContentFormatter: ProfileChangeContentFormatter,
private val stateContentFormatter: StateContentFormatter,
) : RoomLastMessageFormatter {
override fun format(event: EventTimelineItem, isDmRoom: Boolean): CharSequence? {
val isOutgoing = matrixClient.isMe(event.sender)
val isOutgoing = event.isOwn
val senderDisplayName = (event.senderProfile as? ProfileTimelineDetails.Ready)?.displayName ?: event.sender.value
return when (val content = event.content) {
is MessageContent -> processMessageContents(content, senderDisplayName, isDmRoom)

View file

@ -21,7 +21,6 @@ import io.element.android.libraries.core.meta.BuildMeta
import io.element.android.libraries.di.SessionScope
import io.element.android.libraries.eventformatter.api.TimelineEventFormatter
import io.element.android.libraries.eventformatter.impl.mode.RenderingMode
import io.element.android.libraries.matrix.api.MatrixClient
import io.element.android.libraries.matrix.api.timeline.item.event.EventTimelineItem
import io.element.android.libraries.matrix.api.timeline.item.event.FailedToParseMessageLikeContent
import io.element.android.libraries.matrix.api.timeline.item.event.FailedToParseStateContent
@ -42,7 +41,6 @@ import javax.inject.Inject
@ContributesBinding(SessionScope::class)
class DefaultTimelineEventFormatter @Inject constructor(
private val sp: StringProvider,
private val matrixClient: MatrixClient,
private val buildMeta: BuildMeta,
private val roomMembershipContentFormatter: RoomMembershipContentFormatter,
private val profileChangeContentFormatter: ProfileChangeContentFormatter,
@ -50,7 +48,7 @@ class DefaultTimelineEventFormatter @Inject constructor(
) : TimelineEventFormatter {
override fun format(event: EventTimelineItem): CharSequence? {
val isOutgoing = matrixClient.isMe(event.sender)
val isOutgoing = event.isOwn
val senderDisplayName = (event.senderProfile as? ProfileTimelineDetails.Ready)?.displayName ?: event.sender.value
return when (val content = event.content) {
is RoomMembershipContent -> {

View file

@ -75,7 +75,6 @@ class DefaultRoomLastMessageFormatterTest {
val stringProvider = AndroidStringProvider(context.resources)
formatter = DefaultRoomLastMessageFormatter(
sp = AndroidStringProvider(context.resources),
matrixClient = fakeMatrixClient,
roomMembershipContentFormatter = RoomMembershipContentFormatter(fakeMatrixClient, stringProvider),
profileChangeContentFormatter = ProfileChangeContentFormatter(stringProvider),
stateContentFormatter = StateContentFormatter(stringProvider)
@ -798,6 +797,11 @@ class DefaultRoomLastMessageFormatterTest {
private fun createRoomEvent(sentByYou: Boolean, senderDisplayName: String?, content: EventContent): EventTimelineItem {
val sender = if (sentByYou) A_USER_ID else UserId("@someone_else:domain")
val profile = ProfileTimelineDetails.Ready(senderDisplayName, false, null)
return anEventTimelineItem(content = content, senderProfile = profile, sender = sender)
return anEventTimelineItem(
content = content,
senderProfile = profile,
sender = sender,
isOwn = sentByYou,
)
}
}

View file

@ -79,7 +79,6 @@ class RoomListScreen(
lastMessageTimestampFormatter = DefaultLastMessageTimestampFormatter(dateTimeProvider, dateFormatters),
roomLastMessageFormatter = DefaultRoomLastMessageFormatter(
sp = stringProvider,
matrixClient = matrixClient,
roomMembershipContentFormatter = RoomMembershipContentFormatter(matrixClient, stringProvider),
profileChangeContentFormatter = ProfileChangeContentFormatter(stringProvider),
stateContentFormatter = StateContentFormatter(stringProvider),

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:92f929493ff8f4ea9f4a7a7b8a27901896cd00dc2509095885b41513cfe339c1
size 25381
oid sha256:910e28b2dc89b08b99b2d692d10bea6b79c85749f804842d63177d5380283006
size 25411

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:f5f0e119f72f1786bdd72440a3758ddc91360899170e9c38e5b9d3edaf157f17
size 25022
oid sha256:e9af3bd8ae926ca6bf67103aad707c28e72138c564126eeb832bf589fbd2f81e
size 25033

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:2b90128e9c4bd1ff8c0c41ef114738c503270c9761882f8bed234f788b811d30
size 8884
oid sha256:61760159b2e8967b5349392935e88fd62353d1f8b8842b4e02090a20b34d7956
size 8896

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:154d0c63842b54d5335a16ee45997f169d569e305a682b4b07719b35f793cb56
size 8988
oid sha256:65d4b7b84353c27830048ff783e1f1cf99e81b23bac46152ec17c16dcb63546c
size 8994

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:ea21e9a1c33ef17c9d3b6c43168c1da3e2f7da71f67d1d7db6422d7f6387409f
size 14551
oid sha256:16fb79b80d6dc1cd032bdc4383be80d6ed0f4eddf4bf42e95e28cc5c92635154
size 14560

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:5bc67cb31ab08fb10247c4a261e91a83f1b6af8722f2c2820efa0fd9ea85aced
size 14612
oid sha256:f067cd464e7c14b0034fcfdbe4df3dba2bc95c05b8ac48f6788395f4631dd075
size 14601

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:63c52c283b0590a42d81a785af8a673b145dcd71727a8bdf11cc12fd435f6c66
size 52492
oid sha256:edf895e9fcf992db6a82c58678b441e82480d7aa3bdcd389ecc487c23105b59c
size 52505

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:984002d033b8b81ca485a0edc4b4d03760eed41fcdcd3a87f55938ec87cc88db
size 74726
oid sha256:a8d8205687fd1c5a7579b3c426ea9547dae4250ba4261cec36f1ef2ea588c982
size 74730

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:f1ca4acb3d53773cb45e40586588bb91b7faa013292fde952b0781401df18054
size 53979
oid sha256:5d0f7cf75caeb2fe64452753afd9e310e645aa15be23b6726f282adb55ad54a2
size 53987

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:b4ed2085ac63c2d94b7bcd0e92464f5b2209f9f7500346421c7f594ebf2baa8b
size 66904
oid sha256:28266d8283d1e453832c3c88f223edc4be28d84406981f5fe87f254aecc736ca
size 66910

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:7ab70caa3587294275ee7e2dd5b34e0b5d85645d017718d1dfe9f077a8dc76b2
size 50458
oid sha256:8029f81df796cdc60a9919a1764ee1621b154683cc1fe0c3fff3b9c91806fa7a
size 50469

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:2c4fb9d68245959dd4ad4df3a65a2ed88937120f5edbfc0244298142b38bd9af
size 67754
oid sha256:8ef232876e00b2c9b1448973a0fa5856f4574ce340d4035c9a3f60e41fa99fcb
size 67758

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:bd8df43def756f27d22bc6e81038f8246b624d280f8d0c75b24ca4fb86658f10
size 57555
oid sha256:083c7dcc7d366172d3d6431f17697a2aa8382a7919d1cf54250ab91d5dd63874
size 57571

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:2e1b50da12b09ce80fcc63a695489dbf4f7dc20a5f329b2f7ecdb6daee822f9d
size 72585
oid sha256:130f469d7ef167154e708a28fe1b76165cb998334d08479af46046c40c8721af
size 72592

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:0fdf9321cca8bc80076e8c071c44911d23a1913117828e63721eec3b5b120702
size 74702
oid sha256:dce3e468b31c14d39bcdfe449b837702730efa1ae42b30820c76cbdbd63b7de1
size 74704

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:e80cb8546650e737a355203ac441d88e9e118771d0a9752f6468af6aa48bb0bc
size 57863
oid sha256:e39e18ebdcd6ed0fb1ca53cf46b990920d26426489c5a4ae904977299beae6e4
size 57867

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:508f29c5d9784610f79c681d49d81f5a337b34ec464d9d4d2f3c37ad8cbbd3f9
size 50875
oid sha256:a45cd74d0d4c030672f6ba1ad587fac5ec8dfd9aaa3906aa17748268ea74a232
size 50883

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:fd561f53b5fd958eaa5fba0034dad7706493444d61fe01791e200338bb4580b3
size 71539
oid sha256:62a81a4f33a8a76a2a9864fc522b6fe15765237a96663c8ecc8aca230642a771
size 71545

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:2e343f38f71c4629f80b4fd9811a53cac07dc6c76a38b18339640321adc8a253
size 52185
oid sha256:37e3405d346d421faec0aa0065d220bf757dd3851bb948a716a802ca3c7664a6
size 52189

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:b9a64e74dc5f1ced6e73a33f7b8fbfaaa4ecba3db8007c02bad8bd494bf1eb31
size 64178
oid sha256:e472556771fa5cc4253706bce70775664ba85b73566f34542aa580121583f153
size 64185

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:8fdf0a733ce2417006388fd3143d937f8e3de5b3ebb44c916d5be532dc977506
size 49021
oid sha256:2aa310bd7a292b7958b4e87bceaaac1616e3b418134ad6337d84dd221663a3c9
size 49023

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:3b2f56ea59bebce67ce5fd490ab92f195f561dcab57b3b25859aa40773b8092c
size 64920
oid sha256:0f483afa9110508d712f9ba0d6640b23e64d4ce7441506662c278e39b2213dc6
size 64926

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:d84115b839a3d0ea1ba357837bcd1e63457efedfe3eb6976d8f84b148293ce90
size 55456
oid sha256:6babf64bf9fa9e948f35b711bad8e96a7354593e92c8dc35cc0d38e8effa3ea7
size 55462

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:41450dafa7adb97bf4f4490f7054161352161263ef99ec6a93134ad3965c14ee
size 70013
oid sha256:8c42c1e00764debb166afe9db8c5818ae53f46ab544ba1d36af5d1aefeca2ebf
size 70002

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:5a03f9dc697e81f7b1dc8918de55ad4992a92d25576cd90fab22224e7ad5a0d8
size 71946
oid sha256:26992624618cdf42097166cb319c477cc03b0220b7f8e1cfce43458cd0e9d6a8
size 71941

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:87e4676fad9b6ef136f18cea95110c934ed508e5d57b26d54a2015b3f209d4b7
size 56235
oid sha256:a6c73969522738d052b253abad1f8090702923f9cbcbee5935791e61bbcf40fe
size 56240