From ccde8adef3561af9fc40ebfab90ae8089cdc2d9b Mon Sep 17 00:00:00 2001 From: ganfra Date: Tue, 14 Mar 2023 12:28:46 +0100 Subject: [PATCH] [MatrixSDK] map the remaining EventContents --- .../event/TimelineItemContentFactory.kt | 4 +- .../libraries/core/extensions/Result.kt | 2 +- ...imelineEventContent.kt => EventContent.kt} | 24 +++---- .../timeline/item/event/EventTimelineItem.kt | 2 +- .../timeline/item/event/EventMessageMapper.kt | 4 +- .../item/event/EventTimelineItemMapper.kt | 1 - .../item/event/TimelineEventContentMapper.kt | 64 +++++++++++++++++-- 7 files changed, 78 insertions(+), 23 deletions(-) rename libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/{TimelineEventContent.kt => EventContent.kt} (92%) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentFactory.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentFactory.kt index 262ef31d2e..527de007b1 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentFactory.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentFactory.kt @@ -26,7 +26,7 @@ import io.element.android.libraries.matrix.api.timeline.item.event.RedactedConte import io.element.android.libraries.matrix.api.timeline.item.event.RoomMembershipContent import io.element.android.libraries.matrix.api.timeline.item.event.StateContent import io.element.android.libraries.matrix.api.timeline.item.event.StickerContent -import io.element.android.libraries.matrix.api.timeline.item.event.TimelineEventContent +import io.element.android.libraries.matrix.api.timeline.item.event.EventContent import io.element.android.libraries.matrix.api.timeline.item.event.UnableToDecryptContent import io.element.android.libraries.matrix.api.timeline.item.event.UnknownContent import javax.inject.Inject @@ -43,7 +43,7 @@ class TimelineItemContentFactory @Inject constructor( private val failedToParseStateFactory: TimelineItemContentFailedToParseStateFactory ) { - fun create(itemContent: TimelineEventContent): TimelineItemEventContent { + fun create(itemContent: EventContent): TimelineItemEventContent { return when (itemContent) { is FailedToParseMessageLikeContent -> failedToParseMessageFactory.create(itemContent) is FailedToParseStateContent -> failedToParseStateFactory.create(itemContent) diff --git a/libraries/core/src/main/kotlin/io/element/android/libraries/core/extensions/Result.kt b/libraries/core/src/main/kotlin/io/element/android/libraries/core/extensions/Result.kt index b63efa781d..baa3b35e2b 100644 --- a/libraries/core/src/main/kotlin/io/element/android/libraries/core/extensions/Result.kt +++ b/libraries/core/src/main/kotlin/io/element/android/libraries/core/extensions/Result.kt @@ -17,7 +17,7 @@ package io.element.android.libraries.core.extensions /** - * Can be used to transform some Throwable into some other + * Can be used to transform some Throwable into some other. */ inline fun Result.mapFailure(transform: (exception: Throwable) -> Throwable): Result { return when (val exception = exceptionOrNull()) { diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/TimelineEventContent.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventContent.kt similarity index 92% rename from libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/TimelineEventContent.kt rename to libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventContent.kt index 12bd98568a..e19cbf9b57 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/TimelineEventContent.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventContent.kt @@ -22,26 +22,26 @@ import io.element.android.libraries.matrix.api.media.FileInfo import io.element.android.libraries.matrix.api.media.ImageInfo import io.element.android.libraries.matrix.api.media.VideoInfo -sealed interface TimelineEventContent +sealed interface EventContent data class MessageContent( val body: String, val inReplyTo: UserId?, val isEdited: Boolean, val type: MessageType? -) : TimelineEventContent +) : EventContent -object RedactedContent : TimelineEventContent +object RedactedContent : EventContent data class StickerContent( val body: String, val info: ImageInfo, val url: String -) : TimelineEventContent +) : EventContent data class UnableToDecryptContent( val data: Data -) : TimelineEventContent { +) : EventContent { sealed interface Data { data class OlmV1Curve25519AesSha2( val senderKey: String @@ -58,32 +58,32 @@ data class UnableToDecryptContent( data class RoomMembershipContent( val userId: UserId, val change: MembershipChange? -) : TimelineEventContent +) : EventContent data class ProfileChangeContent( val displayName: String?, val prevDisplayName: String?, val avatarUrl: String?, val prevAvatarUrl: String? -) : TimelineEventContent +) : EventContent data class StateContent( val stateKey: String, val content: OtherState -) : TimelineEventContent +) : EventContent data class FailedToParseMessageLikeContent( val eventType: String, val error: String -) : TimelineEventContent +) : EventContent data class FailedToParseStateContent( val eventType: String, val stateKey: String, val error: String -) : TimelineEventContent +) : EventContent -object UnknownContent : TimelineEventContent +object UnknownContent : EventContent sealed interface MessageType @@ -199,7 +199,7 @@ sealed interface OtherState { object RoomTombstone : OtherState data class RoomTopic( - val `topic`: String? + val topic: String? ) : OtherState object SpaceChild : OtherState diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventTimelineItem.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventTimelineItem.kt index 1178e9a786..8b667107d7 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventTimelineItem.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventTimelineItem.kt @@ -31,5 +31,5 @@ data class EventTimelineItem( val sender: UserId, val senderProfile: ProfileTimelineDetails, val timestamp: Long, - val content: TimelineEventContent + val content: EventContent ) diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/item/event/EventMessageMapper.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/item/event/EventMessageMapper.kt index 801060171c..13db63a261 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/item/event/EventMessageMapper.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/item/event/EventMessageMapper.kt @@ -39,7 +39,7 @@ import org.matrix.rustcomponents.sdk.MessageFormat as RustMessageFormat class EventMessageMapper { fun map(message: Message): MessageContent = message.use { - val content = message.msgtype().use { type -> + val type = message.msgtype().use { type -> when (type) { is MessageType.Audio -> { AudioMessageType(type.content.body, type.content.source.useUrl(), type.content.info?.map()) @@ -71,7 +71,7 @@ class EventMessageMapper { body = message.body(), inReplyTo = message.inReplyTo()?.let { UserId(it) }, isEdited = message.isEdited(), - type = content + type = type ) } } diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/item/event/EventTimelineItemMapper.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/item/event/EventTimelineItemMapper.kt index c399dd0b1d..11e60eea0e 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/item/event/EventTimelineItemMapper.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/item/event/EventTimelineItemMapper.kt @@ -22,7 +22,6 @@ import io.element.android.libraries.matrix.api.timeline.item.event.EventReaction import io.element.android.libraries.matrix.api.timeline.item.event.EventSendState import io.element.android.libraries.matrix.api.timeline.item.event.EventTimelineItem import io.element.android.libraries.matrix.api.timeline.item.event.ProfileTimelineDetails -import io.element.android.libraries.matrix.api.timeline.item.event.TimelineEventContent import org.matrix.rustcomponents.sdk.Reaction import org.matrix.rustcomponents.sdk.EventSendState as RustEventSendState import org.matrix.rustcomponents.sdk.EventTimelineItem as RustEventTimelineItem 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 08a09c602f..51e84b441f 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 @@ -20,21 +20,25 @@ import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.timeline.item.event.FailedToParseMessageLikeContent import io.element.android.libraries.matrix.api.timeline.item.event.FailedToParseStateContent import io.element.android.libraries.matrix.api.timeline.item.event.MembershipChange +import io.element.android.libraries.matrix.api.timeline.item.event.OtherState import io.element.android.libraries.matrix.api.timeline.item.event.ProfileChangeContent import io.element.android.libraries.matrix.api.timeline.item.event.RedactedContent import io.element.android.libraries.matrix.api.timeline.item.event.RoomMembershipContent +import io.element.android.libraries.matrix.api.timeline.item.event.StateContent import io.element.android.libraries.matrix.api.timeline.item.event.StickerContent -import io.element.android.libraries.matrix.api.timeline.item.event.TimelineEventContent +import io.element.android.libraries.matrix.api.timeline.item.event.EventContent import io.element.android.libraries.matrix.api.timeline.item.event.UnableToDecryptContent import io.element.android.libraries.matrix.api.timeline.item.event.UnknownContent import io.element.android.libraries.matrix.impl.media.map import org.matrix.rustcomponents.sdk.TimelineItemContent import org.matrix.rustcomponents.sdk.TimelineItemContentKind import org.matrix.rustcomponents.sdk.EncryptedMessage as RustEncryptedMessage +import org.matrix.rustcomponents.sdk.MembershipChange as RustMembershipChange +import org.matrix.rustcomponents.sdk.OtherState as RustOtherState class TimelineEventContentMapper(private val eventMessageMapper: EventMessageMapper = EventMessageMapper()) { - fun map(content: TimelineItemContent): TimelineEventContent = content.use { + fun map(content: TimelineItemContent): EventContent = content.use { when (val kind = content.kind()) { is TimelineItemContentKind.FailedToParseMessageLike -> { FailedToParseMessageLikeContent( @@ -71,11 +75,14 @@ class TimelineEventContentMapper(private val eventMessageMapper: EventMessageMap is TimelineItemContentKind.RoomMembership -> { RoomMembershipContent( UserId(kind.userId), - MembershipChange.JOINED + kind.change?.map() ) } is TimelineItemContentKind.State -> { - UnknownContent + StateContent( + stateKey = kind.stateKey, + content = kind.content.map() + ) } is TimelineItemContentKind.Sticker -> { StickerContent( @@ -93,6 +100,55 @@ class TimelineEventContentMapper(private val eventMessageMapper: EventMessageMap } } +private fun RustMembershipChange.map(): MembershipChange { + return when (this) { + RustMembershipChange.NONE -> MembershipChange.NONE + RustMembershipChange.ERROR -> MembershipChange.ERROR + RustMembershipChange.JOINED -> MembershipChange.JOINED + RustMembershipChange.LEFT -> MembershipChange.LEFT + RustMembershipChange.BANNED -> MembershipChange.BANNED + RustMembershipChange.UNBANNED -> MembershipChange.UNBANNED + RustMembershipChange.KICKED -> MembershipChange.KICKED + RustMembershipChange.INVITED -> MembershipChange.INVITED + RustMembershipChange.KICKED_AND_BANNED -> MembershipChange.KICKED_AND_BANNED + RustMembershipChange.INVITATION_ACCEPTED -> MembershipChange.INVITATION_ACCEPTED + RustMembershipChange.INVITATION_REJECTED -> MembershipChange.INVITATION_REJECTED + RustMembershipChange.INVITATION_REVOKED -> MembershipChange.INVITATION_REVOKED + RustMembershipChange.KNOCKED -> MembershipChange.KNOCKED + RustMembershipChange.KNOCK_ACCEPTED -> MembershipChange.KNOCK_ACCEPTED + RustMembershipChange.KNOCK_RETRACTED -> MembershipChange.KNOCK_RETRACTED + RustMembershipChange.KNOCK_DENIED -> MembershipChange.KNOCK_DENIED + RustMembershipChange.NOT_IMPLEMENTED -> MembershipChange.NOT_IMPLEMENTED + } +} + +//TODO extract state events? +private fun RustOtherState.map(): OtherState { + return when (this) { + is RustOtherState.Custom -> OtherState.Custom(eventType) + RustOtherState.PolicyRuleRoom -> OtherState.PolicyRuleRoom + RustOtherState.PolicyRuleServer -> OtherState.PolicyRuleServer + RustOtherState.PolicyRuleUser -> OtherState.PolicyRuleUser + RustOtherState.RoomAliases -> OtherState.RoomAliases + is RustOtherState.RoomAvatar -> OtherState.RoomAvatar(url) + RustOtherState.RoomCanonicalAlias -> OtherState.RoomCanonicalAlias + RustOtherState.RoomCreate -> OtherState.RoomCreate + RustOtherState.RoomEncryption -> OtherState.RoomEncryption + RustOtherState.RoomGuestAccess -> OtherState.RoomGuestAccess + RustOtherState.RoomHistoryVisibility -> OtherState.RoomHistoryVisibility + RustOtherState.RoomJoinRules -> OtherState.RoomJoinRules + is RustOtherState.RoomName -> OtherState.RoomName(name) + RustOtherState.RoomPinnedEvents -> OtherState.RoomPinnedEvents + RustOtherState.RoomPowerLevels -> OtherState.RoomPowerLevels + RustOtherState.RoomServerAcl -> OtherState.RoomServerAcl + is RustOtherState.RoomThirdPartyInvite -> OtherState.RoomThirdPartyInvite(displayName) + RustOtherState.RoomTombstone -> OtherState.RoomTombstone + is RustOtherState.RoomTopic -> OtherState.RoomTopic(topic) + RustOtherState.SpaceChild -> OtherState.SpaceChild + RustOtherState.SpaceParent -> OtherState.SpaceParent + } +} + private fun RustEncryptedMessage.map(): UnableToDecryptContent.Data { return when (this) { is RustEncryptedMessage.MegolmV1AesSha2 -> UnableToDecryptContent.Data.MegolmV1AesSha2(sessionId)