firebase / firebase/firebase-android-sdk
PhoneAuthProvider.OnVerificationStateChangedCallbacks are called in destroyed activity
- Dominant language
- Java
- Stars
- 2.6k
- Forks
- 710
- Avg merge
- 2d 23h
- Merged PRs (30d)
- 34
Description
### [REQUIRED] Step 2: Describe your environment
* Android Studio version: 4.1.2
* Firebase Component: com.google.firebase:firebase-auth-ktx:20.0.3
* Component version: 20.0.3
### [REQUIRED] Step 3: Describe the problem
#### Steps to reproduce:
* Have "Don't keep activies" turned ON
* Have the user see the Captcha while authenticating with phone
After starting the Phone Auth flow with: `PhoneAuthProvider.verifyPhoneNumber(options)` the user goes to the captcha(this will destroy the activity because of "Don't keep activities"), when the user comes back the `OnVerificationStateChangedCallbacks .onCodeSent` will be called in the destroyed activity.
#### Simplified code of my Auth activity:
```
class SmsValidationActivity : AppCompatActivity() {
private val args: SmsValidationActivityArgs by navArgs()
private var stateIsVerificationInProgress: Boolean = false
private var stateHasCodeAlreadyBeenSent: Boolean = false
private var stateVerificationId: String? = null
private var stateForceResendingToken: PhoneAuthProvider.ForceResendingToken? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.sms_validation_activity)
if (savedInstanceState != null) onRestoreInstanceState(savedInstanceState)
// When the user enter the screen the verification automatically starts
verifyPhoneNumber(stateForceResendingToken)
}
private fun verifyPhoneNumber(resendingToken: PhoneAuthProvider.ForceResendingToken?) {
stateIsVerificationInProgress = true
if (!stateIsVerificationInProgress) stateHasCodeAlreadyBeenSent = false
val options = PhoneAuthOptions.newBuilder()
.setPhoneNumber(args.phone)
.setTimeout(60L, TimeUnit.SECONDS)
.setActivity(this)
.setCallbacks(object : PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
override fun onVerificationCompleted(credential: PhoneAuthCredential) {
stateIsVerificationInProgress = false
}
override fun onVerificationFailed(ex: FirebaseException) {
stateIsVerificationInProgress = false
}
override fun onCodeSent(verificationId: String, forceResendingToken: PhoneAuthProvider.ForceResendingToken) {
stateVerificationId = verificationId
stateForceResendingToken = forceResendingToken
stateHasCodeAlreadyBeenSent = true
}
})
.apply {
if (resendingToken != null) setForceResendingToken(resendingToken)
}
.build()
PhoneAuthProvider.verifyPhoneNumber(options)
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putBoolean(STATE_IS_VERIFICATION_IN_PROGRESS, stateIsVerificationInProgress)
outState.putBoolean(STATE_HAS_CODE_ALREADY_BEEN_SENT, stateHasCodeAlreadyBeenSent)
outState.putString(STATE_VERIFICATION_ID, stateVerificationId)
outState.putParcelable(STATE_FORCE_RESENDING_TOKEN, stateForceResendingToken)
}
override fun onRestoreInstanceState(savedInstanceState: Bundle) {
stateIsVerificationInProgress = savedInstanceState.getBoolean(STATE_IS_VERIFICATION_IN_PROGRESS)
stateHasCodeAlreadyBeenSent = savedInstanceState.getBoolean(STATE_HAS_CODE_ALREADY_BEEN_SENT)
stateVerificationId = savedInstanceState.getString(STATE_VERIFICATION_ID)
stateForceResendingToken = savedInstanceState.getParcelable(STATE_FORCE_RESENDING_TOKEN)
}
companion object {
const val STATE_IS_VERIFICATION_IN_PROGRESS: String = "STATE_IS_VERIFICATION_IN_PROGRESS"
const val STATE_HAS_CODE_ALREADY_BEEN_SENT: String = "STATE_HAS_CODE_ALREADY_BEEN_SENT"
const val STATE_VERIFICATION_ID: String = "STATE_VERIFICATION_ID"
const val STATE_FORCE_RESENDING_TOKEN: String = "STATE_FORCE_RESENDING_TOKEN"
}
}
```
Contributor guide
Assessment
This issue has not been assessed yet.