From 5e9ecfbcc06b6ef74fc4e10159fe3d800ee6f903 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 1 Jul 2019 12:58:10 +0200 Subject: [PATCH] Room summary; handle encrypted events --- .../room/timeline/TimelineEventFactory.kt | 30 +++++++++++++++++-- .../home/room/list/RoomSummaryItemFactory.kt | 8 ++--- 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/timeline/TimelineEventFactory.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/timeline/TimelineEventFactory.kt index 06ac23d5..d40bd4b2 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/timeline/TimelineEventFactory.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/timeline/TimelineEventFactory.kt @@ -46,22 +46,45 @@ internal interface CacheableTimelineEventFactory : TimelineEventFactory { * It handles decryption, extracting additional data around an event as sender data and relation. */ internal class SimpleTimelineEventFactory @Inject constructor(private val roomMemberExtractor: SenderRoomMemberExtractor, - private val relationExtractor: EventRelationExtractor + private val relationExtractor: EventRelationExtractor, + private val cryptoService: CryptoService ) : TimelineEventFactory { + override fun create(eventEntity: EventEntity, realm: Realm): TimelineEvent { val senderRoomMember = roomMemberExtractor.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( - eventEntity.asDomain(), + event, eventEntity.localId, eventEntity.displayIndex, senderRoomMember?.displayName, - /* TODO Rebase */ true, + isUniqueDisplayName, senderRoomMember?.avatarUrl, eventEntity.sendState, 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, @@ -125,6 +148,7 @@ internal class InMemoryTimelineEventFactory @Inject constructor(private val room override fun clear() { senderCache.clear() + decryptionCache.clear() } private data class SenderData( diff --git a/vector/src/main/java/im/vector/riotredesign/features/home/room/list/RoomSummaryItemFactory.kt b/vector/src/main/java/im/vector/riotredesign/features/home/room/list/RoomSummaryItemFactory.kt index 6095089a..1d32ae3a 100644 --- a/vector/src/main/java/im/vector/riotredesign/features/home/room/list/RoomSummaryItemFactory.kt +++ b/vector/src/main/java/im/vector/riotredesign/features/home/room/list/RoomSummaryItemFactory.kt @@ -45,11 +45,11 @@ class RoomSummaryItemFactory @Inject constructor(private val noticeEventFormatte val latestEvent = roomSummary.latestEvent if (latestEvent != null) { val date = latestEvent.root.localDateTime() - val currentData = DateProvider.currentLocalDateTime() - val isSameDay = date.toLocalDate() == currentData.toLocalDate() - latestFormattedEvent = if (latestEvent.root.type == EventType.MESSAGE) { + val currentDate = DateProvider.currentLocalDateTime() + val isSameDay = date.toLocalDate() == currentDate.toLocalDate() + latestFormattedEvent = if (latestEvent.root.getClearType() == EventType.MESSAGE) { val senderName = latestEvent.senderName() ?: latestEvent.root.senderId - val content = latestEvent.root.content?.toModel() + val content = latestEvent.root.getClearContent()?.toModel() val message = content?.body ?: "" if (roomSummary.isDirect.not() && senderName != null) { span {