[MatrixSDK] map the remaining EventContents
This commit is contained in:
parent
2dc44250fb
commit
ccde8adef3
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.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)
|
||||
|
|
|
|||
|
|
@ -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()) {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -31,5 +31,5 @@ data class EventTimelineItem(
|
|||
val sender: UserId,
|
||||
val senderProfile: ProfileTimelineDetails,
|
||||
val timestamp: Long,
|
||||
val content: TimelineEventContent
|
||||
val content: EventContent
|
||||
)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue