firebase / firebase/firebase-android-sdk

PhoneAuthProvider.OnVerificationStateChangedCallbacks are called in destroyed activity

Open
#2,497 5 comments 2 reactions 0 assignees View on GitHub
api: auth internal-bug-filed type: bug
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

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.