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:
parent
1806ebaa02
commit
05f7037939
16 changed files with 99 additions and 55 deletions
|
|
@ -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)
|
||||
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -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()
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue