diff --git a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/CreateDmConfirmationBottomSheet.kt b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/CreateDmConfirmationBottomSheet.kt index 3e1e09a1f2..75b8e5a5f3 100644 --- a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/CreateDmConfirmationBottomSheet.kt +++ b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/CreateDmConfirmationBottomSheet.kt @@ -19,6 +19,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.unit.dp import io.element.android.compound.theme.ElementTheme import io.element.android.compound.tokens.generated.CompoundIcons @@ -71,8 +72,7 @@ fun CreateDmConfirmationBottomSheet( ) Spacer(modifier = Modifier.height(8.dp)) Text( - // TODO Check if finally we do not want to remove string duplication - text = stringResource(R.string.screen_bottom_sheet_create_dm_message_no_displayname, matrixUser.getFullName()), + text = stringResource(R.string.screen_bottom_sheet_create_dm_message, matrixUser.getFullName()), style = ElementTheme.typography.fontBodyMdRegular, color = ElementTheme.colors.textSecondary, textAlign = TextAlign.Center, @@ -97,9 +97,9 @@ fun CreateDmConfirmationBottomSheet( @PreviewsDayNight @Composable -internal fun CreateDmConfirmationBottomSheetPreview() = ElementPreview { +internal fun CreateDmConfirmationBottomSheetPreview(@PreviewParameter(MatrixUserProvider::class) matrixUser: MatrixUser) = ElementPreview { CreateDmConfirmationBottomSheet( - matrixUser = aMatrixUser(), + matrixUser = matrixUser, onSendInvite = {}, onDismiss = {}, ) diff --git a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/model/MatrixUserExtensions.kt b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/model/MatrixUserExtensions.kt index a159adc74d..72f69932aa 100644 --- a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/model/MatrixUserExtensions.kt +++ b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/model/MatrixUserExtensions.kt @@ -7,9 +7,12 @@ package io.element.android.libraries.matrix.ui.model +import androidx.compose.runtime.Composable +import androidx.compose.ui.res.stringResource import io.element.android.libraries.designsystem.components.avatar.AvatarData import io.element.android.libraries.designsystem.components.avatar.AvatarSize import io.element.android.libraries.matrix.api.user.MatrixUser +import io.element.android.libraries.ui.strings.CommonStrings fun MatrixUser.getAvatarData(size: AvatarSize) = AvatarData( id = userId.value, @@ -22,10 +25,13 @@ fun MatrixUser.getBestName(): String { return displayName?.takeIf { it.isNotEmpty() } ?: userId.value } +@Composable fun MatrixUser.getFullName(): String { - return if (displayName.isNullOrBlank()) { - userId.value - } else { - "$displayName ($userId)" + return displayName.let { name -> + if (name.isNullOrBlank()) { + userId.value + } else { + stringResource(CommonStrings.common_name_and_id, name, userId.value) + } } } diff --git a/libraries/matrixui/src/main/res/values/localazy.xml b/libraries/matrixui/src/main/res/values/localazy.xml index 11b1683635..b27021ebd6 100644 --- a/libraries/matrixui/src/main/res/values/localazy.xml +++ b/libraries/matrixui/src/main/res/values/localazy.xml @@ -1,8 +1,7 @@ "Send invite" - "Would you like to start a chat with %1$s (%2$s)?" - "Would you like to start a chat with %1$s?" + "Would you like to start a chat with %1$s?" "Send invite?" "%1$s (%2$s) invited you" diff --git a/libraries/matrixui/src/test/kotlin/io/element/android/libraries/matrix/ui/model/MatrixUserExtensionsTest.kt b/libraries/matrixui/src/test/kotlin/io/element/android/libraries/matrix/ui/model/MatrixUserExtensionsTest.kt index fb02be96e7..611616cdd7 100644 --- a/libraries/matrixui/src/test/kotlin/io/element/android/libraries/matrix/ui/model/MatrixUserExtensionsTest.kt +++ b/libraries/matrixui/src/test/kotlin/io/element/android/libraries/matrix/ui/model/MatrixUserExtensionsTest.kt @@ -7,14 +7,27 @@ package io.element.android.libraries.matrix.ui.model +import androidx.test.ext.junit.runners.AndroidJUnit4 +import app.cash.molecule.RecompositionMode +import app.cash.molecule.moleculeFlow +import app.cash.turbine.test import com.google.common.truth.Truth.assertThat import io.element.android.libraries.designsystem.components.avatar.AvatarData import io.element.android.libraries.designsystem.components.avatar.AvatarSize import io.element.android.libraries.matrix.api.user.MatrixUser import io.element.android.libraries.matrix.test.A_USER_ID +import io.element.android.tests.testutils.WarmUpRule +import io.element.android.tests.testutils.withConfigurationAndContext +import kotlinx.coroutines.test.runTest +import org.junit.Rule import org.junit.Test +import org.junit.runner.RunWith +@RunWith(AndroidJUnit4::class) class MatrixUserExtensionsTest { + @get:Rule + val warmUpRule = WarmUpRule() + @Test fun `getAvatarData should return the expected value`() { val matrixUser = MatrixUser( @@ -59,20 +72,30 @@ class MatrixUserExtensionsTest { } @Test - fun `getFullName should return the display name is available and the userId`() { + fun `getFullName should return the display name is available and the userId`() = runTest { val matrixUser = MatrixUser( userId = A_USER_ID, displayName = "displayName", ) - assertThat(matrixUser.getFullName()).isEqualTo("displayName (@alice:server.org)") + moleculeFlow(RecompositionMode.Immediate) { + withConfigurationAndContext { + matrixUser.getFullName() + } + }.test { + assertThat(awaitItem()).isEqualTo("displayName (@alice:server.org)") + } } @Test - fun `getBestName should return only the id when name is not available`() { + fun `getBestName should return only the id when name is not available`() = runTest { val matrixUser = MatrixUser( userId = A_USER_ID, displayName = null, ) - assertThat(matrixUser.getFullName()).isEqualTo(A_USER_ID.value) + moleculeFlow(RecompositionMode.Immediate) { + matrixUser.getFullName() + }.test { + assertThat(awaitItem()).isEqualTo(A_USER_ID.value) + } } } diff --git a/libraries/ui-strings/src/main/res/values/localazy.xml b/libraries/ui-strings/src/main/res/values/localazy.xml index 2d6c7eea53..9430f509d7 100644 --- a/libraries/ui-strings/src/main/res/values/localazy.xml +++ b/libraries/ui-strings/src/main/res/values/localazy.xml @@ -193,6 +193,7 @@ Reason: %1$s." "Message removed" "Modern" "Mute" + "%1$s (%2$s)" "No results" "No room name" "Offline"