Side Project - Tinder
회원 가입한 유저들을 매칭해주는 기존 틴더 앱의 간단한 기능을 구현한 프로젝트
- GitHub -> https://github.com/hwayeon351/Tinder
학습 회고
오늘은 두 사용자가 서로 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) {}
})
}
'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 |