Skip to content

Commit

Permalink
Merge pull request #3686 from element-hq/feature/bma/identityChangeWo…
Browse files Browse the repository at this point in the history
…rding

Add userId in identity change warning banner
  • Loading branch information
bmarty authored Oct 16, 2024
2 parents 44eb58c + 6392404 commit ce318b3
Show file tree
Hide file tree
Showing 16 changed files with 78 additions and 22 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -105,13 +105,13 @@ class IdentityChangeStatePresenter @Inject constructor(

private fun RoomMember.toIdentityRoomMember() = IdentityRoomMember(
userId = userId,
disambiguatedDisplayName = disambiguatedDisplayName,
displayNameOrDefault = displayNameOrDefault,
avatarData = getAvatarData(AvatarSize.ComposerAlert),
)

private fun createDefaultRoomMemberForIdentityChange(userId: UserId) = IdentityRoomMember(
userId = userId,
disambiguatedDisplayName = userId.value,
displayNameOrDefault = userId.extractedDisplayName,
avatarData = AvatarData(
id = userId.value,
name = null,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,15 +20,31 @@ class IdentityChangeStateProvider : PreviewParameterProvider<IdentityChangeState
anIdentityChangeState(),
anIdentityChangeState(
roomMemberIdentityStateChanges = listOf(
RoomMemberIdentityStateChange(
identityRoomMember = anIdentityRoomMember(disambiguatedDisplayName = "Alice"),
aRoomMemberIdentityStateChange(
identityRoomMember = anIdentityRoomMember(),
identityState = IdentityState.PinViolation,
),
),
),
anIdentityChangeState(
roomMemberIdentityStateChanges = listOf(
aRoomMemberIdentityStateChange(
identityRoomMember = anIdentityRoomMember(displayNameOrDefault = "Alice"),
identityState = IdentityState.PinViolation,
),
),
),
)
}

internal fun aRoomMemberIdentityStateChange(
identityRoomMember: IdentityRoomMember = anIdentityRoomMember(),
identityState: IdentityState = IdentityState.PinViolation,
) = RoomMemberIdentityStateChange(
identityRoomMember = identityRoomMember,
identityState = identityState,
)

internal fun anIdentityChangeState(
roomMemberIdentityStateChanges: List<RoomMemberIdentityStateChange> = emptyList(),
) = IdentityChangeState(
Expand All @@ -38,7 +54,7 @@ internal fun anIdentityChangeState(

internal fun anIdentityRoomMember(
userId: UserId = UserId("@alice:example.com"),
disambiguatedDisplayName: String = userId.value,
displayNameOrDefault: String = userId.extractedDisplayName,
avatarData: AvatarData = AvatarData(
id = userId.value,
name = null,
Expand All @@ -47,6 +63,6 @@ internal fun anIdentityRoomMember(
),
) = IdentityRoomMember(
userId = userId,
disambiguatedDisplayName = disambiguatedDisplayName,
displayNameOrDefault = displayNameOrDefault,
avatarData = avatarData,
)
Original file line number Diff line number Diff line change
Expand Up @@ -40,13 +40,27 @@ fun IdentityChangeStateView(
avatar = pinViolationIdentityChange.identityRoomMember.avatarData,
content = buildAnnotatedString {
val learnMoreStr = stringResource(CommonStrings.action_learn_more)
val displayName = pinViolationIdentityChange.identityRoomMember.displayNameOrDefault
val userIdStr = stringResource(
CommonStrings.crypto_identity_change_pin_violation_new_user_id,
pinViolationIdentityChange.identityRoomMember.userId,
)
val fullText = stringResource(
id = CommonStrings.crypto_identity_change_pin_violation,
pinViolationIdentityChange.identityRoomMember.disambiguatedDisplayName,
id = CommonStrings.crypto_identity_change_pin_violation_new,
displayName,
userIdStr,
learnMoreStr,
)
val learnMoreStartIndex = fullText.indexOf(learnMoreStr)
append(fullText)
val userIdStartIndex = fullText.indexOf(userIdStr)
addStyle(
style = SpanStyle(
fontWeight = FontWeight.Bold,
),
start = userIdStartIndex,
end = userIdStartIndex + userIdStr.length,
)
val learnMoreStartIndex = fullText.lastIndexOf(learnMoreStr)
addStyle(
style = SpanStyle(
textDecoration = TextDecoration.Underline,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,6 @@ import io.element.android.libraries.matrix.api.core.UserId

data class IdentityRoomMember(
val userId: UserId,
val disambiguatedDisplayName: String,
val displayNameOrDefault: String,
val avatarData: AvatarData,
)
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ class IdentityChangeStatePresenterTest {
}

@Test
fun `present - when the room emits identity change, but the feature is disabled, the presenter emits new state`() = runTest {
fun `present - when the room emits identity change, but the feature is disabled, the presenter does not emit new state`() = runTest {
val room = FakeMatrixRoom(
isEncrypted = true,
)
Expand Down Expand Up @@ -106,7 +106,7 @@ class IdentityChangeStatePresenterTest {
}

@Test
fun `present - when the clear room emits identity change, the presenter does not emits new state`() = runTest {
fun `present - when the clear room emits identity change, the presenter does not emit new state`() = runTest {
val room = FakeMatrixRoom(isEncrypted = false)
val presenter = createIdentityChangeStatePresenter(room)
presenter.test {
Expand All @@ -128,6 +128,7 @@ class IdentityChangeStatePresenterTest {
assertThat(finalItem.roomMemberIdentityStateChanges).hasSize(1)
val value = finalItem.roomMemberIdentityStateChanges.first()
assertThat(value.identityRoomMember.userId).isEqualTo(A_USER_ID_2)
assertThat(value.identityRoomMember.displayNameOrDefault).isEqualTo(A_USER_ID_2.extractedDisplayName)
assertThat(value.identityState).isEqualTo(IdentityState.PinViolation)
}
}
Expand Down Expand Up @@ -163,14 +164,14 @@ class IdentityChangeStatePresenterTest {
assertThat(finalItem.roomMemberIdentityStateChanges).hasSize(1)
val value = finalItem.roomMemberIdentityStateChanges.first()
assertThat(value.identityRoomMember.userId).isEqualTo(A_USER_ID_2)
assertThat(value.identityRoomMember.disambiguatedDisplayName).isEqualTo("Alice")
assertThat(value.identityRoomMember.displayNameOrDefault).isEqualTo("Alice")
assertThat(value.identityRoomMember.avatarData.size).isEqualTo(AvatarSize.ComposerAlert)
assertThat(value.identityState).isEqualTo(IdentityState.PinViolation)
}
}

@Test
fun `present - when the user pin the identity, the presenter invokes the encryption service api`() =
fun `present - when the user pins the identity, the presenter invokes the encryption service api`() =
runTest {
val lambda = lambdaRecorder<UserId, Result<Unit>> { Result.success(Unit) }
val encryptionService = FakeEncryptionService(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,4 +24,9 @@ value class UserId(val value: String) : Serializable {
}

override fun toString(): String = value

val extractedDisplayName: String
get() = value
.removePrefix("@")
.substringBefore(":")
}
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,12 @@ data class RoomMember(
isNameAmbiguous -> "$displayName ($userId)"
else -> displayName
}

val displayNameOrDefault: String
get() = when {
displayName == null -> userId.extractedDisplayName
else -> displayName
}
}

enum class RoomMembershipState {
Expand Down
2 changes: 2 additions & 0 deletions libraries/ui-strings/src/main/res/values/localazy.xml
Original file line number Diff line number Diff line change
Expand Up @@ -252,6 +252,8 @@ Reason: %1$s."</string>
<string name="common_waiting_for_decryption_key">"Waiting for this message"</string>
<string name="common_you">"You"</string>
<string name="crypto_identity_change_pin_violation">"%1$s\'s identity appears to have changed. %2$s"</string>
<string name="crypto_identity_change_pin_violation_new">"%1$s’s %2$s identity appears to have changed. %3$s"</string>
<string name="crypto_identity_change_pin_violation_new_user_id">"(%1$s)"</string>
<string name="dialog_title_confirmation">"Confirmation"</string>
<string name="dialog_title_error">"Error"</string>
<string name="dialog_title_success">"Success"</string>
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit ce318b3

Please sign in to comment.