diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesPresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesPresenter.kt index 879ad45eb9..8a7c15a3ec 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesPresenter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesPresenter.kt @@ -187,13 +187,17 @@ class MessagesPresenter @AssistedInject constructor( val membersState by room.membersStateFlow.collectAsState() val dmRoomMember by room.getDirectRoomMember(membersState) + val roomMemberIdentityStateChanges = identityChangeState.roomMemberIdentityStateChanges // TODO use `RoomInfo.isEncrypted` as a key here once it's available - LifecycleResumeEffect(dmRoomMember) { + LifecycleResumeEffect(dmRoomMember, roomMemberIdentityStateChanges) { if (room.isEncrypted) { val dmRoomMemberId = dmRoomMember?.userId localCoroutineScope.launch { - dmRoomMemberId?.let { dmUserVerificationState = encryptionService.getUserIdentity(it).getOrNull() } + dmRoomMemberId?.let { userId -> + dmUserVerificationState = roomMemberIdentityStateChanges.find { it.identityRoomMember.userId == userId }?.identityState + ?: encryptionService.getUserIdentity(userId).getOrNull() + } } } onPauseOrDispose {} diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesStateProvider.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesStateProvider.kt index 5086823875..b5b87b2f87 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesStateProvider.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesStateProvider.kt @@ -81,7 +81,8 @@ open class MessagesStateProvider : PreviewParameterProvider { currentPinnedMessageIndex = 0, ), ), - aMessagesState(roomName = AsyncData.Success("A DM with a very looong name"), dmUserVerificationState = IdentityState.Verified) + aMessagesState(roomName = AsyncData.Success("A DM with a very looong name"), dmUserVerificationState = IdentityState.Verified), + aMessagesState(roomName = AsyncData.Success("A DM with a very looong name"), dmUserVerificationState = IdentityState.VerificationViolation), ) } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesView.kt index 8e812275a5..5d6ad6fcbe 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesView.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesView.kt @@ -191,7 +191,7 @@ fun MessagesView( roomAvatar = state.roomAvatar.dataOrNull(), heroes = state.heroes, roomCallState = state.roomCallState, - isDmUserVerified = state.dmUserVerificationState?.let { it == IdentityState.Verified }, + dmUserIdentityState = state.dmUserVerificationState, onBackClick = { hidingKeyboard { onBackClick() } }, onRoomDetailsClick = { hidingKeyboard { onRoomDetailsClick() } }, onJoinCallClick = onJoinCallClick, @@ -458,7 +458,7 @@ private fun MessagesViewTopBar( roomAvatar: AvatarData?, heroes: ImmutableList, roomCallState: RoomCallState, - isDmUserVerified: Boolean?, + dmUserIdentityState: IdentityState?, onRoomDetailsClick: () -> Unit, onJoinCallClick: () -> Unit, onBackClick: () -> Unit, @@ -490,13 +490,24 @@ private fun MessagesViewTopBar( ) } - if (isDmUserVerified == true) { - Icon( - modifier = Modifier.requiredWidthIn(min = 24.dp), - imageVector = CompoundIcons.Verified(), - tint = ElementTheme.colors.iconSuccessPrimary, - contentDescription = null - ) + when (dmUserIdentityState) { + IdentityState.Verified -> { + Icon( + modifier = Modifier.requiredWidthIn(min = 16.dp), + imageVector = CompoundIcons.Verified(), + tint = ElementTheme.colors.iconSuccessPrimary, + contentDescription = null, + ) + } + IdentityState.VerificationViolation -> { + Icon( + modifier = Modifier.requiredWidthIn(min = 16.dp), + imageVector = CompoundIcons.ErrorSolid(), + tint = ElementTheme.colors.iconCriticalPrimary, + contentDescription = null, + ) + } + else -> Unit } } },