App
Caffeine Manage - Firebase Authentication 추가
kjy0349
2021. 8. 19. 20:50
이전에 올렸던 프로토타입에서, 사용자별 데이터를 각각 데이터베이스로 관리하기 위해서 로그인 시스템을 추가했다.
연동해두었던 Firebase의 기능중 인증 기능을 사용했다.

Firebase Authentication을 추가하기위해 implementation을 추가했다.
implementation 'com.firebaseui:firebase-ui-auth:7.2.0'
그 후, firebase doc를 참고하여 LoginActivity를 작성해주었다.
LoginActivity.kt (Kotlin)
class LoginActivity : AppCompatActivity(){
private val signInLauncher = registerForActivityResult(
FirebaseAuthUIActivityResultContract()
){ res ->
this.onSignInResult(res)
}
private fun onSignInResult(result: FirebaseAuthUIAuthenticationResult){
val response = result.idpResponse
if (result.resultCode == Activity.RESULT_OK){
val user = FirebaseAuth.getInstance().currentUser.toString()
val intent = Intent(this, MainActivity::class.java)
intent.putExtra("user_info",user)
startActivity(intent)
} else {
Toast.makeText(this, response?.error?.errorCode.toString(), Toast.LENGTH_LONG).show()
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_login)
// firebase Authentication
// Choose authentication providers
val providers = arrayListOf(
AuthUI.IdpConfig.EmailBuilder().build(),
AuthUI.IdpConfig.GoogleBuilder().build()
)
// Create and launch sign-in intent
val signinintent = AuthUI.getInstance()
.createSignInIntentBuilder()
.setAvailableProviders(providers)
.setLogo(R.drawable.coffee_seed)
.setTheme(R.style.Theme_Caffeinemanage)
.build()
signInLauncher.launch(signinintent)
}
}
로그인이 완료된 후 OnSignInResult로 결과가 들어가게 된다.
나는 MainActivity위의 Fragment에서 버튼을 누른 후 LoginActivity를 호출하는 형식으로 앱을 제작해서, LoginActivity에서 다시 MainActivity를 호출해주었다.
그리고 로그인 정보를 String 형식으로 변환해준 후 Intent를 이용해 MainActivity에 로그인 정보를 넘겨주었다.
추가적으로, Intent에 user_info 정보가 있을경우 로그인 버튼을 로그아웃 버튼으로 변환하는 코드도 추가했다.
SettingFragment.kt(Kotlin)
package com.example.caffeinemanage
import android.app.Activity.RESULT_OK
import android.content.Intent
import androidx.fragment.app.Fragment
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import android.widget.Toast
import androidx.fragment.app.FragmentActivity
import androidx.fragment.app.findFragment
import com.firebase.ui.auth.AuthUI
import com.firebase.ui.auth.FirebaseAuthUIActivityResultContract
import com.firebase.ui.auth.data.model.FirebaseAuthUIAuthenticationResult
import com.google.firebase.auth.FirebaseAuth
class SettingFragment : Fragment() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val root = inflater.inflate(R.layout.fragment_setting, container, false)
val noti_button = root.findViewById<Button>(R.id.set_noti)
//fragment에서는 (activity as FragmentActivity)키워드를 사용
val fragmentmanager = (activity as FragmentActivity).supportFragmentManager
val login_button = root.findViewById<Button>(R.id.set_login)
login_button.setOnClickListener {
if(login_button.text == "로그인"){
val loginIntent = Intent(this.activity, LoginActivity::class.java)
startActivity(loginIntent)
} else{
val logoutIntent = Intent(this.activity, LogoutActivity::class.java)
startActivity(logoutIntent)
}
}
noti_button.setOnClickListener {
var transaction = fragmentmanager.beginTransaction()
transaction.replace(R.id.fragment_frame, alarm_setting())
transaction.addToBackStack(null)//뒤로가기를 누르면 이전 프레그먼트로 되돌아감
transaction.commit()
}
if(activity?.intent?.hasExtra("user_info")!!){
login_button.text = "로그아웃"
} else{
login_button.text = "로그인"
}
// Inflate the layout for this fragment
return root
}
}
위에서 바뀐 로그아웃 버튼을 누르면, LogoutActivity로 연결된다.
LogoutActivity.kt(kotlin)
class LogoutActivity : Activity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_logout)
AuthUI.getInstance()
.signOut(this)
.addOnCompleteListener {
}
val intent = Intent(this, MainActivity::class.java)
startActivity(intent)
}
}
![]() |
![]() |
![]() |
![]() |
|
위에 Toast 형식으로 출력된 user_info를 키로 가지는 DataBase insert만 구현하면 데이터, 로그인 인증 부분은 완료된다.



