Browse Source

Merge pull request #1273 from vector-im/feature/fga/memory_leak_timeline_content

TimelineEvent : fix memory leak
pull/1280/head
ganfra 1 year ago committed by GitHub
parent
commit
bd8b2d0a68
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 145
      libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/item/event/TimelineEventContentMapper.kt

145
libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/item/event/TimelineEventContentMapper.kt

@ -34,84 +34,91 @@ import io.element.android.libraries.matrix.impl.media.map
import io.element.android.libraries.matrix.impl.poll.map import io.element.android.libraries.matrix.impl.poll.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.use
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.MembershipChange as RustMembershipChange
import org.matrix.rustcomponents.sdk.OtherState as RustOtherState 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): EventContent = content.use { fun map(content: TimelineItemContent): EventContent {
when (val kind = it.kind()) { return content.use {
is TimelineItemContentKind.FailedToParseMessageLike -> { content.kind().use { kind ->
FailedToParseMessageLikeContent( map(content, kind)
eventType = kind.eventType,
error = kind.error
)
} }
is TimelineItemContentKind.FailedToParseState -> { }
FailedToParseStateContent( }
eventType = kind.eventType,
stateKey = kind.stateKey, private fun map(content: TimelineItemContent, kind: TimelineItemContentKind) = when (kind) {
error = kind.error is TimelineItemContentKind.FailedToParseMessageLike -> {
) FailedToParseMessageLikeContent(
} eventType = kind.eventType,
TimelineItemContentKind.Message -> { error = kind.error
val message = it.asMessage() )
if (message == null) { }
UnknownContent is TimelineItemContentKind.FailedToParseState -> {
} else { FailedToParseStateContent(
eventMessageMapper.map(message) eventType = kind.eventType,
} stateKey = kind.stateKey,
} error = kind.error
is TimelineItemContentKind.ProfileChange -> { )
ProfileChangeContent( }
displayName = kind.displayName, TimelineItemContentKind.Message -> {
prevDisplayName = kind.prevDisplayName, val message = content.asMessage()
avatarUrl = kind.avatarUrl, if (message == null) {
prevAvatarUrl = kind.prevAvatarUrl UnknownContent
) } else {
} eventMessageMapper.map(message)
TimelineItemContentKind.RedactedMessage -> {
RedactedContent
}
is TimelineItemContentKind.RoomMembership -> {
RoomMembershipContent(
UserId(kind.userId),
kind.change?.map()
)
}
is TimelineItemContentKind.State -> {
StateContent(
stateKey = kind.stateKey,
content = kind.content.map()
)
}
is TimelineItemContentKind.Sticker -> {
StickerContent(
body = kind.body,
info = kind.info.map(),
url = kind.url,
)
}
is TimelineItemContentKind.Poll -> {
PollContent(
question = kind.question,
kind = kind.kind.map(),
maxSelections = kind.maxSelections,
answers = kind.answers.map { answer -> answer.map() },
votes = kind.votes.mapValues { vote ->
vote.value.map { userId -> UserId(userId) }
},
endTime = kind.endTime,
)
}
is TimelineItemContentKind.UnableToDecrypt -> {
UnableToDecryptContent(
data = kind.msg.map()
)
} }
else -> UnknownContent
} }
is TimelineItemContentKind.ProfileChange -> {
ProfileChangeContent(
displayName = kind.displayName,
prevDisplayName = kind.prevDisplayName,
avatarUrl = kind.avatarUrl,
prevAvatarUrl = kind.prevAvatarUrl
)
}
TimelineItemContentKind.RedactedMessage -> {
RedactedContent
}
is TimelineItemContentKind.RoomMembership -> {
RoomMembershipContent(
UserId(kind.userId),
kind.change?.map()
)
}
is TimelineItemContentKind.State -> {
StateContent(
stateKey = kind.stateKey,
content = kind.content.map()
)
}
is TimelineItemContentKind.Sticker -> {
StickerContent(
body = kind.body,
info = kind.info.map(),
url = kind.url,
)
}
is TimelineItemContentKind.Poll -> {
PollContent(
question = kind.question,
kind = kind.kind.map(),
maxSelections = kind.maxSelections,
answers = kind.answers.map { answer -> answer.map() },
votes = kind.votes.mapValues { vote ->
vote.value.map { userId -> UserId(userId) }
},
endTime = kind.endTime,
)
}
is TimelineItemContentKind.UnableToDecrypt -> {
UnableToDecryptContent(
data = kind.msg.map()
)
}
else -> UnknownContent
} }
} }

Loading…
Cancel
Save