[Android/Team] 차단 상태에 따른 UI 변경(나를 차단한 상대에게 채팅 메세지 보내지 못하게 하기) for kotlin

이도연·2023년 11월 13일
0

trouble shooting

목록 보기
10/12


1. 문제 해결 전 코드 분석


//상대가 나를 차단했는지 알아보는 메소드
    private fun loadOponentBlockFriends(userID: String) {

        oponentBlockList.clear()
        friendBlockDB
            .child(userID) // friendDb 아래 userID 를 키로 갖는 하위 노드 찾음.
            .addListenerForSingleValueEvent(object : ValueEventListener { // 함수는 데이터 변경을 단 한번만 기다림.
                override fun onDataChange(dataSnapshot: DataSnapshot) { // RDB 에서 데이터 검색 성공 시 실행되는 콜백 함수.
                    Log.d("FirebaseDatabase", "#dudu loadOponentBlockFriends ")

                    // userDB 에 차단친구가 존재하는지 확인
                    if (dataSnapshot.exists()) {
                        val size = dataSnapshot.children.count()
                        Log.d(
                            "FirebaseDatabase",
                            "#dudu userBlockList dataSnapshot.exists() size = $size"
                        )
                        for (badfriendUidSnapshot in dataSnapshot.children) {
                            val badfriendUid = badfriendUidSnapshot.key
                            if (badfriendUid != null) {
                               oponentBlockList.add(badfriendUid)
                            }
                        }
                        Log.d(
                            "FirebaseDatabase",
                            "#dudu oponentBlockList.size = ${oponentBlockList.size}"
                        )

                        if(myId = oponentBlockList){
                            binding.DetailBtnChat.gone()
                       }


                    } else {
                        Log.d("FirebaseDatabase", "#dudu bad friends found for UID: $userID")

                    }
                }

                override fun onCancelled(databaseError: DatabaseError) { // DB 오류 처리하고 메시지 로깅
                    Log.d("FirebaseDatabase", "#dudu onCancelled", databaseError.toException())
                }
            })
    }

문제점

  • loadOponentBlockFriends 메서드에서 상대방이 차단한 사용자 목록을 불러오지만, 이 목록을 활용하는 로직이 구현되어 있지 않았다. oponentBlockList는 데이터를 추가하는 부분이 없이, 비어 있다.

  • loadOponentBlockFriends 메서드의 결과가 DetailActivity의 나머지 부분과 연결되거나 활용되지 않고 있습니다.

코드 구조

  • friendBlockDB.child(userID)로 데이터를 조회하나, 이 데이터를 활용하는 부분이 누락되었다.





2. 문제 해결 후 코드 분석


 // Firebase DB 참조
        friendBlockDB = Firebase.database.reference.child("Friends_block")


        // selectedUserId는 intent.getStringExtra("userId")를 통해 DetailActivity로 전달된 선택된 사용자의 UID를 받아오기 위해 사용됩니다.
        //이는 DetailActivity가 시작될 때 전달되는 인텐트에서 추출된 데이터로, 다른 사용자의 상세 정보를 표시하기 위해 필요합니다.

        // 현재 사용자의 UID = myId, 선택한 사용자의 UID = userID

        // A가 B를 차단했는지 확인
        userID?.let { selectedUserId -> // "userId" 를 통해 DetailActivity 로 전달된 userId UID 받기 위해 사용
            // 선택된 사용자('selectedUserId') 가 현재 사용자('myId') 를 차단했는지 확인
            friendBlockDB.child(selectedUserId).child(myId.toString())
                .addListenerForSingleValueEvent(object : ValueEventListener {
                    override fun onDataChange(snapshot: DataSnapshot) {
                        // 데이터를 성공적으로 가져온 경우
                        if (snapshot.exists()) { // 해당 경로에 데이터 존재하는지 확인하여 차단 여부 판단
                            // A가 B를 차단한 경우 차단 안내 토스트 메시지 표시
                            Toast.makeText(
                                this@DetailActivity,
                                "해당 사용자가 당신을 차단했습니다.\n채팅신청이 불가능합니다.",
                                Toast.LENGTH_SHORT
                            ).show()
                            // 채팅하기 UI 숨기기
                            hideFriendInteractionUI()
                        }
                    }
                    override fun onCancelled(error: DatabaseError) {
                        // 처리 중 오류 발생한 경우
                        Toast.makeText(
                            this@DetailActivity,
                            "데이터 처리에 실패했습니다.\n다시 시도해주세요.",
                            Toast.LENGTH_SHORT
                        ).show()
                    }
                })
        }
    }

    private fun hideFriendInteractionUI() {
        // 채팅하기 버튼 숨기기
        binding.DetailBtnChat.visibility = View.GONE
        binding.DetailTxtChat.visibility = View.GONE
    }

해결방안

  • DetailActivity 내에서 상대방이 현재 사용자를 차단했는지를 직접 확인하는 로직을 추가했다. friendBlockDB.child(selectedUserId).child(myId.toString())를 통해 현재 사용자(myId)가 상대방(selectedUserId)에 의해 차단되었는지 확인한다.

  • 차단된 경우, 토스트 메시지를 표시하고 채팅 관련 UI를 숨기는 hideFriendInteractionUI 함수를 호출한다.

코드 구조 개선

userID?.let { selectedUserId -> ... } 구문을 사용하여 선택된 사용자의 UID(selectedUserId)를 활용한다. 이를 통해 현재 사용자가 선택한 사용자에 의해 차단되었는지 직접 확인하고, 그에 따른 적절한 UI 조정을 수행한다.





3. 정리

문제

상대방이 현재 사용자를 차단했는지 확인하는 로직이 누락되어
차단된 사용자가 상세 페이지에 접근했을 때 그에 따른 UI 조정이 이루어지지 않았다.

해결과정

  • loadOponentBlockFriends 메서드를 분석하여 차단 목록을 불러오지만, 사용하지 않는 문제를 파악했다.
  • DetailActivity에 새로운 로직을 구현하여 현재 사용자가 상대방에 의해 차단되었는지 직접 확인하는 방식으로 문제를 해결했다. Firebase 데이터베이스의 Friends_block 노드를 조회하여 차단 여부를 판단한다.
  • 차단된 경우, 사용자에게 피드백을 제공하고(토스팅 메세지 등) 채팅 관련 UI를 숨기는 조치를 취했다.

결과

  • 코드의 명확성, 기능적 완성도가 향상되었다.
  • 차단된 사용자가 상세 페이지를 방문했을 때 적절한 사용자 경험을 제공했다.
  • 이러한 변경을 통해 애플리케이션의 전반적인 사용자 인터페이스 일관성과 안정성이 강화되었다.

1개의 댓글

comment-user-thumbnail
2023년 11월 13일

감사합니다. 이런 정보를 나눠주셔서 좋아요.

답글 달기