object FirebaseManager { fun sendOTP(phone: String, activity: Activity, callback: (Boolean, String?) -> Unit) { val options = PhoneAuthOptions.newBuilder(FirebaseAuth.getInstance()) .setPhoneNumber("+91$phone") .setTimeout(120L, TimeUnit.SECONDS) .setActivity(activity) .setCallbacks(object : PhoneAuthProvider.OnVerificationStateChangedCallbacks() { override fun onVerificationCompleted(credential: PhoneAuthCredential) { signInWithCredential(credential, callback) } override fun onVerificationFailed(e: FirebaseException) { callback(false, e.message) } override fun onCodeSent(verificationId: String, token: PhoneAuthProvider.ForceResendingToken) { PrefsManager.saveVerificationId(verificationId) callback(true, verificationId) } }).build() PhoneAuthProvider.verifyPhoneNumber(options) } fun verifyOTP(verificationId: String, otp: String, callback: (Boolean, String?) -> Unit) { val credential = PhoneAuthProvider.getCredential(verificationId, otp) signInWithCredential(credential, callback) } private fun signInWithCredential(credential: PhoneAuthCredential, callback: (Boolean, String?) -> Unit) { FirebaseAuth.getInstance().signInWithCredential(credential) .addOnSuccessListener { result -> result.user?.getIdToken(true) ?.addOnSuccessListener { tokenResult -> callback(true, tokenResult.token) } ?.addOnFailureListener { callback(false, it.message) } } .addOnFailureListener { callback(false, it.message) } } }