안드로이드/정리(Android)

Android - firebase 채팅기능 사용

김염인 2022. 2. 24. 19:50

1) firebase에서 프로젝트를 생성한다

 

2) app수준의 build.gradle에 firebase 기능 추가,

plugins {
    id 'com.android.application'
    id 'kotlin-android'
    id 'com.google.gms.google-services'
}


dependencies {

    implementation 'com.google.firebase:firebase-database-ktx'
    implementation 'com.google.firebase:firebase-auth-ktx'
    implementation 'com.google.firebase:firebase-storage-ktx'
}

 

3) 로그인 로그아웃을 위한 auth 선언 / RealtimeDatabase를 이용하기 위한 DatabaseReference 추가,

private lateinit var articleDB: DatabaseReference
private lateinit var userDB: DatabaseReference
private val auth: FirebaseAuth by lazy { Firebase.auth }

 

4) child Listener 생성

    override fun onChildAdded(snapshot: DataSnapshot, previousChildName: String?) {
        // DB에 새로운 객체가 추가 되면 작동하는 Listener이ㅏ.
        val articleModel = snapshot.getValue(ArticleModel::class.java)
        articleModel ?: return

        articleList.add(articleModel)
        articleAdapter.submitList(articleList)
    }

    override fun onChildChanged(snapshot: DataSnapshot, previousChildName: String?) {}
    override fun onChildRemoved(snapshot: DataSnapshot) {}
    override fun onChildMoved(snapshot: DataSnapshot, previousChildName: String?) {}
    override fun onCancelled(error: DatabaseError) {}
}

 

5) DB를 불러옴

articleDB = Firebase.database.reference.child(DB_ARTICLES) // Articles라는 database.reference의 최상위에 바로 아래있는 userDB를 Articles를 가져온것,
userDB = Firebase.database.reference.child(DB_USERS) // Users라는 database.reference의 최상위에 바로 아래있는 users를 가져온것
// 위의 DB들은 처음에는 빈상태로 시작한다.

 

6) View에 그려줌

articleAdapter = ArticleAdapter(
    onItemClicked = {articleModel ->
    if(auth.currentUser != null){
        // 로그인을 한상태
        if (auth.currentUser?.uid != articleModel.sellerId){
            // 내가 올리지 않은 아이템
            val chatRoom = ChatListItem(
                buyerId = auth.currentUser!!.uid,
                sellerId = articleModel.sellerId,
                itemTitle = articleModel.title,
                key = System.currentTimeMillis()
            )
            // 내가 올리지 않은 아이템이면 chatRoom을 만들어준다.
            userDB.child(auth.currentUser!!.uid)
                .child(CHILD_CHAT) // 'chat' 라는 이름의 CHILD_CHAT을 child로 만들어줌
                .push()
                .setValue(chatRoom)

            userDB.child(articleModel.sellerId)
                .child(CHILD_CHAT)
                .push()
                .setValue(chatRoom)

            Snackbar.make(view, "채팅방이 생성됐습니다. 채팅앱에서 확인해주세요,. ", Snackbar.LENGTH_SHORT).show()
        }
        else{
            // 내가 올린 아이템
            Snackbar.make(view, "내가 올린 물품 입니다. ", Snackbar.LENGTH_SHORT).show()
        }
    }
    else{
        Snackbar.make(view, "로그인 후 사용해주세요", Snackbar.LENGTH_SHORT).show()
    }

7) 생명주기 등록


override fun onResume() {
    super.onResume()

    articleAdapter.notifyDataSetChanged()
}

override fun onDestroyView() {
    super.onDestroyView()

    articleDB.removeEventListener(listener)
}

위에는 만들어진 User Database와 회원가입된 유저목록이 실시간으로 반영된다.