ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Caffeine Manage - Firebase Authentication 추가
    App 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만 구현하면 데이터, 로그인 인증 부분은 완료된다.

Designed by Tistory.