Room summary; handle encrypted events
This commit is contained in:
parent
e1b6f4bd74
commit
5e9ecfbcc0
@ -46,22 +46,45 @@ internal interface CacheableTimelineEventFactory : TimelineEventFactory {
|
|||||||
* It handles decryption, extracting additional data around an event as sender data and relation.
|
* It handles decryption, extracting additional data around an event as sender data and relation.
|
||||||
*/
|
*/
|
||||||
internal class SimpleTimelineEventFactory @Inject constructor(private val roomMemberExtractor: SenderRoomMemberExtractor,
|
internal class SimpleTimelineEventFactory @Inject constructor(private val roomMemberExtractor: SenderRoomMemberExtractor,
|
||||||
private val relationExtractor: EventRelationExtractor
|
private val relationExtractor: EventRelationExtractor,
|
||||||
|
private val cryptoService: CryptoService
|
||||||
) : TimelineEventFactory {
|
) : TimelineEventFactory {
|
||||||
|
|
||||||
override fun create(eventEntity: EventEntity, realm: Realm): TimelineEvent {
|
override fun create(eventEntity: EventEntity, realm: Realm): TimelineEvent {
|
||||||
val senderRoomMember = roomMemberExtractor.extractFrom(eventEntity, realm)
|
val senderRoomMember = roomMemberExtractor.extractFrom(eventEntity, realm)
|
||||||
val relations = relationExtractor.extractFrom(eventEntity, realm)
|
val relations = relationExtractor.extractFrom(eventEntity, realm)
|
||||||
|
|
||||||
|
val event = eventEntity.asDomain()
|
||||||
|
if (event.getClearType() == EventType.ENCRYPTED) {
|
||||||
|
handleEncryptedEvent(event)
|
||||||
|
}
|
||||||
|
|
||||||
|
val isUniqueDisplayName = RoomMembers(realm, eventEntity.roomId).isUniqueDisplayName(senderRoomMember?.displayName)
|
||||||
|
|
||||||
return TimelineEvent(
|
return TimelineEvent(
|
||||||
eventEntity.asDomain(),
|
event,
|
||||||
eventEntity.localId,
|
eventEntity.localId,
|
||||||
eventEntity.displayIndex,
|
eventEntity.displayIndex,
|
||||||
senderRoomMember?.displayName,
|
senderRoomMember?.displayName,
|
||||||
/* TODO Rebase */ true,
|
isUniqueDisplayName,
|
||||||
senderRoomMember?.avatarUrl,
|
senderRoomMember?.avatarUrl,
|
||||||
eventEntity.sendState,
|
eventEntity.sendState,
|
||||||
relations
|
relations
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun handleEncryptedEvent(event: Event) {
|
||||||
|
Timber.v("Encrypted event: try to decrypt ${event.eventId}")
|
||||||
|
try {
|
||||||
|
val result = cryptoService.decryptEvent(event, UUID.randomUUID().toString())
|
||||||
|
event.setClearData(result)
|
||||||
|
} catch (failure: Throwable) {
|
||||||
|
Timber.e(failure, "Encrypted event: decryption failed")
|
||||||
|
if (failure is MXDecryptionException) {
|
||||||
|
event.setCryptoError(failure.cryptoError)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal class InMemoryTimelineEventFactory @Inject constructor(private val roomMemberExtractor: SenderRoomMemberExtractor,
|
internal class InMemoryTimelineEventFactory @Inject constructor(private val roomMemberExtractor: SenderRoomMemberExtractor,
|
||||||
@ -125,6 +148,7 @@ internal class InMemoryTimelineEventFactory @Inject constructor(private val room
|
|||||||
|
|
||||||
override fun clear() {
|
override fun clear() {
|
||||||
senderCache.clear()
|
senderCache.clear()
|
||||||
|
decryptionCache.clear()
|
||||||
}
|
}
|
||||||
|
|
||||||
private data class SenderData(
|
private data class SenderData(
|
||||||
|
@ -45,11 +45,11 @@ class RoomSummaryItemFactory @Inject constructor(private val noticeEventFormatte
|
|||||||
val latestEvent = roomSummary.latestEvent
|
val latestEvent = roomSummary.latestEvent
|
||||||
if (latestEvent != null) {
|
if (latestEvent != null) {
|
||||||
val date = latestEvent.root.localDateTime()
|
val date = latestEvent.root.localDateTime()
|
||||||
val currentData = DateProvider.currentLocalDateTime()
|
val currentDate = DateProvider.currentLocalDateTime()
|
||||||
val isSameDay = date.toLocalDate() == currentData.toLocalDate()
|
val isSameDay = date.toLocalDate() == currentDate.toLocalDate()
|
||||||
latestFormattedEvent = if (latestEvent.root.type == EventType.MESSAGE) {
|
latestFormattedEvent = if (latestEvent.root.getClearType() == EventType.MESSAGE) {
|
||||||
val senderName = latestEvent.senderName() ?: latestEvent.root.senderId
|
val senderName = latestEvent.senderName() ?: latestEvent.root.senderId
|
||||||
val content = latestEvent.root.content?.toModel<MessageContent>()
|
val content = latestEvent.root.getClearContent()?.toModel<MessageContent>()
|
||||||
val message = content?.body ?: ""
|
val message = content?.body ?: ""
|
||||||
if (roomSummary.isDirect.not() && senderName != null) {
|
if (roomSummary.isDirect.not() && senderName != null) {
|
||||||
span {
|
span {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user