Merge pull request #3686 from element-hq/feature/bma/identityChangeWording
Add userId in identity change warning banner
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -20,8 +20,16 @@ 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,
|
||||
),
|
||||
),
|
||||
@@ -29,6 +37,14 @@ class IdentityChangeStateProvider : PreviewParameterProvider<IdentityChangeState
|
||||
)
|
||||
}
|
||||
|
||||
internal fun aRoomMemberIdentityStateChange(
|
||||
identityRoomMember: IdentityRoomMember = anIdentityRoomMember(),
|
||||
identityState: IdentityState = IdentityState.PinViolation,
|
||||
) = RoomMemberIdentityStateChange(
|
||||
identityRoomMember = identityRoomMember,
|
||||
identityState = identityState,
|
||||
)
|
||||
|
||||
internal fun anIdentityChangeState(
|
||||
roomMemberIdentityStateChanges: List<RoomMemberIdentityStateChange> = emptyList(),
|
||||
) = IdentityChangeState(
|
||||
@@ -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,
|
||||
@@ -47,6 +63,6 @@ internal fun anIdentityRoomMember(
|
||||
),
|
||||
) = IdentityRoomMember(
|
||||
userId = userId,
|
||||
disambiguatedDisplayName = disambiguatedDisplayName,
|
||||
displayNameOrDefault = displayNameOrDefault,
|
||||
avatarData = avatarData,
|
||||
)
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
)
|
||||
|
||||
@@ -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,
|
||||
)
|
||||
@@ -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 {
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
@@ -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(
|
||||
|
||||
@@ -24,4 +24,9 @@ value class UserId(val value: String) : Serializable {
|
||||
}
|
||||
|
||||
override fun toString(): String = value
|
||||
|
||||
val extractedDisplayName: String
|
||||
get() = value
|
||||
.removePrefix("@")
|
||||
.substringBefore(":")
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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>
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user