diff --git a/app/src/main/java/kr/co/vividnext/sodalive/chat/talk/room/ChatMessageAdapter.kt b/app/src/main/java/kr/co/vividnext/sodalive/chat/talk/room/ChatMessageAdapter.kt index bb260a84..5a9fb91a 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/chat/talk/room/ChatMessageAdapter.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/chat/talk/room/ChatMessageAdapter.kt @@ -6,8 +6,13 @@ package kr.co.vividnext.sodalive.chat.talk.room import android.annotation.SuppressLint +import android.graphics.Typeface import android.os.Bundle +import android.text.SpannableStringBuilder +import android.text.Spanned import android.text.TextUtils +import android.text.style.ForegroundColorSpan +import android.text.style.StyleSpan import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -16,6 +21,7 @@ import android.view.animation.AnimationUtils import android.widget.TextView import androidx.annotation.LayoutRes import androidx.annotation.VisibleForTesting +import androidx.core.content.ContextCompat import androidx.core.view.isVisible import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.RecyclerView @@ -106,6 +112,41 @@ class ChatMessageAdapter : RecyclerView.Adapter() { val isLast = !isSameSender(curr, next) return grouped to isLast } + + // 소괄호 텍스트 스타일링 유틸: 회색 + 기울임꼴 + private val PAREN_REGEX = Regex("\\([^()]*\\)") + + fun applyParentheticalStyle(tv: TextView, raw: CharSequence?, color: Int? = null) { + if (raw.isNullOrEmpty()) { + tv.text = raw ?: "" + return + } + val text = raw.toString() + val builder = SpannableStringBuilder(text) + val targetColor = color ?: ContextCompat.getColor( + tv.context, + R.color.color_7fe2e2e2 + ) + PAREN_REGEX.findAll(text).forEach { match -> + val start = match.range.first + val end = match.range.last + 1 + if (start in 0 until end && end <= builder.length) { + builder.setSpan( + ForegroundColorSpan(targetColor), + start, + end, + Spanned.SPAN_EXCLUSIVE_EXCLUSIVE + ) + builder.setSpan( + StyleSpan(Typeface.ITALIC), + start, + end, + Spanned.SPAN_EXCLUSIVE_EXCLUSIVE + ) + } + } + tv.text = builder + } } private val items: MutableList = mutableListOf() @@ -414,7 +455,14 @@ class ChatMessageAdapter : RecyclerView.Adapter() { private val binding: ItemChatUserMessageBinding ) : RecyclerView.ViewHolder(binding.root) { fun bind(data: ChatMessage, showTime: Boolean, isGrouped: Boolean) { - binding.tvMessage.text = data.message + applyParentheticalStyle( + binding.tvMessage, + data.message, + ContextCompat.getColor( + binding.root.context, + R.color.color_333333 + ) + ) // 화면 너비의 65%를 최대 폭으로 적용 binding.tvMessage.maxWidth = (itemView.resources.displayMetrics.widthPixels * 0.65f).toInt() @@ -542,7 +590,7 @@ class ChatMessageAdapter : RecyclerView.Adapter() { // 텍스트 메시지 binding.imageContainer.visibility = View.GONE binding.messageContainer.visibility = View.VISIBLE - binding.tvMessage.text = data.message + applyParentheticalStyle(binding.tvMessage, data.message) binding.tvMessage.maxWidth = (itemView.resources.displayMetrics.widthPixels * 0.90f).toInt() } diff --git a/app/src/main/java/kr/co/vividnext/sodalive/chat/talk/room/ChatRoomActivity.kt b/app/src/main/java/kr/co/vividnext/sodalive/chat/talk/room/ChatRoomActivity.kt index 11129589..721ed0bb 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/chat/talk/room/ChatRoomActivity.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/chat/talk/room/ChatRoomActivity.kt @@ -96,6 +96,8 @@ class ChatRoomActivity : BaseActivity( binding.tvName.text = "" binding.ivProfile.setImageResource(R.drawable.ic_placeholder_profile) binding.ivBackgroundProfile.setImageResource(R.drawable.ic_placeholder_profile) + // 저장된 배경이 있으면 즉시 적용 (네트워크 응답 전 초기 진입에서도 반영) + applyBackgroundFromPrefsOrProfile("") // 배지는 기본 Clone으로 둔다가 실제 값으로 갱신 (디자인 기본 배경도 clone) binding.tvCharacterTypeBadge.text = "Clone" binding.tvCharacterTypeBadge.setBackgroundResource(R.drawable.bg_character_status_clone)