Component

이번 실습에서 진행할 내용

  • Firebase Authenetication (SNS로 로그인하기)

  • Firebase Realtime Database (서버 데이터 베이스)

  • CardStackView(카드 스택 뷰 구현, Opensource)


라이브러리 추가

모듈 레벨 build.gradle에 추가

    //파이어 베이스 데이터베이스
    implementation 'com.google.firebase:firebase-database-ktx'


LikeActivity, layout 생성 후 MainAtivity에서 라우팅

// MainActivit.kt

    override fun onStart() {
        super.onStart()

        if(auth.currentUser==null){
            startActivity(Intent(this, LoginActivity::class.java))
        }else{
            startActivity(Intent(this, LikeActivity::class.java))
        }
    }


기존 LoginActiviy finish() 함수 교체

LoginActiviy.kt에서 로그인 성공 시 호출하는 finish() 함수를 handleSuccessLogin()으로 교체

    private fun handleSuccessLogin(){
        if(auth.currentUser==null){
            Toast.makeText(this, "로그인 실패",Toast.LENGTH_SHORT).show()
            return
        }

        // 데이터베이스에 유저 id 저장
        val userId = auth.currentUser?.uid.orEmpty()
        // Firebase.database.reference = 루트
        val currentUserDB = Firebase.database.reference.child("Users").child(userId)
        val user = mutableMapOf<String, Any>()
        user["userId"] = userId
        currentUserDB.updateChildren(user)

        finish()
    }


LikeActivity.kt 구현

addListenerForSingleValueEvent() 함수를 통해 데이터를 1회 받아옴

이름 정보가 없을 때 이름을 정하라고 팝업을 띄움

EditText를 팝업으로 띄우기

// LikeActivity.kt
class LikeActivity : AppCompatActivity() {

    private lateinit var auth:FirebaseAuth
    private lateinit var usersDB: DatabaseReference

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

        auth= FirebaseAuth.getInstance()
        usersDB = Firebase.database.reference.child("Users")

        val currentUserDB = usersDB.child(getCurrentUserId())

        // 데이터를 1회 받아오고 onDataChange 실행
        currentUserDB.addListenerForSingleValueEvent(object :ValueEventListener{
            override fun onDataChange(snapshot: DataSnapshot) {
                if(snapshot.child("name").value == null){
                    showNameInputPopup()
                    return
                }
                // todo 갱신
            }

            override fun onCancelled(error: DatabaseError) {}

        })


    }

    // EditText를 팝업으로 띄우기
    private fun showNameInputPopup() {
        val editText = EditText(this)

        AlertDialog.Builder(this)
            .setTitle("이름을 입력해주세요")
            .setView(editText)
            .setPositiveButton("저장"){ _,_->
                if(editText.text.isEmpty()){
                    showNameInputPopup()
                }else{
                    saveUserName(editText.text.toString())
                }
            }.setCancelable(false)
            .show()
    }

    private fun saveUserName(name:String) {
        val userId = getCurrentUserId()
        val currentUserDB = usersDB .child(userId)
        val user = mutableMapOf<String, Any>()
        user["userId"] = userId
        user["name"] = name
        currentUserDB.updateChildren(user)
    }

    private fun getCurrentUserId():String{
        if(auth.currentUser==null){
            Toast.makeText(this, "로그인되지 않았습니다.", Toast.LENGTH_SHORT).show()
            finish()
        }
        return auth.currentUser?.uid.orEmpty()
    }

}