Android/Side Projects

Tinder 앱 개발하기

화요밍 2022. 2. 18. 22:55
728x90
반응형
Side Project - Tinder
회원 가입한 유저들을 매칭해주는 기존 틴더 앱의 간단한 기능을 구현한 프로젝트

 

 

GitHub - hwayeon351/Tinder

Contribute to hwayeon351/Tinder development by creating an account on GitHub.

github.com


학습 회고

오늘은 두 사용자가 서로 Like를 하여 매치가 되도록 구현하여 매칭 리스트를 보여주는 기능을 추가하였다.


오늘 공부한 내용

  • 서로 Like한 유저들 매치시키기
private fun like() {
    val card = cardItems[cardStackLayoutManager.topPosition - 1]
    cardItems.removeFirst()

    userDB.child(card.userId)
        .child(LIKED_BY)
        .child(LIKE)
        .child(getCurrentUserId())
        .setValue(true)

    saveMatchIfOtherUserLikedMe(card.userId)

    Toast.makeText(this, "${card.name}님을 Like 하셨습니다.", Toast.LENGTH_SHORT).show()
}
private fun saveMatchIfOtherUserLikedMe(otherUserId: String) {
    val otherUserDB = userDB.child(getCurrentUserId()).child(LIKED_BY).child(LIKE).child(otherUserId)
    otherUserDB.addListenerForSingleValueEvent(object: ValueEventListener{
        override fun onDataChange(snapshot: DataSnapshot) {
            if (snapshot.value == true) {
                userDB.child(getCurrentUserId())
                    .child(LIKED_BY)
                    .child(MATCH)
                    .child(otherUserId)
                    .setValue(true)

                userDB.child(otherUserId)
                    .child(LIKED_BY)
                    .child(MATCH)
                    .child(getCurrentUserId())
                    .setValue(true)

            }
        }

        override fun onCancelled(error: DatabaseError) {}

    })
}

테이블 내 속성 값이 바뀌면 콜백 호출을 하는 ValueEventListener를 이용해서 앱에 로그인한 사용자 currentUserId가 Like한 상대 사용자 otherUserId가 자신을 Like하였는지 아닌지를 체킹해주었다.

만약 상대도 자신을 Like하였다면 currentUserId > likeBy > otherUserId 값이 true로 바뀌게 되어 onDataChange()가 호출되고 snapshot에 바뀐 데이터가 담기게 된다.

이때, snapshot.value == true일 때, 즉, 상대도 자신을 Like하였을 때, currentUserId > likeBy > match > otherUserId에 true 값을 넣어주고, otherUserId > likeBy > match > currentUserId에 true값을 넣어주었다.

 

 

  • 매칭 성공한 유저 리스트 띄우기

LikeActivity의 매치 리스트 보기 버튼을 클릭하면, MatchedUserActivity가 실행된다.

private fun initMatchedListButton() {
    val matchedListButton = findViewById<Button>(R.id.matchListButton)
    matchedListButton.setOnClickListener {
        startActivity(Intent(this, MatchedUserActivity::class.java))
    }
}

 

MatchedUserActivity의 onCreate()에서 getMatchUsers() 메서드를 호출하여 CurrentUserId > likeBy > match에 저장된 매칭이 된 상대 유저들의 정보를 가져온다. 이때 ChildEventListener를 사용하여 match에 값이 추가되거나 최초 한번 실행되는 onChildAddede() 콜백 함수가 호출되면 getUserByKey() 메서드를 통해 상대 유저의 정보를 불러오도록 하였다.

private fun getMatchUsers() {
    val matchedDB = userDB.child(getCurrentUserId()).child(LIKED_BY).child(MATCH)

    matchedDB.addChildEventListener(object: ChildEventListener{
        override fun onChildAdded(snapshot: DataSnapshot, previousChildName: String?) {
            if (snapshot.key?.isNotEmpty() == true) {
                getUserByKey(snapshot.key.orEmpty())
            }
        }

        override fun onChildChanged(snapshot: DataSnapshot, previousChildName: String?) {}

        override fun onChildRemoved(snapshot: DataSnapshot) {}

        override fun onChildMoved(snapshot: DataSnapshot, previousChildName: String?) {}

        override fun onCancelled(error: DatabaseError) {}

    })
}

getUserByKey() 메서드에서는 초기에 한 번 호출되고 데이터가 바뀌면 로컬 디스크 캐시에서 값을 불러오는  ValueEventListener를 사용해서  상대 유저의 정보를 가져와 CardItem을 만들어 어뎁터에 추가해주었다.

private fun getUserByKey(userId: String) {
    userDB.child(userId).addListenerForSingleValueEvent(object : ValueEventListener{
        override fun onDataChange(snapshot: DataSnapshot) {
            cardItems.add(CardItem(userId, snapshot.child(NAME).value.toString()))
            adapter.submitList(cardItems)
        }

        override fun onCancelled(error: DatabaseError) {}

    })
}

 

 

 

 

728x90
반응형

'Android > Side Projects' 카테고리의 다른 글

당근마켓 앱 개발하기  (0) 2022.02.20
당근마켓 앱 개발하기  (1) 2022.02.19
Tinder 앱 개발하기  (0) 2022.02.17
Tinder 앱 개발하기  (0) 2022.02.16
Tinder 앱 개발하기  (0) 2022.02.15