diff --git a/app/src/main/java/org/thoughtcrime/securesms/registration/data/network/RegistrationResult.kt b/app/src/main/java/org/thoughtcrime/securesms/registration/data/network/RegistrationResult.kt index 6b2d715fce..52b9b687bd 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/registration/data/network/RegistrationResult.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/registration/data/network/RegistrationResult.kt @@ -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) + } + } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/registration/ui/RegistrationExtensions.kt b/app/src/main/java/org/thoughtcrime/securesms/registration/ui/RegistrationExtensions.kt index 6cd4c70d11..db8693f3da 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/registration/ui/RegistrationExtensions.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/registration/ui/RegistrationExtensions.kt @@ -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) +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/registration/ui/entercode/EnterCodeFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/registration/ui/entercode/EnterCodeFragment.kt index 28f328f890..df984e1677 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/registration/ui/entercode/EnterCodeFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/registration/ui/entercode/EnterCodeFragment.kt @@ -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() { 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() } 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 b75fd40a36..8f46537d93 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 @@ -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()) }