Prepare update to Rust SDK 0.1.36 (#966)

* Update to Rust SDK 0.1.36

* Cancel fetching members when the we exit the room
This commit is contained in:
Jorge Martin Espinosa 2023-07-26 16:22:09 +02:00 committed by GitHub
parent 1806ebaa02
commit 05f7037939
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
16 changed files with 99 additions and 55 deletions

View file

@ -103,7 +103,7 @@ class RustMatrixClient constructor(
builder.finish()
}
private val notificationService = RustNotificationService(notificationClient)
private val notificationService = RustNotificationService(sessionId, notificationClient, clock)
private val isLoggingOut = AtomicBoolean(false)

View file

@ -19,19 +19,29 @@ package io.element.android.libraries.matrix.impl.notification
import io.element.android.libraries.core.bool.orFalse
import io.element.android.libraries.matrix.api.core.EventId
import io.element.android.libraries.matrix.api.core.RoomId
import io.element.android.libraries.matrix.api.core.UserId
import io.element.android.libraries.matrix.api.core.SessionId
import io.element.android.libraries.matrix.api.notification.NotificationContent
import io.element.android.libraries.matrix.api.notification.NotificationData
import io.element.android.libraries.matrix.api.room.RoomMembershipState
import io.element.android.services.toolbox.api.systemclock.SystemClock
import org.matrix.rustcomponents.sdk.NotificationEvent
import org.matrix.rustcomponents.sdk.NotificationItem
import org.matrix.rustcomponents.sdk.use
class NotificationMapper {
private val timelineEventMapper = TimelineEventMapper()
class NotificationMapper(
private val sessionId: SessionId,
private val clock: SystemClock,
) {
private val notificationContentMapper = NotificationContentMapper(sessionId)
fun map(roomId: RoomId, notificationItem: NotificationItem): NotificationData {
fun map(
eventId: EventId,
roomId: RoomId,
notificationItem: NotificationItem
): NotificationData {
return notificationItem.use { item ->
NotificationData(
senderId = UserId(item.event.senderId()),
eventId = EventId(item.event.eventId()),
eventId = eventId,
roomId = roomId,
senderAvatarUrl = item.senderInfo.avatarUrl,
senderDisplayName = item.senderInfo.displayName,
@ -39,9 +49,30 @@ class NotificationMapper {
roomDisplayName = item.roomInfo.displayName,
isDirect = item.roomInfo.isDirect,
isEncrypted = item.roomInfo.isEncrypted.orFalse(),
isNoisy = item.isNoisy,
event = item.event.use { event -> timelineEventMapper.map(event) }
isNoisy = item.isNoisy.orFalse(),
timestamp = item.timestamp() ?: clock.epochMillis(),
content = item.event.use(notificationContentMapper::map),
contentUrl = null,
)
}
}
}
class NotificationContentMapper(
private val sessionId: SessionId,
) {
private val timelineEventToNotificationContentMapper = TimelineEventToNotificationContentMapper()
fun map(notificationEvent: NotificationEvent): NotificationContent =
when (notificationEvent) {
is NotificationEvent.Timeline -> timelineEventToNotificationContentMapper.map(notificationEvent.event)
is NotificationEvent.Invite -> NotificationContent.StateEvent.RoomMemberContent(
userId = sessionId.value,
membershipState = RoomMembershipState.INVITE,
)
}
}
private fun NotificationItem.timestamp(): Long? {
return (this.event as? NotificationEvent.Timeline)?.event?.timestamp()?.toLong()
}

View file

@ -21,13 +21,16 @@ import io.element.android.libraries.matrix.api.core.RoomId
import io.element.android.libraries.matrix.api.core.SessionId
import io.element.android.libraries.matrix.api.notification.NotificationData
import io.element.android.libraries.matrix.api.notification.NotificationService
import io.element.android.services.toolbox.api.systemclock.SystemClock
import org.matrix.rustcomponents.sdk.NotificationClient
import org.matrix.rustcomponents.sdk.use
class RustNotificationService(
sessionId: SessionId,
private val notificationClient: NotificationClient,
clock: SystemClock,
) : NotificationService {
private val notificationMapper: NotificationMapper = NotificationMapper()
private val notificationMapper: NotificationMapper = NotificationMapper(sessionId, clock)
override fun getNotification(
userId: SessionId,
@ -36,9 +39,9 @@ class RustNotificationService(
filterByPushRules: Boolean,
): Result<NotificationData?> {
return runCatching {
val item = notificationClient.getNotification(roomId.value, eventId.value)
val item = notificationClient.getNotificationWithSlidingSync(roomId.value, eventId.value)
item?.use {
notificationMapper.map(roomId, it)
notificationMapper.map(eventId, roomId, it)
}
}
}

View file

@ -16,8 +16,8 @@
package io.element.android.libraries.matrix.impl.notification
import io.element.android.libraries.matrix.api.core.UserId
import io.element.android.libraries.matrix.api.notification.NotificationContent
import io.element.android.libraries.matrix.api.notification.NotificationEvent
import io.element.android.libraries.matrix.impl.room.RoomMemberMapper
import io.element.android.libraries.matrix.impl.timeline.item.event.EventMessageMapper
import org.matrix.rustcomponents.sdk.MessageLikeEventContent
@ -27,22 +27,18 @@ import org.matrix.rustcomponents.sdk.TimelineEventType
import org.matrix.rustcomponents.sdk.use
import javax.inject.Inject
class TimelineEventMapper @Inject constructor() {
class TimelineEventToNotificationContentMapper @Inject constructor() {
fun map(timelineEvent: TimelineEvent): NotificationEvent {
fun map(timelineEvent: TimelineEvent): NotificationContent {
return timelineEvent.use {
NotificationEvent(
timestamp = it.timestamp().toLong(),
content = it.eventType().toContent(),
contentUrl = null // TODO it.eventType().toContentUrl(),
)
it.eventType().toContent(senderId = UserId(timelineEvent.senderId()))
}
}
}
private fun TimelineEventType.toContent(): NotificationContent {
private fun TimelineEventType.toContent(senderId: UserId): NotificationContent {
return when (this) {
is TimelineEventType.MessageLike -> content.toContent()
is TimelineEventType.MessageLike -> content.toContent(senderId)
is TimelineEventType.State -> content.toContent()
}
}
@ -75,7 +71,7 @@ private fun StateEventContent.toContent(): NotificationContent.StateEvent {
}
}
private fun MessageLikeEventContent.toContent(): NotificationContent.MessageLike {
private fun MessageLikeEventContent.toContent(senderId: UserId): NotificationContent.MessageLike {
return use {
when (it) {
MessageLikeEventContent.CallAnswer -> NotificationContent.MessageLike.CallAnswer
@ -92,7 +88,7 @@ private fun MessageLikeEventContent.toContent(): NotificationContent.MessageLike
is MessageLikeEventContent.ReactionContent -> NotificationContent.MessageLike.ReactionContent(it.relatedEventId)
MessageLikeEventContent.RoomEncrypted -> NotificationContent.MessageLike.RoomEncrypted
is MessageLikeEventContent.RoomMessage -> {
NotificationContent.MessageLike.RoomMessage(EventMessageMapper().mapMessageType(it.messageType))
NotificationContent.MessageLike.RoomMessage(senderId, EventMessageMapper().mapMessageType(it.messageType))
}
MessageLikeEventContent.RoomRedaction -> NotificationContent.MessageLike.RoomRedaction
MessageLikeEventContent.Sticker -> NotificationContent.MessageLike.Sticker

View file

@ -27,6 +27,7 @@ import io.element.android.libraries.matrix.impl.timeline.item.event.EventTimelin
import io.element.android.libraries.matrix.impl.timeline.item.event.TimelineEventContentMapper
import io.element.android.libraries.matrix.impl.timeline.item.virtual.VirtualTimelineItemMapper
import io.element.android.libraries.matrix.impl.timeline.postprocessor.TimelineEncryptedHistoryPostProcessor
import io.element.android.libraries.matrix.impl.util.TaskHandleBag
import kotlinx.coroutines.CompletableDeferred
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.CoroutineScope
@ -102,6 +103,8 @@ class RustMatrixTimeline(
init {
Timber.d("Initialize timeline for room ${matrixRoom.roomId}")
val taskHandleBag = TaskHandleBag()
roomCoroutineScope.launch(dispatcher) {
innerRoom.timelineDiffFlow { initialList ->
postItems(initialList)
@ -117,7 +120,9 @@ class RustMatrixTimeline(
postPaginationStatus(it)
}.launchIn(this)
fetchMembers()
taskHandleBag += fetchMembers().getOrNull()
}.invokeOnCompletion {
taskHandleBag.dispose()
}
}

View file

@ -42,6 +42,8 @@ import org.matrix.rustcomponents.sdk.MessageType as RustMessageType
class EventMessageMapper {
private val timelineEventContentMapper by lazy { TimelineEventContentMapper() }
fun map(message: Message): MessageContent = message.use {
val type = it.msgtype().use(this::mapMessageType)
val inReplyToId = it.inReplyTo()?.eventId?.let(::EventId)
@ -51,7 +53,7 @@ class EventMessageMapper {
val senderProfile = details.senderProfile as? ProfileDetails.Ready
InReplyTo.Ready(
eventId = inReplyToId!!,
content = map(details.message),
content = timelineEventContentMapper.map(details.content),
senderId = UserId(details.sender),
senderDisplayName = senderProfile?.displayName,
senderAvatarUrl = senderProfile?.avatarUrl,