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만 구현하면 데이터, 로그인 인증 부분은 완료된다.