test(chat-room): 타이핑 인디케이터 표시/중복/숨김 테스트 추가
- showTypingIndicator 중복 호출 시 중복 삽입 방지 검증 - hideTypingIndicator 안전성 검증(표시되지 않은 경우도 안전) - NPE 회귀 방지 fix(adapter): RecyclerView 미부착 상태에서 notify 호출로 NPE 발생 방지
This commit is contained in:
@@ -35,6 +35,9 @@ sealed class ChatListItem {
|
||||
|
||||
class ChatMessageAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
|
||||
|
||||
// 테스트/비연결 환경에서 notify* 호출로 인한 NPE 방지용 플래그
|
||||
private var isRecyclerViewAttached: Boolean = false
|
||||
|
||||
interface Callback {
|
||||
fun onRetrySend(localId: String)
|
||||
}
|
||||
@@ -122,7 +125,9 @@ class ChatMessageAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
|
||||
// 목록의 마지막에 추가
|
||||
items.add(ChatListItem.TypingIndicator)
|
||||
isTypingVisible = true
|
||||
notifyItemInserted(items.lastIndex)
|
||||
if (isRecyclerViewAttached) {
|
||||
notifyItemInserted(items.lastIndex)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -133,7 +138,9 @@ class ChatMessageAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
|
||||
if (index >= 0) {
|
||||
items.removeAt(index)
|
||||
isTypingVisible = false
|
||||
notifyItemRemoved(index)
|
||||
if (isRecyclerViewAttached) {
|
||||
notifyItemRemoved(index)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -480,6 +487,7 @@ class ChatMessageAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
|
||||
super.onAttachedToRecyclerView(recyclerView)
|
||||
// RecyclerView와 연결된 시점에 안정 ID 활성화 (JVM 테스트에서 NPE 회피)
|
||||
setHasStableIds(true)
|
||||
isRecyclerViewAttached = true
|
||||
}
|
||||
|
||||
override fun onViewAttachedToWindow(holder: RecyclerView.ViewHolder) {
|
||||
@@ -496,6 +504,11 @@ class ChatMessageAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
|
||||
super.onViewDetachedFromWindow(holder)
|
||||
}
|
||||
|
||||
override fun onDetachedFromRecyclerView(recyclerView: RecyclerView) {
|
||||
super.onDetachedFromRecyclerView(recyclerView)
|
||||
isRecyclerViewAttached = false
|
||||
}
|
||||
|
||||
override fun onViewRecycled(holder: RecyclerView.ViewHolder) {
|
||||
when (holder) {
|
||||
is TypingIndicatorViewHolder -> holder.stopTypingAnimation()
|
||||
|
||||
Reference in New Issue
Block a user