Resolve send failure verification : clearer message when unsigned device is from you

This commit is contained in:
ganfra
2024-09-18 11:07:07 +02:00
parent cbb5e0ffed
commit 5240555329
7 changed files with 29 additions and 15 deletions
@@ -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)
} }
} }
@@ -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,
@@ -23,8 +23,12 @@ class VerifiedUserSendFailureFactory @Inject constructor(
if (userId == null) { if (userId == null) {
VerifiedUserSendFailure.None VerifiedUserSendFailure.None
} else { } else {
val displayName = room.userDisplayName(userId).getOrNull() ?: userId.value if (userId == room.sessionId) {
VerifiedUserSendFailure.UnsignedDevice(displayName) VerifiedUserSendFailure.UnsignedDevice.FromYou
} else {
val displayName = room.userDisplayName(userId).getOrNull() ?: userId.value
VerifiedUserSendFailure.UnsignedDevice.FromOther(displayName)
}
} }
} }
is LocalEventSendState.Failed.VerifiedUserChangedIdentity -> { is LocalEventSendState.Failed.VerifiedUserChangedIdentity -> {
@@ -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,
) )
@@ -113,7 +113,11 @@ 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
@@ -125,11 +129,12 @@ private fun VerifiedUserSendFailure.title(): String {
@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
@@ -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()
@@ -291,6 +291,8 @@ Reason: %1$s."</string>
<string name="screen_resolve_send_failure_unsigned_device_primary_button_title">"Send message anyway"</string> <string name="screen_resolve_send_failure_unsigned_device_primary_button_title">"Send message anyway"</string>
<string name="screen_resolve_send_failure_unsigned_device_subtitle">"%1$s is using one or more unverified devices. You can send the message anyway, or you can cancel for now and try again later after %2$s has verified all their devices."</string> <string name="screen_resolve_send_failure_unsigned_device_subtitle">"%1$s is using one or more unverified devices. You can send the message anyway, or you can cancel for now and try again later after %2$s has verified all their devices."</string>
<string name="screen_resolve_send_failure_unsigned_device_title">"Your message was not sent because %1$s has not verified all devices"</string> <string name="screen_resolve_send_failure_unsigned_device_title">"Your message was not sent because %1$s has not verified all devices"</string>
<string name="screen_resolve_send_failure_you_unsigned_device_subtitle">"One or more of your devices are unverified. You can send the message anyway, or you can cancel for now and try again later after you have verified all of your devices."</string>
<string name="screen_resolve_send_failure_you_unsigned_device_title">"Your message was not sent because you have not verified one or more of your devices"</string>
<string name="screen_room_details_pinned_events_row_title">"Pinned messages"</string> <string name="screen_room_details_pinned_events_row_title">"Pinned messages"</string>
<string name="screen_room_error_failed_processing_media">"Failed processing media to upload, please try again."</string> <string name="screen_room_error_failed_processing_media">"Failed processing media to upload, please try again."</string>
<string name="screen_room_error_failed_retrieving_user_details">"Could not retrieve user details"</string> <string name="screen_room_error_failed_retrieving_user_details">"Could not retrieve user details"</string>
@@ -314,6 +316,7 @@ Reason: %1$s."</string>
<string name="screen_share_this_location_action">"Share this location"</string> <string name="screen_share_this_location_action">"Share this location"</string>
<string name="screen_timeline_item_menu_send_failure_changed_identity">"Message not sent because %1$s’s verified identity has changed."</string> <string name="screen_timeline_item_menu_send_failure_changed_identity">"Message not sent because %1$s’s verified identity has changed."</string>
<string name="screen_timeline_item_menu_send_failure_unsigned_device">"Message not sent because %1$s has not verified all devices."</string> <string name="screen_timeline_item_menu_send_failure_unsigned_device">"Message not sent because %1$s has not verified all devices."</string>
<string name="screen_timeline_item_menu_send_failure_you_unsigned_device">"Message not sent because you have not verified one or more of your devices."</string>
<string name="screen_view_location_title">"Location"</string> <string name="screen_view_location_title">"Location"</string>
<string name="settings_version_number">"Version: %1$s (%2$s)"</string> <string name="settings_version_number">"Version: %1$s (%2$s)"</string>
<string name="test_language_identifier">"en"</string> <string name="test_language_identifier">"en"</string>