Show rate limit specific error message on username reservation.

This commit is contained in:
Cody Henthorne
2024-02-22 13:48:08 -05:00
committed by Greyson Parrelli
parent b147882e4f
commit c04f761f5a
4 changed files with 22 additions and 3 deletions

View File

@@ -317,6 +317,9 @@ public class UsernameEditFragment extends LoggingFragment {
case NETWORK_FAILURE:
Toast.makeText(requireContext(), R.string.UsernameEditFragment_encountered_a_network_error, Toast.LENGTH_SHORT).show();
break;
case RATE_LIMIT_EXCEEDED:
Toast.makeText(requireContext(), R.string.UsernameEditFragment_rate_limit_exceeded_error, Toast.LENGTH_SHORT).show();
break;
case SKIPPED:
closeScreen();
break;

View File

@@ -34,7 +34,7 @@ import java.util.concurrent.TimeUnit
* A note on naming conventions:
* Usernames are made up of two discrete components, a nickname and a discriminator. They are formatted thusly:
*
* [nickname].[discriminator]
* nickname.discriminator
*/
internal class UsernameEditViewModel private constructor(private val mode: UsernameEditMode) : ViewModel() {
private val events: PublishSubject<Event> = PublishSubject.create()
@@ -207,6 +207,11 @@ internal class UsernameEditViewModel private constructor(private val mode: Usern
uiState.update { State(ButtonState.SUBMIT, UsernameStatus.NONE, it.usernameState) }
events.onNext(Event.NETWORK_FAILURE)
}
UsernameSetResult.RATE_LIMIT_ERROR -> {
uiState.update { State(ButtonState.SUBMIT, UsernameStatus.NONE, it.usernameState) }
events.onNext(Event.RATE_LIMIT_EXCEEDED)
}
}
}
}
@@ -343,6 +348,11 @@ internal class UsernameEditViewModel private constructor(private val mode: Usern
events.onNext(Event.NETWORK_FAILURE)
}
UsernameSetResult.RATE_LIMIT_ERROR -> {
uiState.update { State(ButtonState.SUBMIT, UsernameStatus.NONE, UsernameState.NoUsername) }
events.onNext(Event.RATE_LIMIT_EXCEEDED)
}
UsernameSetResult.CANDIDATE_GENERATION_ERROR -> {
// TODO -- Retry
uiState.update { State(ButtonState.SUBMIT_DISABLED, UsernameStatus.TAKEN, UsernameState.NoUsername) }
@@ -380,7 +390,7 @@ internal class UsernameEditViewModel private constructor(private val mode: Usern
}
enum class Event {
NETWORK_FAILURE, SUBMIT_SUCCESS, DELETE_SUCCESS, SUBMIT_FAIL_INVALID, SUBMIT_FAIL_TAKEN, SKIPPED, NEEDS_CONFIRM_RESET
NETWORK_FAILURE, SUBMIT_SUCCESS, DELETE_SUCCESS, SUBMIT_FAIL_INVALID, SUBMIT_FAIL_TAKEN, SKIPPED, NEEDS_CONFIRM_RESET, RATE_LIMIT_EXCEEDED
}
class Factory(private val mode: UsernameEditMode) : ViewModelProvider.Factory {

View File

@@ -23,6 +23,7 @@ import org.whispersystems.signalservice.api.SignalServiceAccountManager
import org.whispersystems.signalservice.api.push.ServiceId.ACI
import org.whispersystems.signalservice.api.push.UsernameLinkComponents
import org.whispersystems.signalservice.api.push.exceptions.NonSuccessfulResponseCodeException
import org.whispersystems.signalservice.api.push.exceptions.RateLimitException
import org.whispersystems.signalservice.api.push.exceptions.UsernameIsNotAssociatedWithAnAccountException
import org.whispersystems.signalservice.api.push.exceptions.UsernameIsNotReservedException
import org.whispersystems.signalservice.api.push.exceptions.UsernameMalformedException
@@ -379,6 +380,9 @@ object UsernameRepository {
} catch (e: UsernameMalformedException) {
Log.w(TAG, "[reserveUsername] Username malformed.")
failure(UsernameSetResult.USERNAME_INVALID)
} catch (e: RateLimitException) {
Log.w(TAG, "[reserveUsername] Rate limit exceeded.")
failure(UsernameSetResult.RATE_LIMIT_ERROR)
} catch (e: IOException) {
Log.w(TAG, "[reserveUsername] Generic network exception.", e)
failure(UsernameSetResult.NETWORK_ERROR)
@@ -501,7 +505,7 @@ object UsernameRepository {
}
enum class UsernameSetResult {
SUCCESS, USERNAME_UNAVAILABLE, USERNAME_INVALID, NETWORK_ERROR, CANDIDATE_GENERATION_ERROR
SUCCESS, USERNAME_UNAVAILABLE, USERNAME_INVALID, NETWORK_ERROR, CANDIDATE_GENERATION_ERROR, RATE_LIMIT_ERROR
}
enum class UsernameReclaimResult {

View File

@@ -2298,6 +2298,8 @@
<string name="UsernameEditFragment_delete">Delete</string>
<string name="UsernameEditFragment_successfully_removed_username">Successfully removed username.</string>
<string name="UsernameEditFragment_encountered_a_network_error">Encountered a network error.</string>
<!-- Toast message shown if user exceeds the rate limit for reserving usernames -->
<string name="UsernameEditFragment_rate_limit_exceeded_error">Too many attempts made, please try again later.</string>
<string name="UsernameEditFragment_this_username_is_taken">This username is taken.</string>
<string name="UsernameEditFragment_usernames_can_only_include">Usernames can only include aZ, 09, and underscores.</string>
<string name="UsernameEditFragment_usernames_cannot_begin_with_a_number">Usernames cannot begin with a number.</string>