diff --git a/app/src/main/java/org/thoughtcrime/securesms/registration/ui/phonenumber/EnterPhoneNumberFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/registration/ui/phonenumber/EnterPhoneNumberFragment.kt
index a88f08ec25..808bb9e138 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/registration/ui/phonenumber/EnterPhoneNumberFragment.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/registration/ui/phonenumber/EnterPhoneNumberFragment.kt
@@ -44,6 +44,8 @@ import org.thoughtcrime.securesms.databinding.FragmentRegistrationEnterPhoneNumb
import org.thoughtcrime.securesms.phonenumbers.PhoneNumberFormatter
import org.thoughtcrime.securesms.registration.data.RegistrationRepository
import org.thoughtcrime.securesms.registration.data.network.Challenge
+import org.thoughtcrime.securesms.registration.data.network.RegisterAccountResult
+import org.thoughtcrime.securesms.registration.data.network.RegistrationResult
import org.thoughtcrime.securesms.registration.data.network.RegistrationSessionCheckResult
import org.thoughtcrime.securesms.registration.data.network.RegistrationSessionCreationResult
import org.thoughtcrime.securesms.registration.data.network.RegistrationSessionResult
@@ -128,6 +130,11 @@ class EnterPhoneNumberFragment : LoggingFragment(R.layout.fragment_registration_
sharedViewModel.sessionStateErrorShown()
}
+ sharedState.registerAccountError?.let {
+ handleRegistrationErrorResponse(it)
+ sharedViewModel.registerAccountErrorShown()
+ }
+
if (sharedState.challengesRequested.contains(Challenge.CAPTCHA) && sharedState.captchaToken.isNotNullOrBlank()) {
sharedViewModel.submitCaptchaToken(requireContext())
} else if (sharedState.challengesRemaining.isNotEmpty()) {
@@ -324,10 +331,10 @@ class EnterPhoneNumberFragment : LoggingFragment(R.layout.fragment_registration_
presentRemoteErrorDialog(getString(R.string.RegistrationActivity_rate_limited_to_try_again, result.timeRemaining.milliseconds.toString()))
}
- is RegistrationSessionCreationResult.ServerUnableToParse -> presentRemoteErrorDialog(getString(R.string.RegistrationActivity_unable_to_connect_to_service))
- is RegistrationSessionCheckResult.SessionNotFound -> presentRemoteErrorDialog(getString(R.string.RegistrationActivity_unable_to_connect_to_service))
+ is RegistrationSessionCreationResult.ServerUnableToParse -> presentGenericError(result)
+ is RegistrationSessionCheckResult.SessionNotFound -> presentGenericError(result)
is RegistrationSessionCheckResult.UnknownError,
- is RegistrationSessionCreationResult.UnknownError -> presentRemoteErrorDialog(getString(R.string.RegistrationActivity_unable_to_connect_to_service))
+ is RegistrationSessionCreationResult.UnknownError -> presentGenericError(result)
}
}
@@ -337,13 +344,8 @@ class EnterPhoneNumberFragment : LoggingFragment(R.layout.fragment_registration_
}
when (result) {
is VerificationCodeRequestResult.Success -> throw IllegalStateException("Session error handler called on successful response!")
-
- is VerificationCodeRequestResult.AttemptsExhausted -> presentRemoteErrorDialog(getString(R.string.RegistrationActivity_rate_limited_to_service))
-
- is VerificationCodeRequestResult.ChallengeRequired -> {
- handleChallenges(result.challenges)
- }
-
+ is VerificationCodeRequestResult.AttemptsExhausted -> presentRateLimitedDialog()
+ is VerificationCodeRequestResult.ChallengeRequired -> handleChallenges(result.challenges)
is VerificationCodeRequestResult.ExternalServiceFailure -> presentRemoteErrorDialog(getString(R.string.RegistrationActivity_unable_to_connect_to_service), skipToNextScreen)
is VerificationCodeRequestResult.ImpossibleNumber -> {
MaterialAlertDialogBuilder(requireContext()).apply {
@@ -365,25 +367,48 @@ class EnterPhoneNumberFragment : LoggingFragment(R.layout.fragment_registration_
}
is VerificationCodeRequestResult.MalformedRequest -> presentRemoteErrorDialog(getString(R.string.RegistrationActivity_unable_to_connect_to_service), skipToNextScreen)
-
is VerificationCodeRequestResult.MustRetry -> presentRemoteErrorDialog(getString(R.string.RegistrationActivity_unable_to_connect_to_service), skipToNextScreen)
is VerificationCodeRequestResult.NonNormalizedNumber -> handleNonNormalizedNumberError(result.originalNumber, result.normalizedNumber, fragmentViewModel.mode)
-
is VerificationCodeRequestResult.RateLimited -> {
Log.i(TAG, "Code request rate limited! Next attempt: ${result.timeRemaining.milliseconds}")
presentRemoteErrorDialog(getString(R.string.RegistrationActivity_rate_limited_to_try_again, result.timeRemaining.milliseconds.toString()))
}
-
is VerificationCodeRequestResult.TokenNotAccepted -> presentRemoteErrorDialog(getString(R.string.RegistrationActivity_we_need_to_verify_that_youre_human)) { _, _ -> moveToCaptcha() }
-
- is VerificationCodeRequestResult.RegistrationLocked -> findNavController().safeNavigate(EnterPhoneNumberFragmentDirections.actionPhoneNumberRegistrationLock(result.timeRemaining))
-
- is VerificationCodeRequestResult.AlreadyVerified -> presentRemoteErrorDialog(getString(R.string.RegistrationActivity_unable_to_connect_to_service))
- is VerificationCodeRequestResult.NoSuchSession -> presentRemoteErrorDialog(getString(R.string.RegistrationActivity_unable_to_connect_to_service))
- is VerificationCodeRequestResult.UnknownError -> presentRemoteErrorDialog(getString(R.string.RegistrationActivity_unable_to_connect_to_service))
+ is VerificationCodeRequestResult.RegistrationLocked -> presentRegistrationLocked(result.timeRemaining)
+ is VerificationCodeRequestResult.AlreadyVerified -> presentGenericError(result)
+ is VerificationCodeRequestResult.NoSuchSession -> presentGenericError(result)
+ is VerificationCodeRequestResult.UnknownError -> presentGenericError(result)
}
}
+ private fun presentGenericError(result: RegistrationResult) {
+ Log.i(TAG, "Received unhandled response: ${result.javaClass.name}", result.getCause())
+ presentRemoteErrorDialog(getString(R.string.RegistrationActivity_unable_to_connect_to_service))
+ }
+
+ private fun handleRegistrationErrorResponse(result: RegisterAccountResult) {
+ when (result) {
+ is RegisterAccountResult.Success -> throw IllegalStateException("Register account error handler called on successful response!")
+ is RegisterAccountResult.RegistrationLocked -> presentRegistrationLocked(result.timeRemaining)
+ is RegisterAccountResult.AttemptsExhausted -> presentAccountLocked()
+ is RegisterAccountResult.RateLimited -> presentRateLimitedDialog()
+ is RegisterAccountResult.SvrNoData -> presentAccountLocked()
+ else -> presentGenericError(result)
+ }
+ }
+
+ private fun presentRegistrationLocked(timeRemaining: Long) {
+ findNavController().safeNavigate(EnterPhoneNumberFragmentDirections.actionPhoneNumberRegistrationLock(timeRemaining))
+ }
+
+ private fun presentRateLimitedDialog() {
+ presentRemoteErrorDialog(getString(R.string.RegistrationActivity_rate_limited_to_service))
+ }
+
+ private fun presentAccountLocked() {
+ findNavController().safeNavigate(EnterPhoneNumberFragmentDirections.actionPhoneNumberAccountLocked())
+ }
+
private fun moveToCaptcha() {
findNavController().safeNavigate(EnterPhoneNumberFragmentDirections.actionRequestCaptcha())
}
diff --git a/app/src/main/res/navigation/registration.xml b/app/src/main/res/navigation/registration.xml
index 21fadbd627..12d3013fe9 100644
--- a/app/src/main/res/navigation/registration.xml
+++ b/app/src/main/res/navigation/registration.xml
@@ -107,6 +107,15 @@
app:popUpTo="@id/enterPhoneNumberFragment"
app:popUpToInclusive="true" />
+
+
+