라이브방

- 하트 알림 바(채팅) 배경, 닉네임, 글자색 변경
- 하트 알림 바 위치 수정 : 채팅 -> 공지 밑
This commit is contained in:
klaus 2024-10-27 23:35:21 +09:00
parent 04151168ca
commit f51f7ef412
5 changed files with 83 additions and 52 deletions

View File

@ -9,6 +9,7 @@ import android.content.ClipboardManager
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.graphics.Rect import android.graphics.Rect
import android.graphics.Typeface
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
import android.net.Uri import android.net.Uri
import android.os.Build import android.os.Build
@ -18,8 +19,11 @@ import android.os.Handler
import android.os.Looper import android.os.Looper
import android.text.Spannable import android.text.Spannable
import android.text.SpannableString import android.text.SpannableString
import android.text.Spanned
import android.text.method.LinkMovementMethod import android.text.method.LinkMovementMethod
import android.text.style.ClickableSpan import android.text.style.ClickableSpan
import android.text.style.ForegroundColorSpan
import android.text.style.StyleSpan
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.animation.AccelerateDecelerateInterpolator import android.view.animation.AccelerateDecelerateInterpolator
@ -74,7 +78,6 @@ import kr.co.vividnext.sodalive.live.room.chat.LiveRoomChatRawMessage
import kr.co.vividnext.sodalive.live.room.chat.LiveRoomChatRawMessageType import kr.co.vividnext.sodalive.live.room.chat.LiveRoomChatRawMessageType
import kr.co.vividnext.sodalive.live.room.chat.LiveRoomDonationChat import kr.co.vividnext.sodalive.live.room.chat.LiveRoomDonationChat
import kr.co.vividnext.sodalive.live.room.chat.LiveRoomDonationStatusChat import kr.co.vividnext.sodalive.live.room.chat.LiveRoomDonationStatusChat
import kr.co.vividnext.sodalive.live.room.chat.LiveRoomHeartDonationChat
import kr.co.vividnext.sodalive.live.room.chat.LiveRoomJoinChat import kr.co.vividnext.sodalive.live.room.chat.LiveRoomJoinChat
import kr.co.vividnext.sodalive.live.room.chat.LiveRoomNormalChat import kr.co.vividnext.sodalive.live.room.chat.LiveRoomNormalChat
import kr.co.vividnext.sodalive.live.room.chat.LiveRoomRouletteDonationChat import kr.co.vividnext.sodalive.live.room.chat.LiveRoomRouletteDonationChat
@ -129,7 +132,7 @@ class LiveRoomActivity : BaseActivity<ActivityLiveRoomBinding>(ActivityLiveRoomB
private var isHost = false private var isHost = false
private var isNoChatting = false private var isNoChatting = false
private var remainingNoChattingTime = noChattingTime private var remainingNoChattingTime = NO_CHATTING_TIME
private val signatureImageUrlList = mutableListOf<String>() private val signatureImageUrlList = mutableListOf<String>()
private var signatureImageUrl = "" private var signatureImageUrl = ""
@ -151,6 +154,23 @@ class LiveRoomActivity : BaseActivity<ActivityLiveRoomBinding>(ActivityLiveRoomB
} }
} }
private val heartNicknameList = mutableListOf<String>()
private var heartNickname = ""
set(value) {
field = value
if (field.isNotBlank()) {
showHeartMessage()
handler.postDelayed({
if (heartNicknameList.isNotEmpty()) {
heartNickname = heartNicknameList.removeAt(0)
} else {
hideHeartMessage()
}
}, 1000)
}
}
private var isShowSignatureImage = false private var isShowSignatureImage = false
private var isAvailableLikeHeart = false private var isAvailableLikeHeart = false
private var originalButtonPosition: IntArray? = null private var originalButtonPosition: IntArray? = null
@ -162,7 +182,7 @@ class LiveRoomActivity : BaseActivity<ActivityLiveRoomBinding>(ActivityLiveRoomB
override fun onFinish() { override fun onFinish() {
isNoChatting = false isNoChatting = false
remainingNoChattingTime = noChattingTime remainingNoChattingTime = NO_CHATTING_TIME
removeNoChatRoom() removeNoChatRoom()
Toast.makeText( Toast.makeText(
applicationContext, applicationContext,
@ -1149,8 +1169,7 @@ class LiveRoomActivity : BaseActivity<ActivityLiveRoomBinding>(ActivityLiveRoomB
SharedPreferenceManager.userId.toInt() SharedPreferenceManager.userId.toInt()
) )
handler.post { handler.post {
chatAdapter.items.add(LiveRoomHeartDonationChat(nickname)) addHeartMessage(nickname)
invalidateChat()
addHeartAnimation() addHeartAnimation()
lifecycleScope.launch { viewModel.addHeartDonation() } lifecycleScope.launch { viewModel.addHeartDonation() }
} }
@ -1777,8 +1796,7 @@ class LiveRoomActivity : BaseActivity<ActivityLiveRoomBinding>(ActivityLiveRoomB
LiveRoomChatRawMessageType.HEART_DONATION -> { LiveRoomChatRawMessageType.HEART_DONATION -> {
handler.post { handler.post {
chatAdapter.items.add(LiveRoomHeartDonationChat(nickname)) addHeartMessage(nickname)
invalidateChat()
addHeartAnimation() addHeartAnimation()
lifecycleScope.launch { viewModel.addHeartDonation() } lifecycleScope.launch { viewModel.addHeartDonation() }
} }
@ -2120,6 +2138,46 @@ class LiveRoomActivity : BaseActivity<ActivityLiveRoomBinding>(ActivityLiveRoomB
} }
} }
private fun addHeartMessage(nickname: String) {
if (heartNickname.isBlank()) {
heartNickname = nickname
} else {
heartNicknameList.add(nickname)
}
}
private fun showHeartMessage() {
val str = "'${heartNickname}'님이 마음을 전했습니다 : \uD83D\uDC95"
val spStr = SpannableString(str)
spStr.setSpan(
ForegroundColorSpan(
ContextCompat.getColor(
applicationContext,
R.color.color_f0c030
)
),
str.indexOf("'") + 1,
str.indexOf("'님"),
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
)
spStr.setSpan(
StyleSpan(Typeface.BOLD),
str.indexOf("'"),
str.indexOf("'님"),
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
)
binding.tvHeartMessage.text = spStr
binding.tvHeartMessage.visibility = View.VISIBLE
}
private fun hideHeartMessage() {
heartNickname = ""
binding.tvHeartMessage.text = ""
binding.tvHeartMessage.visibility = View.GONE
}
private fun addSignatureImage(imageUrl: String) { private fun addSignatureImage(imageUrl: String) {
if (imageUrl.isNotBlank()) { if (imageUrl.isNotBlank()) {
if (!isShowSignatureImage) { if (!isShowSignatureImage) {
@ -2228,6 +2286,6 @@ class LiveRoomActivity : BaseActivity<ActivityLiveRoomBinding>(ActivityLiveRoomB
} }
companion object { companion object {
private const val noChattingTime = 180L private const val NO_CHATTING_TIME = 180L
} }
} }

View File

@ -403,39 +403,3 @@ data class LiveRoomRouletteDonationChat(
itemBinding.root.setPadding(33) itemBinding.root.setPadding(33)
} }
} }
@Keep
data class LiveRoomHeartDonationChat(
val nickname: String
) : LiveRoomChat() {
override var type = LiveRoomChatType.JOIN
override fun bind(context: Context, binding: ViewBinding, onClickProfile: ((Long) -> Unit)?) {
(binding as ItemLiveRoomJoinChatBinding).tvJoin.setTextColor(
ContextCompat.getColor(context, R.color.color_111111)
)
val str = "'$nickname'님이 마음을 전했습니다 : \uD83D\uDC95"
val spStr = SpannableString(str)
spStr.setSpan(
ForegroundColorSpan(
ContextCompat.getColor(
context,
R.color.color_ec3aa6
)
),
str.indexOf("'") + 1,
str.indexOf("'님"),
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
)
spStr.setSpan(
StyleSpan(Typeface.BOLD),
str.indexOf("'"),
str.indexOf("'님"),
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
)
(binding as ItemLiveRoomJoinChatBinding).tvJoin.text = spStr
binding.root.setBackgroundResource(R.drawable.bg_round_corner_4_7_ccffffff)
}
}

View File

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/color_ccffffff" />
<corners android:radius="4.7dp" />
<stroke
android:width="1dp"
android:color="@color/color_ccffffff" />
</shape>

View File

@ -56,6 +56,21 @@
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/ll_top" /> app:layout_constraintTop_toBottomOf="@+id/ll_top" />
<TextView
android:id="@+id/tv_heart_message"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/color_cc777777"
android:gravity="center"
android:paddingVertical="6.7dp"
android:text="dsfjkldfsjfsdkl"
android:textColor="@color/white"
android:textSize="12sp"
android:visibility="gone"
app:layout_constraintEnd_toEndOf="@+id/fl_margin"
app:layout_constraintStart_toStartOf="@+id/fl_margin"
app:layout_constraintTop_toBottomOf="@+id/fl_margin" />
<LinearLayout <LinearLayout
android:id="@+id/ll_notice" android:id="@+id/ll_notice"
android:layout_width="0dp" android:layout_width="0dp"

View File

@ -126,5 +126,7 @@
<color name="color_333bb9f1">#333BB9F1</color> <color name="color_333bb9f1">#333BB9F1</color>
<color name="color_672bff">#672BFF</color> <color name="color_672bff">#672BFF</color>
<color name="color_ccffffff">#CCFFFFFF</color> <color name="color_ccffffff">#CCFFFFFF</color>
<color name="color_cc777777">#CC777777</color>
<color name="color_ec3aa6">#EC3AA6</color> <color name="color_ec3aa6">#EC3AA6</color>
<color name="color_f0c030">#F0C030</color>
</resources> </resources>