feat(chat): 메시지 괄호 지문 색상을 회색으로 변경
This commit is contained in:
@@ -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<RecyclerView.ViewHolder>() {
|
||||
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<ChatListItem> = mutableListOf()
|
||||
@@ -414,7 +455,14 @@ class ChatMessageAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
|
||||
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<RecyclerView.ViewHolder>() {
|
||||
// 텍스트 메시지
|
||||
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()
|
||||
}
|
||||
|
||||
@@ -96,6 +96,8 @@ class ChatRoomActivity : BaseActivity<ActivityChatRoomBinding>(
|
||||
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)
|
||||
|
||||
Reference in New Issue
Block a user