diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/failure/MatrixError.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/failure/MatrixError.kt index 70a982089c..f3f097bcc5 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/failure/MatrixError.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/failure/MatrixError.kt @@ -31,7 +31,9 @@ data class MatrixError( @Json(name = "consent_uri") val consentUri: String? = null, // RESOURCE_LIMIT_EXCEEDED data @Json(name = "limit_type") val limitType: String? = null, - @Json(name = "admin_contact") val adminUri: String? = null) { + @Json(name = "admin_contact") val adminUri: String? = null, + // For LIMIT_EXCEEDED + @Json(name = "retry_after_ms") val retryAfterMillis: Long? = null) { companion object { const val FORBIDDEN = "M_FORBIDDEN" diff --git a/vector/src/main/java/im/vector/riotx/core/error/ErrorFormatter.kt b/vector/src/main/java/im/vector/riotx/core/error/ErrorFormatter.kt index 4c148a7e54..621031f166 100644 --- a/vector/src/main/java/im/vector/riotx/core/error/ErrorFormatter.kt +++ b/vector/src/main/java/im/vector/riotx/core/error/ErrorFormatter.kt @@ -65,7 +65,7 @@ class ErrorFormatter @Inject constructor(private val stringProvider: StringProvi stringProvider.getString(R.string.login_error_not_json) } throwable.error.code == MatrixError.LIMIT_EXCEEDED -> { - stringProvider.getString(R.string.login_error_limit_exceeded) + limitExceededError(throwable.error) } throwable.error.code == MatrixError.THREEPID_NOT_FOUND -> { stringProvider.getString(R.string.login_reset_password_error_not_found) @@ -80,4 +80,16 @@ class ErrorFormatter @Inject constructor(private val stringProvider: StringProvi } ?: stringProvider.getString(R.string.unknown_error) } + + private fun limitExceededError(error: MatrixError): String { + val delay = error.retryAfterMillis + + return if (delay == null) { + stringProvider.getString(R.string.login_error_limit_exceeded) + } else { + // Ensure at least 1 second + val delaySeconds = delay.toInt() / 1000 + 1 + stringProvider.getQuantityString(R.plurals.login_error_limit_exceeded_retry_after, delaySeconds, delaySeconds) + } + } } diff --git a/vector/src/main/res/values/strings_riotX.xml b/vector/src/main/res/values/strings_riotX.xml index 7dd81081c1..b4ee85adb5 100644 --- a/vector/src/main/res/values/strings_riotX.xml +++ b/vector/src/main/res/values/strings_riotX.xml @@ -128,4 +128,9 @@ We just sent an email to %1$s.\nPlease click on the link it contains to continue the account creation. The entered code is not correct. Please check. + + Too many requests have been sent. You can retry in %1$d second… + Too many requests have been sent. You can retry in %1$d seconds… + +