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
|
|
@ -517,42 +517,46 @@ private fun ReplyToContent(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun attachmentThumbnailInfoForInReplyTo(inReplyTo: InReplyTo.Ready) =
|
private fun attachmentThumbnailInfoForInReplyTo(inReplyTo: InReplyTo.Ready): AttachmentThumbnailInfo? {
|
||||||
when (val type = inReplyTo.content.type) {
|
val messageContent = inReplyTo.content as? MessageContent ?: return null
|
||||||
|
return when (val type = messageContent.type) {
|
||||||
is ImageMessageType -> AttachmentThumbnailInfo(
|
is ImageMessageType -> AttachmentThumbnailInfo(
|
||||||
thumbnailSource = type.info?.thumbnailSource,
|
thumbnailSource = type.info?.thumbnailSource,
|
||||||
textContent = inReplyTo.content.body,
|
textContent = messageContent.body,
|
||||||
type = AttachmentThumbnailType.Image,
|
type = AttachmentThumbnailType.Image,
|
||||||
blurHash = type.info?.blurhash,
|
blurHash = type.info?.blurhash,
|
||||||
)
|
)
|
||||||
is VideoMessageType -> AttachmentThumbnailInfo(
|
is VideoMessageType -> AttachmentThumbnailInfo(
|
||||||
thumbnailSource = type.info?.thumbnailSource,
|
thumbnailSource = type.info?.thumbnailSource,
|
||||||
textContent = inReplyTo.content.body,
|
textContent = messageContent.body,
|
||||||
type = AttachmentThumbnailType.Video,
|
type = AttachmentThumbnailType.Video,
|
||||||
blurHash = type.info?.blurhash,
|
blurHash = type.info?.blurhash,
|
||||||
)
|
)
|
||||||
is FileMessageType -> AttachmentThumbnailInfo(
|
is FileMessageType -> AttachmentThumbnailInfo(
|
||||||
thumbnailSource = type.info?.thumbnailSource,
|
thumbnailSource = type.info?.thumbnailSource,
|
||||||
textContent = inReplyTo.content.body,
|
textContent = messageContent.body,
|
||||||
type = AttachmentThumbnailType.File,
|
type = AttachmentThumbnailType.File,
|
||||||
)
|
)
|
||||||
is LocationMessageType -> AttachmentThumbnailInfo(
|
is LocationMessageType -> AttachmentThumbnailInfo(
|
||||||
textContent = inReplyTo.content.body,
|
textContent = messageContent.body,
|
||||||
type = AttachmentThumbnailType.Location,
|
type = AttachmentThumbnailType.Location,
|
||||||
)
|
)
|
||||||
is AudioMessageType -> AttachmentThumbnailInfo(
|
is AudioMessageType -> AttachmentThumbnailInfo(
|
||||||
textContent = inReplyTo.content.body,
|
textContent = messageContent.body,
|
||||||
type = AttachmentThumbnailType.Audio,
|
type = AttachmentThumbnailType.Audio,
|
||||||
)
|
)
|
||||||
else -> null
|
else -> null
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
private fun textForInReplyTo(inReplyTo: InReplyTo.Ready) =
|
private fun textForInReplyTo(inReplyTo: InReplyTo.Ready): String {
|
||||||
when (inReplyTo.content.type) {
|
val messageContent = inReplyTo.content as? MessageContent ?: return ""
|
||||||
|
return when (messageContent.type) {
|
||||||
is LocationMessageType -> stringResource(CommonStrings.common_shared_location)
|
is LocationMessageType -> stringResource(CommonStrings.common_shared_location)
|
||||||
else -> inReplyTo.content.body
|
else -> messageContent.body
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Preview
|
@Preview
|
||||||
@Composable
|
@Composable
|
||||||
|
|
|
||||||
|
|
@ -145,7 +145,7 @@ jsoup = { module = "org.jsoup:jsoup", version.ref = "jsoup" }
|
||||||
appyx_core = { module = "com.bumble.appyx:core", version.ref = "appyx" }
|
appyx_core = { module = "com.bumble.appyx:core", version.ref = "appyx" }
|
||||||
molecule-runtime = { module = "app.cash.molecule:molecule-runtime", version.ref = "molecule" }
|
molecule-runtime = { module = "app.cash.molecule:molecule-runtime", version.ref = "molecule" }
|
||||||
timber = "com.jakewharton.timber:timber:5.0.1"
|
timber = "com.jakewharton.timber:timber:5.0.1"
|
||||||
matrix_sdk = "org.matrix.rustcomponents:sdk-android:0.1.34"
|
matrix_sdk = "org.matrix.rustcomponents:sdk-android:0.1.36"
|
||||||
sqldelight-driver-android = { module = "com.squareup.sqldelight:android-driver", version.ref = "sqldelight" }
|
sqldelight-driver-android = { module = "com.squareup.sqldelight:android-driver", version.ref = "sqldelight" }
|
||||||
sqldelight-driver-jvm = { module = "com.squareup.sqldelight:sqlite-driver", version.ref = "sqldelight" }
|
sqldelight-driver-jvm = { module = "com.squareup.sqldelight:sqlite-driver", version.ref = "sqldelight" }
|
||||||
sqldelight-coroutines = { module = "com.squareup.sqldelight:coroutines-extensions", version.ref = "sqldelight" }
|
sqldelight-coroutines = { module = "com.squareup.sqldelight:coroutines-extensions", version.ref = "sqldelight" }
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,6 @@ import io.element.android.libraries.matrix.api.room.RoomMembershipState
|
||||||
import io.element.android.libraries.matrix.api.timeline.item.event.MessageType
|
import io.element.android.libraries.matrix.api.timeline.item.event.MessageType
|
||||||
|
|
||||||
data class NotificationData(
|
data class NotificationData(
|
||||||
val senderId: UserId,
|
|
||||||
val eventId: EventId,
|
val eventId: EventId,
|
||||||
val roomId: RoomId,
|
val roomId: RoomId,
|
||||||
val senderAvatarUrl: String?,
|
val senderAvatarUrl: String?,
|
||||||
|
|
@ -33,14 +32,10 @@ data class NotificationData(
|
||||||
val isDirect: Boolean,
|
val isDirect: Boolean,
|
||||||
val isEncrypted: Boolean,
|
val isEncrypted: Boolean,
|
||||||
val isNoisy: Boolean,
|
val isNoisy: Boolean,
|
||||||
val event: NotificationEvent,
|
|
||||||
)
|
|
||||||
|
|
||||||
data class NotificationEvent(
|
|
||||||
val timestamp: Long,
|
val timestamp: Long,
|
||||||
val content: NotificationContent,
|
val content: NotificationContent,
|
||||||
// For images for instance
|
// For images for instance
|
||||||
val contentUrl: String?
|
val contentUrl: String?,
|
||||||
)
|
)
|
||||||
|
|
||||||
sealed interface NotificationContent {
|
sealed interface NotificationContent {
|
||||||
|
|
@ -61,6 +56,7 @@ sealed interface NotificationContent {
|
||||||
) : MessageLike
|
) : MessageLike
|
||||||
object RoomEncrypted : MessageLike
|
object RoomEncrypted : MessageLike
|
||||||
data class RoomMessage(
|
data class RoomMessage(
|
||||||
|
val senderId: UserId,
|
||||||
val messageType: MessageType
|
val messageType: MessageType
|
||||||
) : MessageLike
|
) : MessageLike
|
||||||
object RoomRedaction : MessageLike
|
object RoomRedaction : MessageLike
|
||||||
|
|
|
||||||
|
|
@ -44,7 +44,7 @@ sealed interface InReplyTo {
|
||||||
/** The event details are available. */
|
/** The event details are available. */
|
||||||
data class Ready(
|
data class Ready(
|
||||||
val eventId: EventId,
|
val eventId: EventId,
|
||||||
val content: MessageContent,
|
val content: EventContent,
|
||||||
val senderId: UserId,
|
val senderId: UserId,
|
||||||
val senderDisplayName: String?,
|
val senderDisplayName: String?,
|
||||||
val senderAvatarUrl: String?,
|
val senderAvatarUrl: String?,
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,7 @@ anvil {
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
// api(projects.libraries.rustsdk)
|
// api(projects.libraries.rustsdk)
|
||||||
implementation(libs.matrix.sdk)
|
implementation(libs.matrix.sdk)
|
||||||
implementation(projects.libraries.di)
|
implementation(projects.libraries.di)
|
||||||
implementation(projects.libraries.androidutils)
|
implementation(projects.libraries.androidutils)
|
||||||
|
|
|
||||||
|
|
@ -103,7 +103,7 @@ class RustMatrixClient constructor(
|
||||||
builder.finish()
|
builder.finish()
|
||||||
}
|
}
|
||||||
|
|
||||||
private val notificationService = RustNotificationService(notificationClient)
|
private val notificationService = RustNotificationService(sessionId, notificationClient, clock)
|
||||||
|
|
||||||
private val isLoggingOut = AtomicBoolean(false)
|
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.core.bool.orFalse
|
||||||
import io.element.android.libraries.matrix.api.core.EventId
|
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.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.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.NotificationItem
|
||||||
import org.matrix.rustcomponents.sdk.use
|
import org.matrix.rustcomponents.sdk.use
|
||||||
|
|
||||||
class NotificationMapper {
|
class NotificationMapper(
|
||||||
private val timelineEventMapper = TimelineEventMapper()
|
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 ->
|
return notificationItem.use { item ->
|
||||||
NotificationData(
|
NotificationData(
|
||||||
senderId = UserId(item.event.senderId()),
|
eventId = eventId,
|
||||||
eventId = EventId(item.event.eventId()),
|
|
||||||
roomId = roomId,
|
roomId = roomId,
|
||||||
senderAvatarUrl = item.senderInfo.avatarUrl,
|
senderAvatarUrl = item.senderInfo.avatarUrl,
|
||||||
senderDisplayName = item.senderInfo.displayName,
|
senderDisplayName = item.senderInfo.displayName,
|
||||||
|
|
@ -39,9 +49,30 @@ class NotificationMapper {
|
||||||
roomDisplayName = item.roomInfo.displayName,
|
roomDisplayName = item.roomInfo.displayName,
|
||||||
isDirect = item.roomInfo.isDirect,
|
isDirect = item.roomInfo.isDirect,
|
||||||
isEncrypted = item.roomInfo.isEncrypted.orFalse(),
|
isEncrypted = item.roomInfo.isEncrypted.orFalse(),
|
||||||
isNoisy = item.isNoisy,
|
isNoisy = item.isNoisy.orFalse(),
|
||||||
event = item.event.use { event -> timelineEventMapper.map(event) }
|
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.core.SessionId
|
||||||
import io.element.android.libraries.matrix.api.notification.NotificationData
|
import io.element.android.libraries.matrix.api.notification.NotificationData
|
||||||
import io.element.android.libraries.matrix.api.notification.NotificationService
|
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.NotificationClient
|
||||||
import org.matrix.rustcomponents.sdk.use
|
import org.matrix.rustcomponents.sdk.use
|
||||||
|
|
||||||
class RustNotificationService(
|
class RustNotificationService(
|
||||||
|
sessionId: SessionId,
|
||||||
private val notificationClient: NotificationClient,
|
private val notificationClient: NotificationClient,
|
||||||
|
clock: SystemClock,
|
||||||
) : NotificationService {
|
) : NotificationService {
|
||||||
private val notificationMapper: NotificationMapper = NotificationMapper()
|
private val notificationMapper: NotificationMapper = NotificationMapper(sessionId, clock)
|
||||||
|
|
||||||
override fun getNotification(
|
override fun getNotification(
|
||||||
userId: SessionId,
|
userId: SessionId,
|
||||||
|
|
@ -36,9 +39,9 @@ class RustNotificationService(
|
||||||
filterByPushRules: Boolean,
|
filterByPushRules: Boolean,
|
||||||
): Result<NotificationData?> {
|
): Result<NotificationData?> {
|
||||||
return runCatching {
|
return runCatching {
|
||||||
val item = notificationClient.getNotification(roomId.value, eventId.value)
|
val item = notificationClient.getNotificationWithSlidingSync(roomId.value, eventId.value)
|
||||||
item?.use {
|
item?.use {
|
||||||
notificationMapper.map(roomId, it)
|
notificationMapper.map(eventId, roomId, it)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -16,8 +16,8 @@
|
||||||
|
|
||||||
package io.element.android.libraries.matrix.impl.notification
|
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.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.room.RoomMemberMapper
|
||||||
import io.element.android.libraries.matrix.impl.timeline.item.event.EventMessageMapper
|
import io.element.android.libraries.matrix.impl.timeline.item.event.EventMessageMapper
|
||||||
import org.matrix.rustcomponents.sdk.MessageLikeEventContent
|
import org.matrix.rustcomponents.sdk.MessageLikeEventContent
|
||||||
|
|
@ -27,22 +27,18 @@ import org.matrix.rustcomponents.sdk.TimelineEventType
|
||||||
import org.matrix.rustcomponents.sdk.use
|
import org.matrix.rustcomponents.sdk.use
|
||||||
import javax.inject.Inject
|
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 {
|
return timelineEvent.use {
|
||||||
NotificationEvent(
|
it.eventType().toContent(senderId = UserId(timelineEvent.senderId()))
|
||||||
timestamp = it.timestamp().toLong(),
|
|
||||||
content = it.eventType().toContent(),
|
|
||||||
contentUrl = null // TODO it.eventType().toContentUrl(),
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun TimelineEventType.toContent(): NotificationContent {
|
private fun TimelineEventType.toContent(senderId: UserId): NotificationContent {
|
||||||
return when (this) {
|
return when (this) {
|
||||||
is TimelineEventType.MessageLike -> content.toContent()
|
is TimelineEventType.MessageLike -> content.toContent(senderId)
|
||||||
is TimelineEventType.State -> content.toContent()
|
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 {
|
return use {
|
||||||
when (it) {
|
when (it) {
|
||||||
MessageLikeEventContent.CallAnswer -> NotificationContent.MessageLike.CallAnswer
|
MessageLikeEventContent.CallAnswer -> NotificationContent.MessageLike.CallAnswer
|
||||||
|
|
@ -92,7 +88,7 @@ private fun MessageLikeEventContent.toContent(): NotificationContent.MessageLike
|
||||||
is MessageLikeEventContent.ReactionContent -> NotificationContent.MessageLike.ReactionContent(it.relatedEventId)
|
is MessageLikeEventContent.ReactionContent -> NotificationContent.MessageLike.ReactionContent(it.relatedEventId)
|
||||||
MessageLikeEventContent.RoomEncrypted -> NotificationContent.MessageLike.RoomEncrypted
|
MessageLikeEventContent.RoomEncrypted -> NotificationContent.MessageLike.RoomEncrypted
|
||||||
is MessageLikeEventContent.RoomMessage -> {
|
is MessageLikeEventContent.RoomMessage -> {
|
||||||
NotificationContent.MessageLike.RoomMessage(EventMessageMapper().mapMessageType(it.messageType))
|
NotificationContent.MessageLike.RoomMessage(senderId, EventMessageMapper().mapMessageType(it.messageType))
|
||||||
}
|
}
|
||||||
MessageLikeEventContent.RoomRedaction -> NotificationContent.MessageLike.RoomRedaction
|
MessageLikeEventContent.RoomRedaction -> NotificationContent.MessageLike.RoomRedaction
|
||||||
MessageLikeEventContent.Sticker -> NotificationContent.MessageLike.Sticker
|
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.event.TimelineEventContentMapper
|
||||||
import io.element.android.libraries.matrix.impl.timeline.item.virtual.VirtualTimelineItemMapper
|
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.timeline.postprocessor.TimelineEncryptedHistoryPostProcessor
|
||||||
|
import io.element.android.libraries.matrix.impl.util.TaskHandleBag
|
||||||
import kotlinx.coroutines.CompletableDeferred
|
import kotlinx.coroutines.CompletableDeferred
|
||||||
import kotlinx.coroutines.CoroutineDispatcher
|
import kotlinx.coroutines.CoroutineDispatcher
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
|
|
@ -102,6 +103,8 @@ class RustMatrixTimeline(
|
||||||
|
|
||||||
init {
|
init {
|
||||||
Timber.d("Initialize timeline for room ${matrixRoom.roomId}")
|
Timber.d("Initialize timeline for room ${matrixRoom.roomId}")
|
||||||
|
|
||||||
|
val taskHandleBag = TaskHandleBag()
|
||||||
roomCoroutineScope.launch(dispatcher) {
|
roomCoroutineScope.launch(dispatcher) {
|
||||||
innerRoom.timelineDiffFlow { initialList ->
|
innerRoom.timelineDiffFlow { initialList ->
|
||||||
postItems(initialList)
|
postItems(initialList)
|
||||||
|
|
@ -117,7 +120,9 @@ class RustMatrixTimeline(
|
||||||
postPaginationStatus(it)
|
postPaginationStatus(it)
|
||||||
}.launchIn(this)
|
}.launchIn(this)
|
||||||
|
|
||||||
fetchMembers()
|
taskHandleBag += fetchMembers().getOrNull()
|
||||||
|
}.invokeOnCompletion {
|
||||||
|
taskHandleBag.dispose()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -42,6 +42,8 @@ import org.matrix.rustcomponents.sdk.MessageType as RustMessageType
|
||||||
|
|
||||||
class EventMessageMapper {
|
class EventMessageMapper {
|
||||||
|
|
||||||
|
private val timelineEventContentMapper by lazy { TimelineEventContentMapper() }
|
||||||
|
|
||||||
fun map(message: Message): MessageContent = message.use {
|
fun map(message: Message): MessageContent = message.use {
|
||||||
val type = it.msgtype().use(this::mapMessageType)
|
val type = it.msgtype().use(this::mapMessageType)
|
||||||
val inReplyToId = it.inReplyTo()?.eventId?.let(::EventId)
|
val inReplyToId = it.inReplyTo()?.eventId?.let(::EventId)
|
||||||
|
|
@ -51,7 +53,7 @@ class EventMessageMapper {
|
||||||
val senderProfile = details.senderProfile as? ProfileDetails.Ready
|
val senderProfile = details.senderProfile as? ProfileDetails.Ready
|
||||||
InReplyTo.Ready(
|
InReplyTo.Ready(
|
||||||
eventId = inReplyToId!!,
|
eventId = inReplyToId!!,
|
||||||
content = map(details.message),
|
content = timelineEventContentMapper.map(details.content),
|
||||||
senderId = UserId(details.sender),
|
senderId = UserId(details.sender),
|
||||||
senderDisplayName = senderProfile?.displayName,
|
senderDisplayName = senderProfile?.displayName,
|
||||||
senderAvatarUrl = senderProfile?.avatarUrl,
|
senderAvatarUrl = senderProfile?.avatarUrl,
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,7 @@ 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.RoomId
|
||||||
import io.element.android.libraries.matrix.api.core.SessionId
|
import io.element.android.libraries.matrix.api.core.SessionId
|
||||||
import io.element.android.libraries.matrix.api.core.ThreadId
|
import io.element.android.libraries.matrix.api.core.ThreadId
|
||||||
|
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.NotificationContent
|
||||||
import io.element.android.libraries.matrix.api.notification.NotificationData
|
import io.element.android.libraries.matrix.api.notification.NotificationData
|
||||||
import io.element.android.libraries.matrix.api.room.RoomMembershipState
|
import io.element.android.libraries.matrix.api.room.RoomMembershipState
|
||||||
|
|
@ -81,18 +82,18 @@ class NotifiableEventResolver @Inject constructor(
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun NotificationData.asNotifiableEvent(userId: SessionId): NotifiableEvent? {
|
private fun NotificationData.asNotifiableEvent(userId: SessionId): NotifiableEvent? {
|
||||||
return when (val content = this.event.content) {
|
return when (val content = this.content) {
|
||||||
is NotificationContent.MessageLike.RoomMessage -> {
|
is NotificationContent.MessageLike.RoomMessage -> {
|
||||||
buildNotifiableMessageEvent(
|
buildNotifiableMessageEvent(
|
||||||
sessionId = userId,
|
sessionId = userId,
|
||||||
|
senderId = content.senderId,
|
||||||
roomId = roomId,
|
roomId = roomId,
|
||||||
eventId = eventId,
|
eventId = eventId,
|
||||||
noisy = isNoisy,
|
noisy = isNoisy,
|
||||||
timestamp = event.timestamp,
|
timestamp = this.timestamp,
|
||||||
senderName = senderDisplayName,
|
senderName = senderDisplayName,
|
||||||
senderId = senderId.value,
|
|
||||||
body = descriptionFromMessageContent(content),
|
body = descriptionFromMessageContent(content),
|
||||||
imageUriString = event.contentUrl,
|
imageUriString = this.contentUrl,
|
||||||
roomName = roomDisplayName,
|
roomName = roomDisplayName,
|
||||||
roomIsDirect = isDirect,
|
roomIsDirect = isDirect,
|
||||||
roomAvatarPath = roomAvatarUrl,
|
roomAvatarPath = roomAvatarUrl,
|
||||||
|
|
@ -109,7 +110,7 @@ class NotifiableEventResolver @Inject constructor(
|
||||||
canBeReplaced = true,
|
canBeReplaced = true,
|
||||||
roomName = roomDisplayName,
|
roomName = roomDisplayName,
|
||||||
noisy = isNoisy,
|
noisy = isNoisy,
|
||||||
timestamp = event.timestamp,
|
timestamp = this.timestamp,
|
||||||
soundName = null,
|
soundName = null,
|
||||||
isRedacted = false,
|
isRedacted = false,
|
||||||
isUpdated = false,
|
isUpdated = false,
|
||||||
|
|
@ -177,6 +178,7 @@ class NotifiableEventResolver @Inject constructor(
|
||||||
@Suppress("LongParameterList")
|
@Suppress("LongParameterList")
|
||||||
private fun buildNotifiableMessageEvent(
|
private fun buildNotifiableMessageEvent(
|
||||||
sessionId: SessionId,
|
sessionId: SessionId,
|
||||||
|
senderId: UserId,
|
||||||
roomId: RoomId,
|
roomId: RoomId,
|
||||||
eventId: EventId,
|
eventId: EventId,
|
||||||
editedEventId: EventId? = null,
|
editedEventId: EventId? = null,
|
||||||
|
|
@ -184,7 +186,6 @@ private fun buildNotifiableMessageEvent(
|
||||||
noisy: Boolean,
|
noisy: Boolean,
|
||||||
timestamp: Long,
|
timestamp: Long,
|
||||||
senderName: String?,
|
senderName: String?,
|
||||||
senderId: String?,
|
|
||||||
body: String?,
|
body: String?,
|
||||||
// We cannot use Uri? type here, as that could trigger a
|
// We cannot use Uri? type here, as that could trigger a
|
||||||
// NotSerializableException when persisting this to storage
|
// NotSerializableException when persisting this to storage
|
||||||
|
|
@ -202,6 +203,7 @@ private fun buildNotifiableMessageEvent(
|
||||||
isUpdated: Boolean = false
|
isUpdated: Boolean = false
|
||||||
) = NotifiableMessageEvent(
|
) = NotifiableMessageEvent(
|
||||||
sessionId = sessionId,
|
sessionId = sessionId,
|
||||||
|
senderId = senderId,
|
||||||
roomId = roomId,
|
roomId = roomId,
|
||||||
eventId = eventId,
|
eventId = eventId,
|
||||||
editedEventId = editedEventId,
|
editedEventId = editedEventId,
|
||||||
|
|
@ -209,7 +211,6 @@ private fun buildNotifiableMessageEvent(
|
||||||
noisy = noisy,
|
noisy = noisy,
|
||||||
timestamp = timestamp,
|
timestamp = timestamp,
|
||||||
senderName = senderName,
|
senderName = senderName,
|
||||||
senderId = senderId,
|
|
||||||
body = body,
|
body = body,
|
||||||
imageUriString = imageUriString,
|
imageUriString = imageUriString,
|
||||||
threadId = threadId,
|
threadId = threadId,
|
||||||
|
|
|
||||||
|
|
@ -108,7 +108,7 @@ class RoomGroupMessageCreator @Inject constructor(
|
||||||
Person.Builder()
|
Person.Builder()
|
||||||
.setName(event.senderName?.annotateForDebug(70))
|
.setName(event.senderName?.annotateForDebug(70))
|
||||||
.setIcon(bitmapLoader.getUserIcon(event.senderAvatarPath))
|
.setIcon(bitmapLoader.getUserIcon(event.senderAvatarPath))
|
||||||
.setKey(event.senderId)
|
.setKey(event.senderId.value)
|
||||||
.build()
|
.build()
|
||||||
}
|
}
|
||||||
when {
|
when {
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,7 @@ 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.RoomId
|
||||||
import io.element.android.libraries.matrix.api.core.SessionId
|
import io.element.android.libraries.matrix.api.core.SessionId
|
||||||
import io.element.android.libraries.matrix.api.core.ThreadId
|
import io.element.android.libraries.matrix.api.core.ThreadId
|
||||||
|
import io.element.android.libraries.matrix.api.core.UserId
|
||||||
import io.element.android.libraries.matrix.api.timeline.item.event.EventType
|
import io.element.android.libraries.matrix.api.timeline.item.event.EventType
|
||||||
import io.element.android.services.appnavstate.api.AppNavigationState
|
import io.element.android.services.appnavstate.api.AppNavigationState
|
||||||
import io.element.android.services.appnavstate.api.currentRoomId
|
import io.element.android.services.appnavstate.api.currentRoomId
|
||||||
|
|
@ -32,10 +33,10 @@ data class NotifiableMessageEvent(
|
||||||
override val eventId: EventId,
|
override val eventId: EventId,
|
||||||
override val editedEventId: EventId?,
|
override val editedEventId: EventId?,
|
||||||
override val canBeReplaced: Boolean,
|
override val canBeReplaced: Boolean,
|
||||||
|
val senderId: UserId,
|
||||||
val noisy: Boolean,
|
val noisy: Boolean,
|
||||||
val timestamp: Long,
|
val timestamp: Long,
|
||||||
val senderName: String?,
|
val senderName: String?,
|
||||||
val senderId: String?,
|
|
||||||
val body: String?,
|
val body: String?,
|
||||||
// We cannot use Uri? type here, as that could trigger a
|
// We cannot use Uri? type here, as that could trigger a
|
||||||
// NotSerializableException when persisting this to storage
|
// NotSerializableException when persisting this to storage
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,7 @@ 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.RoomId
|
||||||
import io.element.android.libraries.matrix.api.core.SessionId
|
import io.element.android.libraries.matrix.api.core.SessionId
|
||||||
import io.element.android.libraries.matrix.api.core.ThreadId
|
import io.element.android.libraries.matrix.api.core.ThreadId
|
||||||
|
import io.element.android.libraries.matrix.api.core.UserId
|
||||||
import io.element.android.libraries.matrix.test.AN_EVENT_ID
|
import io.element.android.libraries.matrix.test.AN_EVENT_ID
|
||||||
import io.element.android.libraries.matrix.test.A_ROOM_ID
|
import io.element.android.libraries.matrix.test.A_ROOM_ID
|
||||||
import io.element.android.libraries.matrix.test.A_SESSION_ID
|
import io.element.android.libraries.matrix.test.A_SESSION_ID
|
||||||
|
|
@ -84,7 +85,7 @@ fun aNotifiableMessageEvent(
|
||||||
noisy = false,
|
noisy = false,
|
||||||
timestamp = 0,
|
timestamp = 0,
|
||||||
senderName = "sender-name",
|
senderName = "sender-name",
|
||||||
senderId = "sending-id",
|
senderId = UserId("@sending-id:domain.com"),
|
||||||
body = "message-body",
|
body = "message-body",
|
||||||
roomId = roomId,
|
roomId = roomId,
|
||||||
threadId = threadId,
|
threadId = threadId,
|
||||||
|
|
|
||||||
|
|
@ -29,6 +29,10 @@ dependencyResolutionManagement {
|
||||||
repositories {
|
repositories {
|
||||||
google()
|
google()
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
|
// To have immediate access to Rust SDK versions
|
||||||
|
maven {
|
||||||
|
url = URI("https://s01.oss.sonatype.org/content/repositories/releases")
|
||||||
|
}
|
||||||
maven {
|
maven {
|
||||||
url = URI("https://www.jitpack.io")
|
url = URI("https://www.jitpack.io")
|
||||||
content {
|
content {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue