Prevent ISE with view binding in registration.

This commit is contained in:
Nicholas Tinsley 2024-07-09 17:37:53 -04:00
parent fb43a8257c
commit c134c3033e
4 changed files with 41 additions and 4 deletions

View file

@ -5,6 +5,8 @@
package org.thoughtcrime.securesms.registration.data.network
import org.signal.core.util.logging.Log
/**
* This is a merging of the NetworkResult pattern and the Processor pattern of registration v1.
* The goal is to enumerate all possible responses as sealed classes, which means the consumer will be able to handle them in an exhaustive when clause
@ -24,4 +26,10 @@ abstract class RegistrationResult(private val errorCause: Throwable?) {
return errorCause
}
fun logCause() {
errorCause?.let {
Log.w(Log.tag(this::class), "Cause:", it)
}
}
}

View file

@ -5,9 +5,15 @@
package org.thoughtcrime.securesms.registration.ui
import androidx.fragment.app.Fragment
import androidx.lifecycle.Lifecycle
import com.google.i18n.phonenumbers.PhoneNumberUtil
import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber
fun PhoneNumber.toE164(): String {
return PhoneNumberUtil.getInstance().format(this, PhoneNumberUtil.PhoneNumberFormat.E164)
}
fun Fragment.isBindingInvalid(): Boolean {
return viewLifecycleOwner.lifecycle.currentState.isAtLeast(Lifecycle.State.INITIALIZED)
}

View file

@ -31,6 +31,7 @@ import org.thoughtcrime.securesms.registration.fragments.RegistrationViewDelegat
import org.thoughtcrime.securesms.registration.fragments.SignalStrengthPhoneStateListener
import org.thoughtcrime.securesms.registration.ui.RegistrationCheckpoint
import org.thoughtcrime.securesms.registration.ui.RegistrationViewModel
import org.thoughtcrime.securesms.registration.ui.isBindingInvalid
import org.thoughtcrime.securesms.util.concurrent.AssertedSuccessListener
import org.thoughtcrime.securesms.util.navigation.safeNavigate
import org.thoughtcrime.securesms.util.visible
@ -128,11 +129,16 @@ class EnterCodeFragment : LoggingFragment(R.layout.fragment_registration_enter_c
super.onResume()
sharedViewModel.phoneNumber?.let {
val formatted = PhoneNumberUtil.getInstance().format(it, PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL)
binding.verificationSubheader.setText(requireContext().getString(R.string.RegistrationActivity_enter_the_code_we_sent_to_s, formatted))
binding.verificationSubheader.text = requireContext().getString(R.string.RegistrationActivity_enter_the_code_we_sent_to_s, formatted)
}
}
private fun handleSessionErrorResponse(result: RegistrationResult) {
if (isBindingInvalid()) {
Log.w(TAG, "Binding not valid, aborting! Result: $result")
result.logCause()
return
}
when (result) {
is VerificationCodeRequestResult.Success -> binding.keyboard.displaySuccess()
is VerificationCodeRequestResult.RateLimited -> presentRateLimitedDialog()
@ -143,6 +149,11 @@ class EnterCodeFragment : LoggingFragment(R.layout.fragment_registration_enter_c
}
private fun handleRegistrationErrorResponse(result: RegisterAccountResult) {
if (isBindingInvalid()) {
Log.w(TAG, "Binding not valid, aborting! Result: $result")
result.logCause()
return
}
when (result) {
is RegisterAccountResult.Success -> binding.keyboard.displaySuccess()
is RegisterAccountResult.RegistrationLocked -> presentRegistrationLocked(result.timeRemaining)
@ -199,11 +210,17 @@ class EnterCodeFragment : LoggingFragment(R.layout.fragment_registration_enter_c
sharedViewModel.incrementIncorrectCodeAttempts()
Toast.makeText(requireContext(), R.string.RegistrationActivity_incorrect_code, Toast.LENGTH_LONG).show()
if (isBindingInvalid()) {
Log.w(TAG, "Binding not valid, aborting updating keyboard!")
return
}
binding.keyboard.displayFailure().addListener(object : AssertedSuccessListener<Boolean?>() {
override fun onSuccess(result: Boolean?) {
binding.callMeCountDown.setVisibility(View.VISIBLE)
binding.resendSmsCountDown.setVisibility(View.VISIBLE)
binding.wrongNumber.setVisibility(View.VISIBLE)
binding.callMeCountDown.visibility = View.VISIBLE
binding.resendSmsCountDown.visibility = View.VISIBLE
binding.wrongNumber.visibility = View.VISIBLE
binding.code.clear()
binding.keyboard.displayKeyboard()
}

View file

@ -51,6 +51,7 @@ import org.thoughtcrime.securesms.registration.fragments.RegistrationViewDelegat
import org.thoughtcrime.securesms.registration.ui.RegistrationCheckpoint
import org.thoughtcrime.securesms.registration.ui.RegistrationState
import org.thoughtcrime.securesms.registration.ui.RegistrationViewModel
import org.thoughtcrime.securesms.registration.ui.isBindingInvalid
import org.thoughtcrime.securesms.registration.ui.toE164
import org.thoughtcrime.securesms.registration.util.CountryPrefix
import org.thoughtcrime.securesms.util.CommunicationActions
@ -299,6 +300,11 @@ class EnterPhoneNumberFragment : LoggingFragment(R.layout.fragment_registration_
}
private fun handleErrorResponse(result: RegistrationResult) {
if (isBindingInvalid()) {
Log.w(TAG, "Binding not valid, aborting! Result: $result")
result.logCause()
return
}
if (!result.isSuccess()) {
Log.i(TAG, "Handling error response.", result.getCause())
}