mirror of
https://github.com/signalapp/Signal-Android.git
synced 2025-12-22 12:08:34 +00:00
Show rate limit specific error message on username reservation.
This commit is contained in:
committed by
Greyson Parrelli
parent
b147882e4f
commit
c04f761f5a
@@ -317,6 +317,9 @@ public class UsernameEditFragment extends LoggingFragment {
|
|||||||
case NETWORK_FAILURE:
|
case NETWORK_FAILURE:
|
||||||
Toast.makeText(requireContext(), R.string.UsernameEditFragment_encountered_a_network_error, Toast.LENGTH_SHORT).show();
|
Toast.makeText(requireContext(), R.string.UsernameEditFragment_encountered_a_network_error, Toast.LENGTH_SHORT).show();
|
||||||
break;
|
break;
|
||||||
|
case RATE_LIMIT_EXCEEDED:
|
||||||
|
Toast.makeText(requireContext(), R.string.UsernameEditFragment_rate_limit_exceeded_error, Toast.LENGTH_SHORT).show();
|
||||||
|
break;
|
||||||
case SKIPPED:
|
case SKIPPED:
|
||||||
closeScreen();
|
closeScreen();
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ import java.util.concurrent.TimeUnit
|
|||||||
* A note on naming conventions:
|
* A note on naming conventions:
|
||||||
* Usernames are made up of two discrete components, a nickname and a discriminator. They are formatted thusly:
|
* 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() {
|
internal class UsernameEditViewModel private constructor(private val mode: UsernameEditMode) : ViewModel() {
|
||||||
private val events: PublishSubject<Event> = PublishSubject.create()
|
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) }
|
uiState.update { State(ButtonState.SUBMIT, UsernameStatus.NONE, it.usernameState) }
|
||||||
events.onNext(Event.NETWORK_FAILURE)
|
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)
|
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 -> {
|
UsernameSetResult.CANDIDATE_GENERATION_ERROR -> {
|
||||||
// TODO -- Retry
|
// TODO -- Retry
|
||||||
uiState.update { State(ButtonState.SUBMIT_DISABLED, UsernameStatus.TAKEN, UsernameState.NoUsername) }
|
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 {
|
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 {
|
class Factory(private val mode: UsernameEditMode) : ViewModelProvider.Factory {
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ import org.whispersystems.signalservice.api.SignalServiceAccountManager
|
|||||||
import org.whispersystems.signalservice.api.push.ServiceId.ACI
|
import org.whispersystems.signalservice.api.push.ServiceId.ACI
|
||||||
import org.whispersystems.signalservice.api.push.UsernameLinkComponents
|
import org.whispersystems.signalservice.api.push.UsernameLinkComponents
|
||||||
import org.whispersystems.signalservice.api.push.exceptions.NonSuccessfulResponseCodeException
|
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.UsernameIsNotAssociatedWithAnAccountException
|
||||||
import org.whispersystems.signalservice.api.push.exceptions.UsernameIsNotReservedException
|
import org.whispersystems.signalservice.api.push.exceptions.UsernameIsNotReservedException
|
||||||
import org.whispersystems.signalservice.api.push.exceptions.UsernameMalformedException
|
import org.whispersystems.signalservice.api.push.exceptions.UsernameMalformedException
|
||||||
@@ -379,6 +380,9 @@ object UsernameRepository {
|
|||||||
} catch (e: UsernameMalformedException) {
|
} catch (e: UsernameMalformedException) {
|
||||||
Log.w(TAG, "[reserveUsername] Username malformed.")
|
Log.w(TAG, "[reserveUsername] Username malformed.")
|
||||||
failure(UsernameSetResult.USERNAME_INVALID)
|
failure(UsernameSetResult.USERNAME_INVALID)
|
||||||
|
} catch (e: RateLimitException) {
|
||||||
|
Log.w(TAG, "[reserveUsername] Rate limit exceeded.")
|
||||||
|
failure(UsernameSetResult.RATE_LIMIT_ERROR)
|
||||||
} catch (e: IOException) {
|
} catch (e: IOException) {
|
||||||
Log.w(TAG, "[reserveUsername] Generic network exception.", e)
|
Log.w(TAG, "[reserveUsername] Generic network exception.", e)
|
||||||
failure(UsernameSetResult.NETWORK_ERROR)
|
failure(UsernameSetResult.NETWORK_ERROR)
|
||||||
@@ -501,7 +505,7 @@ object UsernameRepository {
|
|||||||
}
|
}
|
||||||
|
|
||||||
enum class UsernameSetResult {
|
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 {
|
enum class UsernameReclaimResult {
|
||||||
|
|||||||
@@ -2298,6 +2298,8 @@
|
|||||||
<string name="UsernameEditFragment_delete">Delete</string>
|
<string name="UsernameEditFragment_delete">Delete</string>
|
||||||
<string name="UsernameEditFragment_successfully_removed_username">Successfully removed username.</string>
|
<string name="UsernameEditFragment_successfully_removed_username">Successfully removed username.</string>
|
||||||
<string name="UsernameEditFragment_encountered_a_network_error">Encountered a network error.</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_this_username_is_taken">This username is taken.</string>
|
||||||
<string name="UsernameEditFragment_usernames_can_only_include">Usernames can only include a–Z, 0–9, and underscores.</string>
|
<string name="UsernameEditFragment_usernames_can_only_include">Usernames can only include a–Z, 0–9, and underscores.</string>
|
||||||
<string name="UsernameEditFragment_usernames_cannot_begin_with_a_number">Usernames cannot begin with a number.</string>
|
<string name="UsernameEditFragment_usernames_cannot_begin_with_a_number">Usernames cannot begin with a number.</string>
|
||||||
|
|||||||
Reference in New Issue
Block a user