[MatrixSDK] map the remaining EventContents
This commit is contained in:
parent
76aefaf995
commit
7599b5617f
7 changed files with 78 additions and 23 deletions
|
|
@ -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.RoomMembershipContent
|
||||||
import io.element.android.libraries.matrix.api.timeline.item.event.StateContent
|
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.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.UnableToDecryptContent
|
||||||
import io.element.android.libraries.matrix.api.timeline.item.event.UnknownContent
|
import io.element.android.libraries.matrix.api.timeline.item.event.UnknownContent
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
@ -43,7 +43,7 @@ class TimelineItemContentFactory @Inject constructor(
|
||||||
private val failedToParseStateFactory: TimelineItemContentFailedToParseStateFactory
|
private val failedToParseStateFactory: TimelineItemContentFailedToParseStateFactory
|
||||||
) {
|
) {
|
||||||
|
|
||||||
fun create(itemContent: TimelineEventContent): TimelineItemEventContent {
|
fun create(itemContent: EventContent): TimelineItemEventContent {
|
||||||
return when (itemContent) {
|
return when (itemContent) {
|
||||||
is FailedToParseMessageLikeContent -> failedToParseMessageFactory.create(itemContent)
|
is FailedToParseMessageLikeContent -> failedToParseMessageFactory.create(itemContent)
|
||||||
is FailedToParseStateContent -> failedToParseStateFactory.create(itemContent)
|
is FailedToParseStateContent -> failedToParseStateFactory.create(itemContent)
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@
|
||||||
package io.element.android.libraries.core.extensions
|
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> {
|
inline fun <R, T : R> Result<T>.mapFailure(transform: (exception: Throwable) -> Throwable): Result<R> {
|
||||||
return when (val exception = exceptionOrNull()) {
|
return when (val exception = exceptionOrNull()) {
|
||||||
|
|
|
||||||
|
|
@ -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.ImageInfo
|
||||||
import io.element.android.libraries.matrix.api.media.VideoInfo
|
import io.element.android.libraries.matrix.api.media.VideoInfo
|
||||||
|
|
||||||
sealed interface TimelineEventContent
|
sealed interface EventContent
|
||||||
|
|
||||||
data class MessageContent(
|
data class MessageContent(
|
||||||
val body: String,
|
val body: String,
|
||||||
val inReplyTo: UserId?,
|
val inReplyTo: UserId?,
|
||||||
val isEdited: Boolean,
|
val isEdited: Boolean,
|
||||||
val type: MessageType?
|
val type: MessageType?
|
||||||
) : TimelineEventContent
|
) : EventContent
|
||||||
|
|
||||||
object RedactedContent : TimelineEventContent
|
object RedactedContent : EventContent
|
||||||
|
|
||||||
data class StickerContent(
|
data class StickerContent(
|
||||||
val body: String,
|
val body: String,
|
||||||
val info: ImageInfo,
|
val info: ImageInfo,
|
||||||
val url: String
|
val url: String
|
||||||
) : TimelineEventContent
|
) : EventContent
|
||||||
|
|
||||||
data class UnableToDecryptContent(
|
data class UnableToDecryptContent(
|
||||||
val data: Data
|
val data: Data
|
||||||
) : TimelineEventContent {
|
) : EventContent {
|
||||||
sealed interface Data {
|
sealed interface Data {
|
||||||
data class OlmV1Curve25519AesSha2(
|
data class OlmV1Curve25519AesSha2(
|
||||||
val senderKey: String
|
val senderKey: String
|
||||||
|
|
@ -58,32 +58,32 @@ data class UnableToDecryptContent(
|
||||||
data class RoomMembershipContent(
|
data class RoomMembershipContent(
|
||||||
val userId: UserId,
|
val userId: UserId,
|
||||||
val change: MembershipChange?
|
val change: MembershipChange?
|
||||||
) : TimelineEventContent
|
) : EventContent
|
||||||
|
|
||||||
data class ProfileChangeContent(
|
data class ProfileChangeContent(
|
||||||
val displayName: String?,
|
val displayName: String?,
|
||||||
val prevDisplayName: String?,
|
val prevDisplayName: String?,
|
||||||
val avatarUrl: String?,
|
val avatarUrl: String?,
|
||||||
val prevAvatarUrl: String?
|
val prevAvatarUrl: String?
|
||||||
) : TimelineEventContent
|
) : EventContent
|
||||||
|
|
||||||
data class StateContent(
|
data class StateContent(
|
||||||
val stateKey: String,
|
val stateKey: String,
|
||||||
val content: OtherState
|
val content: OtherState
|
||||||
) : TimelineEventContent
|
) : EventContent
|
||||||
|
|
||||||
data class FailedToParseMessageLikeContent(
|
data class FailedToParseMessageLikeContent(
|
||||||
val eventType: String,
|
val eventType: String,
|
||||||
val error: String
|
val error: String
|
||||||
) : TimelineEventContent
|
) : EventContent
|
||||||
|
|
||||||
data class FailedToParseStateContent(
|
data class FailedToParseStateContent(
|
||||||
val eventType: String,
|
val eventType: String,
|
||||||
val stateKey: String,
|
val stateKey: String,
|
||||||
val error: String
|
val error: String
|
||||||
) : TimelineEventContent
|
) : EventContent
|
||||||
|
|
||||||
object UnknownContent : TimelineEventContent
|
object UnknownContent : EventContent
|
||||||
|
|
||||||
sealed interface MessageType
|
sealed interface MessageType
|
||||||
|
|
||||||
|
|
@ -199,7 +199,7 @@ sealed interface OtherState {
|
||||||
object RoomTombstone : OtherState
|
object RoomTombstone : OtherState
|
||||||
|
|
||||||
data class RoomTopic(
|
data class RoomTopic(
|
||||||
val `topic`: String?
|
val topic: String?
|
||||||
) : OtherState
|
) : OtherState
|
||||||
|
|
||||||
object SpaceChild : OtherState
|
object SpaceChild : OtherState
|
||||||
|
|
@ -31,5 +31,5 @@ data class EventTimelineItem(
|
||||||
val sender: UserId,
|
val sender: UserId,
|
||||||
val senderProfile: ProfileTimelineDetails,
|
val senderProfile: ProfileTimelineDetails,
|
||||||
val timestamp: Long,
|
val timestamp: Long,
|
||||||
val content: TimelineEventContent
|
val content: EventContent
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -39,7 +39,7 @@ import org.matrix.rustcomponents.sdk.MessageFormat as RustMessageFormat
|
||||||
class EventMessageMapper {
|
class EventMessageMapper {
|
||||||
|
|
||||||
fun map(message: Message): MessageContent = message.use {
|
fun map(message: Message): MessageContent = message.use {
|
||||||
val content = message.msgtype().use { type ->
|
val type = message.msgtype().use { type ->
|
||||||
when (type) {
|
when (type) {
|
||||||
is MessageType.Audio -> {
|
is MessageType.Audio -> {
|
||||||
AudioMessageType(type.content.body, type.content.source.useUrl(), type.content.info?.map())
|
AudioMessageType(type.content.body, type.content.source.useUrl(), type.content.info?.map())
|
||||||
|
|
@ -71,7 +71,7 @@ class EventMessageMapper {
|
||||||
body = message.body(),
|
body = message.body(),
|
||||||
inReplyTo = message.inReplyTo()?.let { UserId(it) },
|
inReplyTo = message.inReplyTo()?.let { UserId(it) },
|
||||||
isEdited = message.isEdited(),
|
isEdited = message.isEdited(),
|
||||||
type = content
|
type = type
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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.EventSendState
|
||||||
import io.element.android.libraries.matrix.api.timeline.item.event.EventTimelineItem
|
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.ProfileTimelineDetails
|
||||||
import io.element.android.libraries.matrix.api.timeline.item.event.TimelineEventContent
|
|
||||||
import org.matrix.rustcomponents.sdk.Reaction
|
import org.matrix.rustcomponents.sdk.Reaction
|
||||||
import org.matrix.rustcomponents.sdk.EventSendState as RustEventSendState
|
import org.matrix.rustcomponents.sdk.EventSendState as RustEventSendState
|
||||||
import org.matrix.rustcomponents.sdk.EventTimelineItem as RustEventTimelineItem
|
import org.matrix.rustcomponents.sdk.EventTimelineItem as RustEventTimelineItem
|
||||||
|
|
|
||||||
|
|
@ -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.FailedToParseMessageLikeContent
|
||||||
import io.element.android.libraries.matrix.api.timeline.item.event.FailedToParseStateContent
|
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.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.ProfileChangeContent
|
||||||
import io.element.android.libraries.matrix.api.timeline.item.event.RedactedContent
|
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.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.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.UnableToDecryptContent
|
||||||
import io.element.android.libraries.matrix.api.timeline.item.event.UnknownContent
|
import io.element.android.libraries.matrix.api.timeline.item.event.UnknownContent
|
||||||
import io.element.android.libraries.matrix.impl.media.map
|
import io.element.android.libraries.matrix.impl.media.map
|
||||||
import org.matrix.rustcomponents.sdk.TimelineItemContent
|
import org.matrix.rustcomponents.sdk.TimelineItemContent
|
||||||
import org.matrix.rustcomponents.sdk.TimelineItemContentKind
|
import org.matrix.rustcomponents.sdk.TimelineItemContentKind
|
||||||
import org.matrix.rustcomponents.sdk.EncryptedMessage as RustEncryptedMessage
|
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()) {
|
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()) {
|
when (val kind = content.kind()) {
|
||||||
is TimelineItemContentKind.FailedToParseMessageLike -> {
|
is TimelineItemContentKind.FailedToParseMessageLike -> {
|
||||||
FailedToParseMessageLikeContent(
|
FailedToParseMessageLikeContent(
|
||||||
|
|
@ -71,11 +75,14 @@ class TimelineEventContentMapper(private val eventMessageMapper: EventMessageMap
|
||||||
is TimelineItemContentKind.RoomMembership -> {
|
is TimelineItemContentKind.RoomMembership -> {
|
||||||
RoomMembershipContent(
|
RoomMembershipContent(
|
||||||
UserId(kind.userId),
|
UserId(kind.userId),
|
||||||
MembershipChange.JOINED
|
kind.change?.map()
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
is TimelineItemContentKind.State -> {
|
is TimelineItemContentKind.State -> {
|
||||||
UnknownContent
|
StateContent(
|
||||||
|
stateKey = kind.stateKey,
|
||||||
|
content = kind.content.map()
|
||||||
|
)
|
||||||
}
|
}
|
||||||
is TimelineItemContentKind.Sticker -> {
|
is TimelineItemContentKind.Sticker -> {
|
||||||
StickerContent(
|
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 {
|
private fun RustEncryptedMessage.map(): UnableToDecryptContent.Data {
|
||||||
return when (this) {
|
return when (this) {
|
||||||
is RustEncryptedMessage.MegolmV1AesSha2 -> UnableToDecryptContent.Data.MegolmV1AesSha2(sessionId)
|
is RustEncryptedMessage.MegolmV1AesSha2 -> UnableToDecryptContent.Data.MegolmV1AesSha2(sessionId)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue