[MatrixSDK] map the remaining EventContents

This commit is contained in:
ganfra 2023-03-14 12:28:46 +01:00
parent 2dc44250fb
commit ccde8adef3
7 changed files with 78 additions and 23 deletions

View file

@ -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)

View file

@ -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 <R, T : R> Result<T>.mapFailure(transform: (exception: Throwable) -> Throwable): Result<R> {
return when (val exception = exceptionOrNull()) {

View file

@ -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

View file

@ -31,5 +31,5 @@ data class EventTimelineItem(
val sender: UserId,
val senderProfile: ProfileTimelineDetails,
val timestamp: Long,
val content: TimelineEventContent
val content: EventContent
)

View file

@ -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
)
}
}

View file

@ -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

View file

@ -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)