I’m trying to create a button in my kotlin compose app that lets users to sign in with a google account. To do so I’ve realizaed the code below that sends a request to firebase but instead of receiving an IntentSender I always receive null. I’m quite sure that the firebase part is correctly configured, but if you need screenshot just let me know. Can somebady helps me please?
class GoogleAuthUIClient(
private val context: Context,
private val oneTapClient: SignInClient
) {
private val auth = Firebase.auth
suspend fun signIn() :IntentSender? {
val result = try {
oneTapClient.beginSignIn(
buildSignInRequest()
).await()
} catch(e: Exception) {
e.printStackTrace()
if(e is CancellationException) throw e
null
}
Toast.makeText(
context,
result?.toString() ?: "null", //always null
Toast.LENGTH_LONG
).show()
return result?.pendingIntent?.intentSender
}
// ...
private fun buildSignInRequest(): BeginSignInRequest {
return BeginSignInRequest.Builder()
.setGoogleIdTokenRequestOptions(
GoogleIdTokenRequestOptions.builder()
.setSupported(true)
.setFilterByAuthorizedAccounts(false)
.setServerClientId(context.getString(R.string.web_client_id))
.build()
)
.setAutoSelectEnabled(true)
.build()
}
}
//MainActivity.kt
val navController = rememberNavController()
NavHost(navController = navController, startDestination = "sign_in"){
composable("sign_in") {
val viewModel = viewModel<SignInViewModel>()
val state by viewModel.state.collectAsStateWithLifecycle()
val launcher = rememberLauncherForActivityResult(
contract = ActivityResultContracts.StartIntentSenderForResult(),
onResult = { result ->
if(result.resultCode == RESULT_OK) {
lifecycleScope.launch {
val signInResult = googleAuthUIClient.signInWithIntent(
intent = result.data ?: return@launch
)
viewModel.onSignInResult(signInResult)
}
}
}
)
LaunchedEffect(key1 = state.isSignInSuccessful) {
if(state.isSignInSuccessful){
Toast.makeText(
applicationContext,
"Sign in successful",
Toast.LENGTH_LONG
).show()
}
}
SignInScreen(
state = state,
onSignInClick = {
lifecycleScope.launch {
val signInIntentSender = googleAuthUIClient.signIn()
launcher.launch(
IntentSenderRequest.Builder(
signInIntentSender ?: return@launch
).build()
)
}
}
)
}
}
New contributor