[Strings] Use strings from localazy.

This commit is contained in:
Benoit Marty 2023-03-27 14:41:41 +02:00
parent 0af5ee0741
commit 998178b70f
33 changed files with 216 additions and 182 deletions

View file

@ -19,8 +19,8 @@ package io.element.android.features.login.impl.changeserver
import androidx.annotation.StringRes
import androidx.compose.runtime.Composable
import androidx.compose.ui.res.stringResource
import io.element.android.features.login.impl.R
import io.element.android.libraries.matrix.api.auth.AuthenticationException
import io.element.android.libraries.ui.strings.R
sealed class ChangeServerError : Throwable() {
data class InlineErrorMessage(@StringRes val messageId: Int) : ChangeServerError() {
@ -32,7 +32,7 @@ sealed class ChangeServerError : Throwable() {
companion object {
fun from(error: Throwable): ChangeServerError = when (error) {
is AuthenticationException.SlidingSyncNotAvailable -> SlidingSyncAlert
else -> InlineErrorMessage(R.string.server_selection_invalid_homeserver_error)
else -> InlineErrorMessage(R.string.screen_change_server_error_invalid_homeserver)
}
}
}

View file

@ -17,7 +17,7 @@
package io.element.android.features.login.impl.changeserver
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import io.element.android.libraries.ui.strings.R
import io.element.android.features.login.impl.R
import io.element.android.libraries.architecture.Async
open class ChangeServerStateProvider : PreviewParameterProvider<ChangeServerState> {
@ -28,7 +28,7 @@ open class ChangeServerStateProvider : PreviewParameterProvider<ChangeServerStat
aChangeServerState().copy(homeserver = "matrix.org", changeServerAction = Async.Loading()),
aChangeServerState().copy(
homeserver = "invalid.org",
changeServerAction = Async.Failure(ChangeServerError.InlineErrorMessage(R.string.server_selection_invalid_homeserver_error))
changeServerAction = Async.Failure(ChangeServerError.InlineErrorMessage(R.string.screen_change_server_error_invalid_homeserver))
),
aChangeServerState().copy(homeserver = "invalid.org", changeServerAction = Async.Failure(ChangeServerError.SlidingSyncAlert)),
aChangeServerState().copy(homeserver = "matrix.org", changeServerAction = Async.Success(Unit)),

View file

@ -152,7 +152,7 @@ fun ChangeServerView(
}
Spacer(modifier = Modifier.height(16.dp))
Text(
text = stringResource(id = StringR.string.ftue_auth_choose_server_title),
text = stringResource(id = R.string.screen_change_server_title),
modifier = Modifier
.fillMaxWidth()
.align(Alignment.CenterHorizontally),
@ -162,7 +162,7 @@ fun ChangeServerView(
)
Spacer(Modifier.height(8.dp))
Text(
text = stringResource(id = StringR.string.ex_choose_server_subtitle),
text = stringResource(id = R.string.screen_change_server_subtitle),
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 16.dp),
@ -172,7 +172,7 @@ fun ChangeServerView(
)
Spacer(Modifier.height(24.dp))
Text(
stringResource(StringR.string.hs_url),
stringResource(R.string.screen_change_server_form_header),
style = ElementTextStyles.Regular.formHeader,
modifier = Modifier.padding(horizontal = 16.dp, vertical = 8.dp)
)
@ -202,7 +202,7 @@ fun ChangeServerView(
IconButton(onClick = {
eventSink(ChangeServerEvents.SetServer(""))
}, enabled = interactionEnabled) {
Icon(imageVector = Icons.Filled.Close, contentDescription = stringResource(StringR.string.a11y_clear))
Icon(imageVector = Icons.Filled.Close, contentDescription = stringResource(StringR.string.action_clear))
}
}
} else null,
@ -211,14 +211,13 @@ fun ChangeServerView(
if (invalidHomeserverError != null) {
Text(invalidHomeserverError.message(), color = MaterialTheme.colorScheme.error)
} else {
val footerMessage = stringResource(StringR.string.server_selection_server_footer)
val footerMessage = stringResource(R.string.screen_change_server_form_notice, "")
val footerAction = stringResource(StringR.string.action_learn_more)
val footerText = buildAnnotatedString {
val defaultColor = MaterialTheme.colorScheme.tertiary
withStyle(ParagraphStyle(textAlign = TextAlign.Start)) {
withStyle(SpanStyle(color = defaultColor)) {
append(footerMessage)
append(" ")
}
val start = length
withStyle(SpanStyle(color = LinkColor)) {
@ -252,7 +251,7 @@ fun ChangeServerView(
.fillMaxWidth()
.testTag(TestTags.changeServerContinue)
) {
Text(text = stringResource(id = StringR.string.login_continue), style = ElementTextStyles.Button)
Text(text = stringResource(id = R.string.screen_change_server_submit), style = ElementTextStyles.Button)
}
if (state.changeServerAction is Async.Success) {
onChangeServerSuccess()
@ -284,8 +283,8 @@ internal fun SlidingSyncNotSupportedDialog(onLearnMoreClicked: () -> Unit, onDis
onSubmitClicked = onLearnMoreClicked,
onCancelClicked = onDismiss,
emphasizeSubmitButton = true,
title = stringResource(StringR.string.server_selection_sliding_sync_alert_title),
content = stringResource(StringR.string.server_selection_sliding_sync_alert_message),
title = stringResource(StringR.string.dialog_title_error),
content = stringResource(R.string.screen_change_server_error_no_sliding_sync_message),
)
}

View file

@ -16,6 +16,7 @@
package io.element.android.features.login.impl.error
import io.element.android.features.login.impl.R
import io.element.android.libraries.matrix.api.auth.AuthErrorCode
import io.element.android.libraries.matrix.api.auth.AuthenticationException
import io.element.android.libraries.matrix.api.auth.errorCode
@ -24,10 +25,10 @@ import io.element.android.libraries.ui.strings.R.string as StringR
fun loginError(
throwable: Throwable
): Int {
val authException = throwable as? AuthenticationException ?: return StringR.unknown_error
val authException = throwable as? AuthenticationException ?: return StringR.error_unknown
return when (authException.errorCode) {
AuthErrorCode.FORBIDDEN -> StringR.auth_invalid_login_param
AuthErrorCode.USER_DEACTIVATED -> StringR.auth_invalid_login_deactivated_account
AuthErrorCode.UNKNOWN -> StringR.unknown_error
AuthErrorCode.FORBIDDEN -> R.string.screen_login_error_invalid_credentials
AuthErrorCode.USER_DEACTIVATED -> R.string.screen_login_error_deactivated_account
AuthErrorCode.UNKNOWN -> StringR.error_unknown
}
}

View file

@ -62,6 +62,7 @@ import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.unit.dp
import io.element.android.features.login.impl.R
import io.element.android.features.login.impl.error.loginError
import io.element.android.libraries.designsystem.ElementTextStyles
import io.element.android.libraries.designsystem.components.dialogs.ErrorDialog
@ -121,7 +122,7 @@ fun LoginRootView(
Spacer(Modifier.height(16.dp))
// Title
Text(
text = stringResource(id = StringR.string.ftue_auth_welcome_back_title),
text = stringResource(id = R.string.screen_login_title),
modifier = Modifier
.fillMaxWidth(),
style = ElementTextStyles.Bold.title1,
@ -172,7 +173,7 @@ internal fun ChangeServerSection(
Column(modifier) {
Text(
modifier = Modifier.padding(start = 16.dp, bottom = 8.dp),
text = stringResource(id = StringR.string.ftue_auth_sign_in_choose_server_header),
text = stringResource(id = R.string.screen_login_server_header),
style = ElementTextStyles.Regular.formHeader,
)
Row(
@ -233,7 +234,7 @@ internal fun LoginForm(
Column(modifier) {
Text(
text = stringResource(StringR.string.login_form_title),
text = stringResource(R.string.screen_login_form_header),
modifier = Modifier.padding(start = 16.dp),
style = ElementTextStyles.Regular.formHeader
)
@ -247,7 +248,7 @@ internal fun LoginForm(
.onTabOrEnterKeyFocusNext(focusManager)
.testTag(TestTags.loginEmailUsername),
label = {
Text(text = stringResource(StringR.string.ex_login_username_hint))
Text(text = stringResource(R.string.screen_login_username_hint))
},
onValueChange = {
loginFieldState = it
@ -267,7 +268,7 @@ internal fun LoginForm(
IconButton(onClick = {
loginFieldState = ""
}) {
Icon(imageVector = Icons.Filled.Close, contentDescription = stringResource(StringR.string.a11y_clear))
Icon(imageVector = Icons.Filled.Close, contentDescription = stringResource(StringR.string.action_clear))
}
}
} else null,
@ -291,14 +292,14 @@ internal fun LoginForm(
eventSink(LoginRootEvents.SetPassword(it))
},
label = {
Text(text = stringResource(StringR.string.login_signup_password_hint))
Text(text = stringResource(R.string.screen_login_password_hint))
},
visualTransformation = if (passwordVisible) VisualTransformation.None else PasswordVisualTransformation(),
trailingIcon = {
val image =
if (passwordVisible) Icons.Filled.Visibility else Icons.Filled.VisibilityOff
val description =
if (passwordVisible) stringResource(StringR.string.login_hide_password) else stringResource(StringR.string.login_show_password)
if (passwordVisible) stringResource(StringR.string.a11y_hide_password) else stringResource(StringR.string.a11y_show_password)
IconButton(onClick = { passwordVisible = !passwordVisible }) {
Icon(imageVector = image, description)
@ -324,7 +325,7 @@ internal fun LoginForm(
.fillMaxWidth()
.testTag(TestTags.loginContinue)
) {
Text(text = stringResource(StringR.string.login_continue), style = ElementTextStyles.Button)
Text(text = stringResource(R.string.screen_login_submit), style = ElementTextStyles.Button)
}
}
}

View file

@ -17,9 +17,10 @@
package io.element.android.features.login.impl.error
import com.google.common.truth.Truth.assertThat
import io.element.android.features.login.impl.R
import io.element.android.libraries.matrix.api.auth.AuthenticationException
import io.element.android.libraries.ui.strings.R
import org.junit.Test
import io.element.android.libraries.ui.strings.R as StringR
class ErrorFormatterTests {
@ -27,31 +28,31 @@ class ErrorFormatterTests {
@Test
fun `loginError - invalid unknown error returns unknown error message`() {
val error = Throwable("Some unknown error")
assertThat(loginError(error)).isEqualTo(R.string.unknown_error)
assertThat(loginError(error)).isEqualTo(StringR.string.error_unknown)
}
@Test
fun `loginError - invalid auth error returns unknown error message`() {
val error = AuthenticationException.SlidingSyncNotAvailable("Some message. Also contains M_FORBIDDEN, but won't be parsed")
assertThat(loginError(error)).isEqualTo(R.string.unknown_error)
assertThat(loginError(error)).isEqualTo(StringR.string.error_unknown)
}
@Test
fun `loginError - unknown error returns unknown error message`() {
val error = AuthenticationException.Generic("M_UNKNOWN")
assertThat(loginError(error)).isEqualTo(R.string.unknown_error)
assertThat(loginError(error)).isEqualTo(StringR.string.error_unknown)
}
@Test
fun `loginError - forbidden error returns incorrect credentials message`() {
val error = AuthenticationException.Generic("M_FORBIDDEN")
assertThat(loginError(error)).isEqualTo(R.string.auth_invalid_login_param)
assertThat(loginError(error)).isEqualTo(R.string.screen_login_error_invalid_credentials)
}
@Test
fun `loginError - user_deactivated error returns deactivated account message`() {
val error = AuthenticationException.Generic("M_USER_DEACTIVATED")
assertThat(loginError(error)).isEqualTo(R.string.auth_invalid_login_deactivated_account)
assertThat(loginError(error)).isEqualTo(R.string.screen_login_error_deactivated_account)
}
// endregion loginError