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…
+
+