Browse Source

Merge pull request #3485 from element-hq/feature/fga/iterate_send_failure_verification

Iterate send failure verification
pull/3489/head
ganfra 1 month ago committed by GitHub
parent
commit
4f86909805
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 3
      features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/actionlist/ActionListView.kt
  2. 7
      features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/crypto/sendfailure/VerifiedUserSendFailure.kt
  3. 6
      features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/crypto/sendfailure/VerifiedUserSendFailureFactory.kt
  4. 2
      features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/crypto/sendfailure/resolve/ResolveVerifiedUserSendFailureStateProvider.kt
  5. 15
      features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/crypto/sendfailure/resolve/ResolveVerifiedUserSendFailureView.kt
  6. 12
      features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/crypto/sendfailure/resolve/ResolveVerifiedUserSendFailurePresenterTest.kt

3
features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/actionlist/ActionListView.kt

@ -374,7 +374,8 @@ private fun VerifiedUserSendFailureView(
fun VerifiedUserSendFailure.headline(): String { fun VerifiedUserSendFailure.headline(): String {
return when (this) { return when (this) {
is None -> "" is None -> ""
is UnsignedDevice -> stringResource(CommonStrings.screen_timeline_item_menu_send_failure_unsigned_device, userDisplayName) is UnsignedDevice.FromOther -> stringResource(CommonStrings.screen_timeline_item_menu_send_failure_unsigned_device, userDisplayName)
is UnsignedDevice.FromYou -> stringResource(CommonStrings.screen_timeline_item_menu_send_failure_you_unsigned_device)
is ChangedIdentity -> stringResource(CommonStrings.screen_timeline_item_menu_send_failure_changed_identity, userDisplayName) is ChangedIdentity -> stringResource(CommonStrings.screen_timeline_item_menu_send_failure_changed_identity, userDisplayName)
} }
} }

7
features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/crypto/sendfailure/VerifiedUserSendFailure.kt

@ -13,9 +13,10 @@ import androidx.compose.runtime.Immutable
sealed interface VerifiedUserSendFailure { sealed interface VerifiedUserSendFailure {
data object None : VerifiedUserSendFailure data object None : VerifiedUserSendFailure
data class UnsignedDevice( sealed interface UnsignedDevice : VerifiedUserSendFailure {
val userDisplayName: String, data object FromYou : UnsignedDevice
) : VerifiedUserSendFailure data class FromOther(val userDisplayName: String) : UnsignedDevice
}
data class ChangedIdentity( data class ChangedIdentity(
val userDisplayName: String, val userDisplayName: String,

6
features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/crypto/sendfailure/VerifiedUserSendFailureFactory.kt

@ -22,9 +22,13 @@ class VerifiedUserSendFailureFactory @Inject constructor(
val userId = sendState.devices.keys.firstOrNull() val userId = sendState.devices.keys.firstOrNull()
if (userId == null) { if (userId == null) {
VerifiedUserSendFailure.None VerifiedUserSendFailure.None
} else {
if (userId == room.sessionId) {
VerifiedUserSendFailure.UnsignedDevice.FromYou
} else { } else {
val displayName = room.userDisplayName(userId).getOrNull() ?: userId.value val displayName = room.userDisplayName(userId).getOrNull() ?: userId.value
VerifiedUserSendFailure.UnsignedDevice(displayName) VerifiedUserSendFailure.UnsignedDevice.FromOther(displayName)
}
} }
} }
is LocalEventSendState.Failed.VerifiedUserChangedIdentity -> { is LocalEventSendState.Failed.VerifiedUserChangedIdentity -> {

2
features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/crypto/sendfailure/resolve/ResolveVerifiedUserSendFailureStateProvider.kt

@ -36,7 +36,7 @@ fun aResolveVerifiedUserSendFailureState(
eventSink = eventSink eventSink = eventSink
) )
fun anUnsignedDeviceSendFailure(userDisplayName: String = "Alice") = VerifiedUserSendFailure.UnsignedDevice( fun anUnsignedDeviceSendFailure(userDisplayName: String = "Alice") = VerifiedUserSendFailure.UnsignedDevice.FromOther(
userDisplayName = userDisplayName, userDisplayName = userDisplayName,
) )

15
features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/crypto/sendfailure/resolve/ResolveVerifiedUserSendFailureView.kt

@ -113,28 +113,33 @@ fun ResolveVerifiedUserSendFailureView(
@Composable @Composable
private fun VerifiedUserSendFailure.title(): String { private fun VerifiedUserSendFailure.title(): String {
return when (this) { return when (this) {
is VerifiedUserSendFailure.UnsignedDevice -> stringResource(id = CommonStrings.screen_resolve_send_failure_unsigned_device_title, userDisplayName) is VerifiedUserSendFailure.UnsignedDevice.FromOther -> stringResource(
id = CommonStrings.screen_resolve_send_failure_unsigned_device_title,
userDisplayName
)
VerifiedUserSendFailure.UnsignedDevice.FromYou -> stringResource(id = CommonStrings.screen_resolve_send_failure_you_unsigned_device_title)
is VerifiedUserSendFailure.ChangedIdentity -> stringResource( is VerifiedUserSendFailure.ChangedIdentity -> stringResource(
id = CommonStrings.screen_resolve_send_failure_changed_identity_title, id = CommonStrings.screen_resolve_send_failure_changed_identity_title,
userDisplayName userDisplayName
) )
VerifiedUserSendFailure.None -> error("This method should never be called for this state") VerifiedUserSendFailure.None -> ""
} }
} }
@Composable @Composable
private fun VerifiedUserSendFailure.subtitle(): String { private fun VerifiedUserSendFailure.subtitle(): String {
return when (this) { return when (this) {
is VerifiedUserSendFailure.UnsignedDevice -> stringResource( is VerifiedUserSendFailure.UnsignedDevice.FromOther -> stringResource(
id = CommonStrings.screen_resolve_send_failure_unsigned_device_subtitle, id = CommonStrings.screen_resolve_send_failure_unsigned_device_subtitle,
userDisplayName, userDisplayName,
userDisplayName, userDisplayName,
) )
VerifiedUserSendFailure.UnsignedDevice.FromYou -> stringResource(id = CommonStrings.screen_resolve_send_failure_you_unsigned_device_subtitle)
is VerifiedUserSendFailure.ChangedIdentity -> stringResource( is VerifiedUserSendFailure.ChangedIdentity -> stringResource(
id = CommonStrings.screen_resolve_send_failure_changed_identity_subtitle, id = CommonStrings.screen_resolve_send_failure_changed_identity_subtitle,
userDisplayName userDisplayName
) )
VerifiedUserSendFailure.None -> error("This method should never be called for this state") VerifiedUserSendFailure.None -> ""
} }
} }
@ -143,7 +148,7 @@ private fun VerifiedUserSendFailure.resolveAction(): String {
return when (this) { return when (this) {
is VerifiedUserSendFailure.UnsignedDevice -> stringResource(id = CommonStrings.screen_resolve_send_failure_unsigned_device_primary_button_title) is VerifiedUserSendFailure.UnsignedDevice -> stringResource(id = CommonStrings.screen_resolve_send_failure_unsigned_device_primary_button_title)
is VerifiedUserSendFailure.ChangedIdentity -> stringResource(id = CommonStrings.screen_resolve_send_failure_changed_identity_primary_button_title) is VerifiedUserSendFailure.ChangedIdentity -> stringResource(id = CommonStrings.screen_resolve_send_failure_changed_identity_primary_button_title)
VerifiedUserSendFailure.None -> error("This method should never be called for this state") VerifiedUserSendFailure.None -> ""
} }
} }

12
features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/crypto/sendfailure/resolve/ResolveVerifiedUserSendFailurePresenterTest.kt

@ -94,7 +94,7 @@ class ResolveVerifiedUserSendFailurePresenterTest {
initialState.eventSink(ResolveVerifiedUserSendFailureEvents.ComputeForMessage(failedMessage)) initialState.eventSink(ResolveVerifiedUserSendFailureEvents.ComputeForMessage(failedMessage))
skipItems(1) skipItems(1)
awaitItem().also { state -> awaitItem().also { state ->
assertThat(state.verifiedUserSendFailure).isEqualTo(VerifiedUserSendFailure.UnsignedDevice(A_USER_ID.value)) assertThat(state.verifiedUserSendFailure).isEqualTo(VerifiedUserSendFailure.UnsignedDevice.FromYou)
state.eventSink(ResolveVerifiedUserSendFailureEvents.Dismiss) state.eventSink(ResolveVerifiedUserSendFailureEvents.Dismiss)
} }
skipItems(1) skipItems(1)
@ -124,7 +124,7 @@ class ResolveVerifiedUserSendFailurePresenterTest {
skipItems(1) skipItems(1)
awaitItem().also { state -> awaitItem().also { state ->
assertThat(state.verifiedUserSendFailure).isEqualTo(VerifiedUserSendFailure.UnsignedDevice(A_USER_ID.value)) assertThat(state.verifiedUserSendFailure).isEqualTo(VerifiedUserSendFailure.UnsignedDevice.FromYou)
state.eventSink(ResolveVerifiedUserSendFailureEvents.Retry) state.eventSink(ResolveVerifiedUserSendFailureEvents.Retry)
} }
awaitItem().also { state -> awaitItem().also { state ->
@ -158,7 +158,7 @@ class ResolveVerifiedUserSendFailurePresenterTest {
skipItems(1) skipItems(1)
awaitItem().also { state -> awaitItem().also { state ->
assertThat(state.verifiedUserSendFailure).isEqualTo(VerifiedUserSendFailure.UnsignedDevice(A_USER_ID.value)) assertThat(state.verifiedUserSendFailure).isEqualTo(VerifiedUserSendFailure.UnsignedDevice.FromYou)
state.eventSink(ResolveVerifiedUserSendFailureEvents.ResolveAndResend) state.eventSink(ResolveVerifiedUserSendFailureEvents.ResolveAndResend)
} }
awaitItem().also { state -> awaitItem().also { state ->
@ -167,7 +167,7 @@ class ResolveVerifiedUserSendFailurePresenterTest {
// This should move to the next user // This should move to the next user
skipItems(2) skipItems(2)
awaitItem().also { state -> awaitItem().also { state ->
assertThat(state.verifiedUserSendFailure).isEqualTo(VerifiedUserSendFailure.UnsignedDevice(A_USER_ID_2.value)) assertThat(state.verifiedUserSendFailure).isEqualTo(VerifiedUserSendFailure.UnsignedDevice.FromOther(A_USER_ID_2.value))
assertThat(state.resolveAction).isEqualTo(AsyncAction.Success(Unit)) assertThat(state.resolveAction).isEqualTo(AsyncAction.Success(Unit))
state.eventSink(ResolveVerifiedUserSendFailureEvents.ResolveAndResend) state.eventSink(ResolveVerifiedUserSendFailureEvents.ResolveAndResend)
} }
@ -199,14 +199,14 @@ class ResolveVerifiedUserSendFailurePresenterTest {
skipItems(1) skipItems(1)
awaitItem().also { state -> awaitItem().also { state ->
assertThat(state.verifiedUserSendFailure).isEqualTo(VerifiedUserSendFailure.UnsignedDevice(A_USER_ID.value)) assertThat(state.verifiedUserSendFailure).isEqualTo(VerifiedUserSendFailure.UnsignedDevice.FromYou)
state.eventSink(ResolveVerifiedUserSendFailureEvents.ResolveAndResend) state.eventSink(ResolveVerifiedUserSendFailureEvents.ResolveAndResend)
} }
awaitItem().also { state -> awaitItem().also { state ->
assertThat(state.resolveAction).isEqualTo(AsyncAction.Loading) assertThat(state.resolveAction).isEqualTo(AsyncAction.Loading)
} }
awaitItem().also { state -> awaitItem().also { state ->
assertThat(state.verifiedUserSendFailure).isEqualTo(VerifiedUserSendFailure.UnsignedDevice(A_USER_ID.value)) assertThat(state.verifiedUserSendFailure).isEqualTo(VerifiedUserSendFailure.UnsignedDevice.FromYou)
assertThat(state.resolveAction).isInstanceOf(AsyncAction.Failure::class.java) assertThat(state.resolveAction).isInstanceOf(AsyncAction.Failure::class.java)
} }
ensureAllEventsConsumed() ensureAllEventsConsumed()

Loading…
Cancel
Save