creatorplanet / Kotlin-with-Firebase

0 stars 0 forks source link

Firebase Kotlin Google Login Logout #1

Open creatorplanet opened 2 years ago

creatorplanet commented 2 years ago

*

creatorplanet commented 2 years ago

LoginActivity.kt

class LoginActivity : AppCompatActivity() { //create a button variable lateinit var btnSignIn:com.google.android.gms.common.SignInButton private lateinit var auth: FirebaseAuth

lateinit var googleSignInClient: GoogleSignInClient

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_login)

    //themes: hide menuBar
    supportActionBar?.hide()

    auth = Firebase.auth

    //assign the xml view to the button
    btnSignIn= findViewById(R.id.btnSignIn)

    // Configure Google Sign In
    val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
        .requestIdToken(getString(R.string.default_web_client_id))
        .requestEmail()
        .build()
    googleSignInClient = GoogleSignIn.getClient(this, gso)

    //now set click listener for button
    btnSignIn.setOnClickListener {
        val signInIntent = googleSignInClient.signInIntent
        resultLauncher.launch(signInIntent) //startActivityForResult(signInIntent, RC_GOOGLE_SIGN_IN)
    }
}
//on activity result alternative
private var resultLauncher =
    registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
        if (result.resultCode == Activity.RESULT_OK) {
            // There are no request codes
            val data: Intent? = result.data
            val task = GoogleSignIn.getSignedInAccountFromIntent(data)
            if (task.isSuccessful) {
                try {
                    // Google Sign In was successful, authenticate with Firebase
                    val account = task.getResult(ApiException::class.java)!!
                    firebaseAuthWithGoogle(account.idToken!!)
                } catch (e: ApiException) {
                    //Google Sign In failed, update UI appropriately
                    Toast.makeText(this, "Google Sign In failed", Toast.LENGTH_SHORT).show()
                }
            }
        }
    }

//
private fun firebaseAuthWithGoogle(idToken: String) {
    val credential = GoogleAuthProvider.getCredential(idToken, null)
    auth.signInWithCredential(credential)
        .addOnCompleteListener(this) { task ->
            if (task.isSuccessful) {
                // Sign in success, update UI with the signed-in user's information
                val user = auth.currentUser
                //send user to main
                gotomain()
            } else {
                // If sign in fails, display a message to the user.
                Toast.makeText(this, "failed to sign in", Toast.LENGTH_SHORT).show()
            }
        }
}
fun gotomain()
{
    val intent = Intent(this@LoginActivity, MainActivity::class.java)
    startActivity(intent)
}
override fun onStart() {
    super.onStart()
    // Check if user is signed in (non-null) and update UI accordingly.
    val currentUser = auth.currentUser
    if (currentUser!=null)
    {
        //user exists so direct him to another activity
        gotomain()
    }
}

}

creatorplanet commented 2 years ago

MainActivity.kt

class MainActivity : AppCompatActivity() { private lateinit var auth: FirebaseAuth private lateinit var googleSignInClient: GoogleSignInClient

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    // Configure Google Sign In && Logout
    val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
        .requestIdToken(getString(R.string.default_web_client_id))
        .requestEmail()
        .build()
    googleSignInClient = GoogleSignIn.getClient(this, gso) 
    val btnLogout = findViewById<Button>(R.id.btnLogout)
    btnLogout.setOnClickListener {
        Firebase.auth.signOut() 
        googleSignInClient?.signOut()
        val logoutIntent = Intent(this, LoginActivity::class.java) // move Login page
        logoutIntent.flags = Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK // 초기화 * 재로그인
        startActivity(logoutIntent)
        finish()
    }
}

}

creatorplanet commented 2 years ago

*

creatorplanet commented 2 years ago

LoginActivity.kt

fun saveUserDataToDatabase(user : FirebaseUser?){
    val email = user?.email
    val uid = user?.uid

    var userDTO = UserDTO()
    userDTO.email = email
    userDTO.emoji =  "\uD83D\uDC3C \uD83C\uDF3F \uD83D\uDDA4 "

    FirebaseFirestore.getInstance().collection("users").document(uid!!).set(userDTO)
    //
    finish()
    startActivity(Intent(this, MainActivity::class.java))
}