From e4604e5668a4896dee8dd8bdb4789c9c2551db8f Mon Sep 17 00:00:00 2001 From: jonnyandrew Date: Mon, 27 Nov 2023 13:14:00 +0000 Subject: [PATCH 1/2] Display edited poll indicator in the timeline --- .../timeline/components/TimelineEventTimestampView.kt | 5 ++--- .../components/TimelineItemEventRowWithReplyPreview.kt | 3 ++- .../factories/event/TimelineItemContentPollFactory.kt | 1 + .../timeline/model/event/TimelineItemEventContent.kt | 10 ++++++++++ .../timeline/model/event/TimelineItemPollContent.kt | 1 + .../model/event/TimelineItemPollContentProvider.kt | 2 ++ .../event/TimelineItemContentPollFactoryTest.kt | 2 ++ .../matrix/api/timeline/item/event/EventContent.kt | 3 ++- .../timeline/item/event/TimelineEventContentMapper.kt | 1 + .../libraries/matrix/test/room/RoomSummaryFixture.kt | 3 ++- 10 files changed, 25 insertions(+), 6 deletions(-) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineEventTimestampView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineEventTimestampView.kt index 069107a11c..3451c1590c 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineEventTimestampView.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineEventTimestampView.kt @@ -36,8 +36,7 @@ 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.features.messages.impl.timeline.model.TimelineItem -import io.element.android.features.messages.impl.timeline.model.event.TimelineItemTextBasedContent -import io.element.android.libraries.core.bool.orFalse +import io.element.android.features.messages.impl.timeline.model.event.isEdited import io.element.android.libraries.designsystem.preview.ElementPreview import io.element.android.libraries.designsystem.preview.PreviewsDayNight import io.element.android.libraries.designsystem.theme.components.Icon @@ -55,7 +54,7 @@ fun TimelineEventTimestampView( ) { val formattedTime = event.sentTime val hasMessageSendingFailed = event.localSendState is LocalEventSendState.SendingFailed - val isMessageEdited = (event.content as? TimelineItemTextBasedContent)?.isEdited.orFalse() + val isMessageEdited = event.content.isEdited() val tint = if (hasMessageSendingFailed) MaterialTheme.colorScheme.error else null val clickModifier = if (hasMessageSendingFailed) { Modifier.combinedClickable( diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventRowWithReplyPreview.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventRowWithReplyPreview.kt index 8443ffafa2..f6b417e82d 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventRowWithReplyPreview.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventRowWithReplyPreview.kt @@ -129,7 +129,8 @@ class InReplyToDetailsProvider : PreviewParameterProvider { maxSelections = 1u, answers = emptyList(), votes = emptyMap(), - endTime = null + endTime = null, + isEdited = false, ), ).map { aInReplyToDetails( diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentPollFactory.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentPollFactory.kt index 04551f7086..3242e97d61 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentPollFactory.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentPollFactory.kt @@ -76,6 +76,7 @@ class TimelineItemContentPollFactory @Inject constructor( answerItems = answerItems, pollKind = content.kind, isEnded = isEndedPoll, + isEdited = content.isEdited, ) } } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemEventContent.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemEventContent.kt index 8678ae8826..feb3246e54 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemEventContent.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemEventContent.kt @@ -63,3 +63,13 @@ fun TimelineItemEventContent.canReact(): Boolean = is TimelineItemRedactedContent, TimelineItemUnknownContent -> false } + +/** + * Whether the event content has been edited. + */ +fun TimelineItemEventContent.isEdited(): Boolean = + when (this) { + is TimelineItemTextBasedContent -> isEdited + is TimelineItemPollContent -> isEdited + else -> false + } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemPollContent.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemPollContent.kt index dc47c12a86..2f60d96fb6 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemPollContent.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemPollContent.kt @@ -26,6 +26,7 @@ data class TimelineItemPollContent( val answerItems: List, val pollKind: PollKind, val isEnded: Boolean, + val isEdited: Boolean ) : TimelineItemEventContent { override val type: String = "TimelineItemPollContent" } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemPollContentProvider.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemPollContentProvider.kt index d20f9fa856..d32d361373 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemPollContentProvider.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemPollContentProvider.kt @@ -35,6 +35,7 @@ fun aTimelineItemPollContent( question: String = aPollQuestion(), answerItems: List = aPollAnswerItemList(), isEnded: Boolean = false, + isEdited: Boolean = false, ): TimelineItemPollContent { return TimelineItemPollContent( eventId = EventId("\$anEventId"), @@ -42,5 +43,6 @@ fun aTimelineItemPollContent( question = question, answerItems = answerItems, isEnded = isEnded, + isEdited = isEdited, ) } diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentPollFactoryTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentPollFactoryTest.kt index d6673b4770..aa5f07800e 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentPollFactoryTest.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentPollFactoryTest.kt @@ -230,6 +230,7 @@ internal class TimelineItemContentPollFactoryTest { answers = listOf(A_POLL_ANSWER_1, A_POLL_ANSWER_2, A_POLL_ANSWER_3, A_POLL_ANSWER_4), votes = votes, endTime = endTime, + isEdited = false, ) private fun aTimelineItemPollContent( @@ -248,6 +249,7 @@ internal class TimelineItemContentPollFactoryTest { answerItems = answerItems, pollKind = pollKind, isEnded = isEnded, + isEdited = false, ) private fun aPollAnswerItem( diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventContent.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventContent.kt index f63953e260..71da78e369 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventContent.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventContent.kt @@ -45,7 +45,8 @@ data class PollContent( val maxSelections: ULong, val answers: List, val votes: Map>, - val endTime: ULong? + val endTime: ULong?, + val isEdited: Boolean, ) : EventContent data class UnableToDecryptContent( diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/item/event/TimelineEventContentMapper.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/item/event/TimelineEventContentMapper.kt index 01dd32c048..074bb38e05 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/item/event/TimelineEventContentMapper.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/item/event/TimelineEventContentMapper.kt @@ -111,6 +111,7 @@ class TimelineEventContentMapper(private val eventMessageMapper: EventMessageMap vote.value.map { userId -> UserId(userId) } }, endTime = kind.endTime, + isEdited = kind.hasBeenEdited, ) } is TimelineItemContentKind.UnableToDecrypt -> { diff --git a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/RoomSummaryFixture.kt b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/RoomSummaryFixture.kt index 3c7b3eb594..645aac488c 100644 --- a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/RoomSummaryFixture.kt +++ b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/RoomSummaryFixture.kt @@ -188,5 +188,6 @@ fun aPollContent( maxSelections = 1u, answers = answers, votes = mapOf(), - endTime = null + endTime = null, + isEdited = false, ) From e2c013e35be2c8f3992b06cb9460851da1d26108 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 4 Dec 2023 17:34:55 +0100 Subject: [PATCH 2/2] Fix compilation issue after merge from GH... --- .../timeline/components/TimelineItemEventRowWithReplyPreview.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventRowWithReplyPreview.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventRowWithReplyPreview.kt index 3d03e99600..33e97a4428 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventRowWithReplyPreview.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventRowWithReplyPreview.kt @@ -131,7 +131,7 @@ class InReplyToDetailsProvider : PreviewParameterProvider { maxSelections = 1u, answers = persistentListOf(), votes = persistentMapOf(), - endTime = null + endTime = null, isEdited = false, ), ).map {