Compare commits

..

No commits in common. "5a37ba8be02264cbb4ff61123e89226158ba5a61" and "a4ff89cec07ccdcf6f46410d97c4d55b82a4d526" have entirely different histories.

29 changed files with 736 additions and 1391 deletions

View File

@ -256,17 +256,6 @@
<option name="screenX" value="1812" /> <option name="screenX" value="1812" />
<option name="screenY" value="2176" /> <option name="screenY" value="2176" />
</PersistentDeviceSelectionData> </PersistentDeviceSelectionData>
<PersistentDeviceSelectionData>
<option name="api" value="34" />
<option name="brand" value="samsung" />
<option name="codename" value="q6q" />
<option name="id" value="q6q" />
<option name="manufacturer" value="Samsung" />
<option name="name" value="SM-F956B" />
<option name="screenDensity" value="420" />
<option name="screenX" value="1856" />
<option name="screenY" value="2160" />
</PersistentDeviceSelectionData>
<PersistentDeviceSelectionData> <PersistentDeviceSelectionData>
<option name="api" value="30" /> <option name="api" value="30" />
<option name="brand" value="google" /> <option name="brand" value="google" />
@ -323,6 +312,17 @@
<option name="screenX" value="1080" /> <option name="screenX" value="1080" />
<option name="screenY" value="2424" /> <option name="screenY" value="2424" />
</PersistentDeviceSelectionData> </PersistentDeviceSelectionData>
<PersistentDeviceSelectionData>
<option name="api" value="29" />
<option name="brand" value="samsung" />
<option name="codename" value="x1q" />
<option name="id" value="x1q" />
<option name="manufacturer" value="Samsung" />
<option name="name" value="Galaxy S20" />
<option name="screenDensity" value="480" />
<option name="screenX" value="1440" />
<option name="screenY" value="3200" />
</PersistentDeviceSelectionData>
</list> </list>
</option> </option>
</component> </component>

View File

@ -35,8 +35,8 @@ android {
applicationId "kr.co.vividnext.sodalive" applicationId "kr.co.vividnext.sodalive"
minSdk 23 minSdk 23
targetSdk 34 targetSdk 34
versionCode 122 versionCode 117
versionName "1.22.3" versionName "1.21.2"
} }
buildTypes { buildTypes {
@ -159,6 +159,4 @@ dependencies {
kapt "androidx.room:room-compiler:2.5.0" kapt "androidx.room:room-compiler:2.5.0"
implementation "androidx.room:room-ktx:2.5.0" implementation "androidx.room:room-ktx:2.5.0"
implementation "androidx.room:room-runtime:2.5.0" implementation "androidx.room:room-runtime:2.5.0"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4"
} }

View File

@ -636,7 +636,7 @@ class AudioContentDetailActivity : BaseActivity<ActivityAudioContentDetailBindin
response.price > 0 response.price > 0
if ( if (
response.creator.creatorId != SharedPreferenceManager.userId && !response.existOrdered && !response.existOrdered &&
response.totalContentCount != null && response.remainingContentCount != null && response.totalContentCount != null && response.remainingContentCount != null &&
response.remainingContentCount <= 0 response.remainingContentCount <= 0
) { ) {
@ -948,7 +948,7 @@ class AudioContentDetailActivity : BaseActivity<ActivityAudioContentDetailBindin
putExtra( putExtra(
"can", "can",
if (orderType == OrderType.RENTAL) { if (orderType == OrderType.RENTAL) {
ceil(audioContent.price * 0.7).toInt() ceil(audioContent.price * 0.6).toInt()
} else { } else {
audioContent.price audioContent.price
} }

View File

@ -65,14 +65,14 @@ class AudioContentOrderConfirmDialog(
if (SharedPreferenceManager.userId == 17958L) { if (SharedPreferenceManager.userId == 17958L) {
dialogView.ivCan.visibility = View.GONE dialogView.ivCan.visibility = View.GONE
dialogView.tvPrice.text = if (orderType == OrderType.RENTAL && !isOnlyRental) { dialogView.tvPrice.text = if (orderType == OrderType.RENTAL && !isOnlyRental) {
"${(ceil(price * 0.7).toInt() * 110).moneyFormat()}" "${(ceil(price * 0.6).toInt() * 110).moneyFormat()}"
} else { } else {
"${(price * 110).moneyFormat()}" "${(price * 110).moneyFormat()}"
} }
} else { } else {
dialogView.ivCan.visibility = View.VISIBLE dialogView.ivCan.visibility = View.VISIBLE
dialogView.tvPrice.text = if (orderType == OrderType.RENTAL && !isOnlyRental) { dialogView.tvPrice.text = if (orderType == OrderType.RENTAL && !isOnlyRental) {
ceil(price * 0.7).toInt().moneyFormat() ceil(price * 0.6).toInt().moneyFormat()
} else { } else {
price.moneyFormat() price.moneyFormat()
} }

View File

@ -53,10 +53,10 @@ class AudioContentOrderFragment(
} else { } else {
if (SharedPreferenceManager.userId == 17958L) { if (SharedPreferenceManager.userId == 17958L) {
binding.tvKeep.text = "${(price * 110).moneyFormat()}" binding.tvKeep.text = "${(price * 110).moneyFormat()}"
binding.tvRental.text = "${(ceil(price * 0.7).toInt() * 110).moneyFormat()}" binding.tvRental.text = "${(ceil(price * 0.6).toInt() * 110).moneyFormat()}"
} else { } else {
binding.tvKeep.text = price.moneyFormat() binding.tvKeep.text = price.moneyFormat()
binding.tvRental.text = ceil(price * 0.7).toInt().moneyFormat() binding.tvRental.text = ceil(price * 0.6).toInt().moneyFormat()
} }
binding.rlKeep.visibility = View.VISIBLE binding.rlKeep.visibility = View.VISIBLE

View File

@ -46,11 +46,3 @@ fun String.fontSpan(typeface: Typeface?, text: String): SpannableString {
return spannableString return spannableString
} }
fun String.prefix(length: Int): String {
return if (this.length >= length) {
this.substring(0, length)
} else {
this
}
}

View File

@ -24,10 +24,9 @@ import kr.co.vividnext.sodalive.live.room.donation.LiveRoomDonationRequest
import kr.co.vividnext.sodalive.live.room.donation.LiveRoomDonationResponse import kr.co.vividnext.sodalive.live.room.donation.LiveRoomDonationResponse
import kr.co.vividnext.sodalive.live.room.info.GetRoomInfoResponse import kr.co.vividnext.sodalive.live.room.info.GetRoomInfoResponse
import kr.co.vividnext.sodalive.live.room.kick_out.LiveRoomKickOutRequest import kr.co.vividnext.sodalive.live.room.kick_out.LiveRoomKickOutRequest
import kr.co.vividnext.sodalive.live.room.like.GetLiveRoomHeartTotalResponse
import kr.co.vividnext.sodalive.live.room.like.LiveRoomLikeHeartRequest
import kr.co.vividnext.sodalive.live.room.profile.GetLiveRoomUserProfileResponse import kr.co.vividnext.sodalive.live.room.profile.GetLiveRoomUserProfileResponse
import kr.co.vividnext.sodalive.live.room.tag.GetLiveTagResponse import kr.co.vividnext.sodalive.live.room.tag.GetLiveTagResponse
import kr.co.vividnext.sodalive.settings.ContentType
import okhttp3.MultipartBody import okhttp3.MultipartBody
import okhttp3.RequestBody import okhttp3.RequestBody
import retrofit2.http.Body import retrofit2.http.Body
@ -214,16 +213,4 @@ interface LiveApi {
@Body request: CancelLiveReservationRequest, @Body request: CancelLiveReservationRequest,
@Header("Authorization") authHeader: String @Header("Authorization") authHeader: String
): Single<ApiResponse<Any>> ): Single<ApiResponse<Any>>
@POST("/live/room/like-heart")
fun likeHeart(
@Body request: LiveRoomLikeHeartRequest,
@Header("Authorization") authHeader: String
): Single<ApiResponse<Any>>
@GET("/live/room/{id}/heart-total")
fun getTotalHeartCount(
@Path("id") id: Long,
@Header("Authorization") authHeader: String
): Single<ApiResponse<GetLiveRoomHeartTotalResponse>>
} }

View File

@ -17,7 +17,6 @@ import kr.co.vividnext.sodalive.live.room.donation.DeleteLiveRoomDonationMessage
import kr.co.vividnext.sodalive.live.room.donation.LiveRoomDonationRequest import kr.co.vividnext.sodalive.live.room.donation.LiveRoomDonationRequest
import kr.co.vividnext.sodalive.live.room.donation.LiveRoomDonationResponse import kr.co.vividnext.sodalive.live.room.donation.LiveRoomDonationResponse
import kr.co.vividnext.sodalive.live.room.kick_out.LiveRoomKickOutRequest import kr.co.vividnext.sodalive.live.room.kick_out.LiveRoomKickOutRequest
import kr.co.vividnext.sodalive.live.room.like.LiveRoomLikeHeartRequest
import kr.co.vividnext.sodalive.live.room.menu.MenuApi import kr.co.vividnext.sodalive.live.room.menu.MenuApi
import kr.co.vividnext.sodalive.user.CreatorFollowRequestRequest import kr.co.vividnext.sodalive.user.CreatorFollowRequestRequest
import kr.co.vividnext.sodalive.user.UserApi import kr.co.vividnext.sodalive.user.UserApi
@ -243,17 +242,4 @@ class LiveRepository(
creatorId = creatorId, creatorId = creatorId,
authHeader = token authHeader = token
) )
fun likeHeart(roomId: Long, token: String) = api.likeHeart(
request = LiveRoomLikeHeartRequest(
roomId = roomId,
container = "aos"
),
authHeader = token
)
fun getTotalHeartCount(roomId: Long, token: String) = api.getTotalHeartCount(
roomId,
authHeader = token
)
} }

View File

@ -1,6 +1,5 @@
package kr.co.vividnext.sodalive.live.room package kr.co.vividnext.sodalive.live.room
import android.animation.ObjectAnimator
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.app.AlertDialog import android.app.AlertDialog
import android.app.Service import android.app.Service
@ -9,7 +8,6 @@ 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
@ -19,25 +17,17 @@ 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.inputmethod.EditorInfo
import android.view.inputmethod.InputMethodManager import android.view.inputmethod.InputMethodManager
import android.widget.FrameLayout
import android.widget.ImageView
import android.widget.TextView import android.widget.TextView
import android.widget.Toast import android.widget.Toast
import androidx.activity.OnBackPressedCallback import androidx.activity.OnBackPressedCallback
import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.widget.PopupMenu import androidx.appcompat.widget.PopupMenu
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import coil.transform.CircleCropTransformation import coil.transform.CircleCropTransformation
@ -58,7 +48,6 @@ import io.agora.rtm.RtmChannelMember
import io.agora.rtm.RtmClientListener import io.agora.rtm.RtmClientListener
import io.agora.rtm.RtmMessage import io.agora.rtm.RtmMessage
import io.agora.rtm.RtmMessageType import io.agora.rtm.RtmMessageType
import kotlinx.coroutines.launch
import kr.co.vividnext.sodalive.R import kr.co.vividnext.sodalive.R
import kr.co.vividnext.sodalive.agora.Agora import kr.co.vividnext.sodalive.agora.Agora
import kr.co.vividnext.sodalive.base.BaseActivity import kr.co.vividnext.sodalive.base.BaseActivity
@ -100,7 +89,6 @@ import kr.co.vividnext.sodalive.report.UserReportDialog
import kr.co.vividnext.sodalive.settings.notification.MemberRole import kr.co.vividnext.sodalive.settings.notification.MemberRole
import org.koin.android.ext.android.inject import org.koin.android.ext.android.inject
import java.util.regex.Pattern import java.util.regex.Pattern
import kotlin.random.Random
class LiveRoomActivity : BaseActivity<ActivityLiveRoomBinding>(ActivityLiveRoomBinding::inflate) { class LiveRoomActivity : BaseActivity<ActivityLiveRoomBinding>(ActivityLiveRoomBinding::inflate) {
@ -130,9 +118,8 @@ class LiveRoomActivity : BaseActivity<ActivityLiveRoomBinding>(ActivityLiveRoomB
private var isMicrophoneMute = false private var isMicrophoneMute = false
private var isSpeaker = false private var isSpeaker = false
private var isHost = false
private var isNoChatting = false private var isNoChatting = false
private var remainingNoChattingTime = NO_CHATTING_TIME private var remainingNoChattingTime = noChattingTime
private val signatureImageUrlList = mutableListOf<String>() private val signatureImageUrlList = mutableListOf<String>()
private var signatureImageUrl = "" private var signatureImageUrl = ""
@ -154,26 +141,7 @@ 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 buttonPosition = IntArray(2)
private val countDownTimer = object : CountDownTimer(remainingNoChattingTime * 1000, 1000) { private val countDownTimer = object : CountDownTimer(remainingNoChattingTime * 1000, 1000) {
override fun onTick(millisUntilFinished: Long) { override fun onTick(millisUntilFinished: Long) {
@ -182,7 +150,7 @@ class LiveRoomActivity : BaseActivity<ActivityLiveRoomBinding>(ActivityLiveRoomB
override fun onFinish() { override fun onFinish() {
isNoChatting = false isNoChatting = false
remainingNoChattingTime = NO_CHATTING_TIME remainingNoChattingTime = noChattingTime
removeNoChatRoom() removeNoChatRoom()
Toast.makeText( Toast.makeText(
applicationContext, applicationContext,
@ -288,6 +256,17 @@ class LiveRoomActivity : BaseActivity<ActivityLiveRoomBinding>(ActivityLiveRoomB
viewModel.getMemberCan() viewModel.getMemberCan()
viewModel.getRoomInfo(roomId) viewModel.getRoomInfo(roomId)
viewModel.getBlockedMemberIdList() viewModel.getBlockedMemberIdList()
binding.etChat.setOnFocusChangeListener { view, hasFocus ->
if (isNoChatting && hasFocus) {
Toast.makeText(
applicationContext,
"${remainingNoChattingTime}초 동안 채팅하실 수 없습니다",
Toast.LENGTH_SHORT
).show()
view.clearFocus()
}
}
} }
override fun onStart() { override fun onStart() {
@ -469,16 +448,6 @@ class LiveRoomActivity : BaseActivity<ActivityLiveRoomBinding>(ActivityLiveRoomB
} }
) )
binding.etChat.setOnFocusChangeListener { view, hasFocus ->
if (isNoChatting && hasFocus) {
Toast.makeText(
applicationContext,
"${remainingNoChattingTime}초 동안 채팅하실 수 없습니다",
Toast.LENGTH_SHORT
).show()
view.clearFocus()
}
}
binding.tvQuit.setOnClickListener { onClickQuit() } binding.tvQuit.setOnClickListener { onClickQuit() }
binding.flMicrophoneMute.setOnClickListener { binding.flMicrophoneMute.setOnClickListener {
microphoneMute() microphoneMute()
@ -498,32 +467,21 @@ class LiveRoomActivity : BaseActivity<ActivityLiveRoomBinding>(ActivityLiveRoomB
binding.ivSpeakerMute.setImageResource(R.drawable.ic_speaker_on) binding.ivSpeakerMute.setImageResource(R.drawable.ic_speaker_on)
} }
} }
binding.etChat.setOnEditorActionListener { _, actionId, _ ->
if (actionId == EditorInfo.IME_ACTION_DONE || actionId == EditorInfo.IME_ACTION_SEND) {
inputChat()
true
} else {
false
}
}
binding.ivSend.setOnClickListener { inputChat() } binding.ivSend.setOnClickListener { inputChat() }
binding.flDonation.setOnClickListener { binding.flDonation.setOnClickListener {
hideKeyboard { val dialog = LiveRoomDonationDialog(
val dialog = LiveRoomDonationDialog( this,
this, LayoutInflater.from(this),
LayoutInflater.from(this), isLiveDonation = true
isLiveDonation = true ) { can, message, isSecret ->
) { can, message, isSecret -> if (can > 0) {
if (can > 0) { donation(can, message, isSecret)
donation(can, message, isSecret) } else {
} else { showToast("1캔 이상 후원하실 수 있습니다.")
showToast("1캔 이상 후원하실 수 있습니다.")
}
} }
dialog.show(screenWidth)
} }
dialog.show(screenWidth)
} }
binding.tvNotification.setOnClickListener { viewModel.toggleShowNotice() } binding.tvNotification.setOnClickListener { viewModel.toggleShowNotice() }
binding.tvMenuPan.setOnClickListener { viewModel.toggleShowMenuPan() } binding.tvMenuPan.setOnClickListener { viewModel.toggleShowMenuPan() }
@ -554,120 +512,6 @@ class LiveRoomActivity : BaseActivity<ActivityLiveRoomBinding>(ActivityLiveRoomB
super.onDestroy() super.onDestroy()
} }
private fun setHeartButtonPosition() {
handler.postDelayed(
{
// 버튼의 위치
val button = if (isHost) {
binding.flRouletteSettings
} else {
binding.flLikeHeart
}
buttonPosition = IntArray(2)
button.getLocationInWindow(buttonPosition)
},
500
)
}
private fun secondToMillis(second: Float): Long {
return (second * 1000).toLong()
}
private fun addHeartAnimation() {
val button = if (isHost) {
binding.flRouletteSettings
} else {
binding.flLikeHeart
}
// 하트 이미지뷰 생성
val heart = ImageView(this).apply {
setImageResource(R.drawable.ic_heart_pink) // 투명한 하트 이미지
layoutParams = FrameLayout.LayoutParams(
33.3f.dpToPx().toInt(),
33.3f.dpToPx().toInt()
) // 하트 크기 설정
}
// 하트의 초기 위치를 버튼의 위치로 설정
heart.x = (buttonPosition[0] + button.width / 2f - 50) // X축 (가운데 정렬)
heart.y = (buttonPosition[1] - 100).toFloat() // Y축 (버튼 바로 위에 생성)
binding.flRoot.addView(heart)
// 하트가 위로 올라가는 애니메이션
val animateDuration = secondToMillis(2.5f)
val moveUpAnimator = ObjectAnimator.ofFloat(
heart,
"translationY",
heart.y,
heart.y - (screenHeight * 1000 / 2337)
).apply {
duration = animateDuration
interpolator = AccelerateDecelerateInterpolator()
}
val isNegativeFirst = Random.nextBoolean()
// 좌우 이동 범위를 랜덤으로 설정
val x = 13.3f
val startX = if (isNegativeFirst) (0 - x).dpToPx() else x.dpToPx()
val endX = if (isNegativeFirst) x.dpToPx() else (0 - x).dpToPx()
val moveAnimator = ObjectAnimator.ofFloat(
heart,
"translationX",
heart.x + startX,
heart.x + endX
).apply {
duration = secondToMillis(1.5f)
repeatCount = ObjectAnimator.INFINITE
repeatMode = ObjectAnimator.REVERSE
interpolator = AccelerateDecelerateInterpolator()
}
val scaleXAnimator = ObjectAnimator.ofFloat(
heart,
"scaleX",
0.5f,
1.0f
).apply {
duration = animateDuration
}
val scaleYAnimator = ObjectAnimator.ofFloat(
heart,
"scaleY",
0.5f,
1.0f
).apply {
duration = animateDuration
}
// 하트 투명도 애니메이션
val fadeOutAnimator = ObjectAnimator.ofFloat(
heart,
"alpha",
1f,
0f
).apply {
duration = animateDuration
}
// 애니메이션 실행
moveUpAnimator.start()
moveAnimator.start()
fadeOutAnimator.start()
scaleXAnimator.start()
scaleYAnimator.start()
// 애니메이션이 끝나면 하트 제거
handler.postDelayed({
binding.flRoot.removeView(heart)
}, animateDuration)
}
private fun showOptionMenu( private fun showOptionMenu(
context: Context, context: Context,
userId: Long, userId: Long,
@ -894,36 +738,34 @@ class LiveRoomActivity : BaseActivity<ActivityLiveRoomBinding>(ActivityLiveRoomB
} }
binding.flDonationMessageList.setOnClickListener { binding.flDonationMessageList.setOnClickListener {
hideKeyboard { LiveRoomDonationMessageDialog(
LiveRoomDonationMessageDialog( layoutInflater = LayoutInflater.from(this),
layoutInflater = LayoutInflater.from(this), creatorId = response.creatorId,
creatorId = response.creatorId, activity = this,
activity = this, donationMessageListLiveData = donationMessageViewModel
donationMessageListLiveData = donationMessageViewModel .donationMessageListLiveData,
.donationMessageListLiveData, donationMessageCountLiveData = donationMessageViewModel
donationMessageCountLiveData = donationMessageViewModel .donationMessageCountLiveData,
.donationMessageCountLiveData, getDonationMessageList = {
getDonationMessageList = { donationMessageViewModel.getDonationMessageList(roomId = roomId)
donationMessageViewModel.getDonationMessageList(roomId = roomId) },
}, deleteDonationMessage = {
deleteDonationMessage = { if (
if ( response.creatorId == SharedPreferenceManager.userId &&
response.creatorId == SharedPreferenceManager.userId && SharedPreferenceManager.role == MemberRole.CREATOR.name
SharedPreferenceManager.role == MemberRole.CREATOR.name ) {
) { donationMessageViewModel.deleteDonationMessage(
donationMessageViewModel.deleteDonationMessage( roomId = roomId,
roomId = roomId, uuid = it
uuid = it )
)
}
},
copyMessage = {
val clipboard = getSystemService(CLIPBOARD_SERVICE) as ClipboardManager
clipboard.setPrimaryClip(ClipData.newPlainText(it, it))
showToast("후원 히스토리가 복사되었습니다.")
} }
).show() },
} copyMessage = {
val clipboard = getSystemService(CLIPBOARD_SERVICE) as ClipboardManager
clipboard.setPrimaryClip(ClipData.newPlainText(it, it))
showToast("후원 히스토리가 복사되었습니다.")
}
).show()
} }
speakerListAdapter.managerId = response.creatorId speakerListAdapter.managerId = response.creatorId
@ -1052,10 +894,11 @@ class LiveRoomActivity : BaseActivity<ActivityLiveRoomBinding>(ActivityLiveRoomB
binding.ivCreatorFollow.visibility = View.GONE binding.ivCreatorFollow.visibility = View.GONE
} }
isHost = response.creatorId == SharedPreferenceManager.userId initRouletteSettingButton(isHost = response.creatorId == SharedPreferenceManager.userId)
initLikeHeartButton() activatingRouletteButton(
initRouletteSettingButton() isHost = response.creatorId == SharedPreferenceManager.userId,
activatingRouletteButton(isActiveRoulette = response.isActiveRoulette) isActiveRoulette = response.isActiveRoulette
)
if (response.menuPan.isNotBlank()) { if (response.menuPan.isNotBlank()) {
binding.tvMenuPan.visibility = View.VISIBLE binding.tvMenuPan.visibility = View.VISIBLE
@ -1131,119 +974,46 @@ class LiveRoomActivity : BaseActivity<ActivityLiveRoomBinding>(ActivityLiveRoomB
binding.tvTotalCan.text = it.moneyFormat() binding.tvTotalCan.text = it.moneyFormat()
} }
viewModel.totalHeartCount.observe(this) {
binding.tvTotalHeart.text = it.moneyFormat()
}
viewModel.coverImageUrlLiveData.observe(this) { viewModel.coverImageUrlLiveData.observe(this) {
binding.ivCover.loadUrl(it) binding.ivCover.loadUrl(it)
} }
} }
private fun initLikeHeartButton() { private fun initRouletteSettingButton(isHost: Boolean) {
if (!isHost) {
binding.flLikeHeart.visibility = View.VISIBLE
binding.flLikeHeart.setOnClickListener {
if (isAvailableLikeHeart) {
binding.flLikeHeart.isEnabled = false
viewModel.likeHeart(
roomId = roomId,
onSuccess = {
val donationRawMessage = Gson().toJson(
LiveRoomChatRawMessage(
type = LiveRoomChatRawMessageType.HEART_DONATION,
message = "",
can = 1,
signature = null,
signatureImageUrl = null,
donationMessage = null
)
)
agora.sendRawMessageToGroup(
rawMessage = donationRawMessage.toByteArray(),
onSuccess = {
val nickname = viewModel.getUserNickname(
SharedPreferenceManager.userId.toInt()
)
handler.post {
addHeartMessage(nickname)
addHeartAnimation()
lifecycleScope.launch { viewModel.addHeartDonation() }
}
},
onFailure = {
viewModel.refundDonation(roomId)
}
)
binding.flLikeHeart.isEnabled = true
},
onFailure = {
binding.flLikeHeart.isEnabled = true
}
)
} else {
SodaDialog(
activity = this@LiveRoomActivity,
layoutInflater = layoutInflater,
title = "안내",
desc = "'좋아해요'는 유료 후원입니다.\n" +
"클릭시 1캔이 소진됩니다.",
confirmButtonTitle = "확인",
confirmButtonClick = { isAvailableLikeHeart = true }
).show(screenWidth)
}
}
} else {
binding.flLikeHeart.visibility = View.GONE
}
}
private fun initRouletteSettingButton() {
if (isHost) { if (isHost) {
binding.flRouletteSettings.visibility = View.VISIBLE binding.flRouletteSettings.visibility = View.VISIBLE
binding.flRouletteSettings.setOnClickListener { binding.flRouletteSettings.setOnClickListener {
hideKeyboard { rouletteConfigResult.launch(
rouletteConfigResult.launch( Intent(
Intent( applicationContext,
applicationContext, RouletteConfigActivity::class.java
RouletteConfigActivity::class.java
)
) )
} )
} }
} else { } else {
binding.flRouletteSettings.visibility = View.GONE binding.flRouletteSettings.visibility = View.GONE
} }
} }
private fun activatingRouletteButton(isActiveRoulette: Boolean) { private fun activatingRouletteButton(isHost: Boolean, isActiveRoulette: Boolean) {
handler.postDelayed( if (!isHost && isActiveRoulette) {
{ binding.flRoulette.visibility = View.VISIBLE
if (!isHost && isActiveRoulette) { binding.flRoulette.setOnClickListener {
binding.flRoulette.visibility = View.VISIBLE viewModel.showRoulette {
binding.flRoulette.setOnClickListener { RoulettePreviewDialog(
hideKeyboard { activity = this,
viewModel.showRoulette { previewList = it,
RoulettePreviewDialog( onClickSpin = { rouletteId ->
activity = this, spinRoulette(rouletteId = rouletteId)
previewList = it, },
onClickSpin = { rouletteId -> layoutInflater = layoutInflater
spinRoulette(rouletteId = rouletteId) ).show()
},
layoutInflater = layoutInflater
).show()
}
}
}
} else {
binding.flRoulette.visibility = View.GONE
} }
}, }
500
) } else {
binding.flRoulette.visibility = View.GONE
}
} }
private fun setNoticeAndClickableUrl(textView: TextView, text: String) { private fun setNoticeAndClickableUrl(textView: TextView, text: String) {
@ -1639,7 +1409,7 @@ class LiveRoomActivity : BaseActivity<ActivityLiveRoomBinding>(ActivityLiveRoomB
) )
) )
invalidateChat() invalidateChat()
lifecycleScope.launch { viewModel.addDonationCan(can) } viewModel.addDonationCan(can)
addSignature(signature) addSignature(signature)
} }
}, },
@ -1680,7 +1450,7 @@ class LiveRoomActivity : BaseActivity<ActivityLiveRoomBinding>(ActivityLiveRoomB
) )
) )
invalidateChat() invalidateChat()
lifecycleScope.launch { viewModel.addDonationCan(can) } viewModel.addDonationCan(can)
} }
}, },
onFailure = { onFailure = {
@ -1747,9 +1517,7 @@ class LiveRoomActivity : BaseActivity<ActivityLiveRoomBinding>(ActivityLiveRoomB
) )
) )
invalidateChat() invalidateChat()
lifecycleScope.launch { viewModel.addDonationCan(rawMessage.can)
viewModel.addDonationCan(rawMessage.can)
}
if (rawMessage.signature != null) { if (rawMessage.signature != null) {
addSignature(rawMessage.signature) addSignature(rawMessage.signature)
@ -1772,9 +1540,14 @@ class LiveRoomActivity : BaseActivity<ActivityLiveRoomBinding>(ActivityLiveRoomB
} }
LiveRoomChatRawMessageType.TOGGLE_ROULETTE -> { LiveRoomChatRawMessageType.TOGGLE_ROULETTE -> {
activatingRouletteButton( handler.post {
isActiveRoulette = rawMessage.isActiveRoulette ?: false activatingRouletteButton(
) isHost = viewModel
.roomInfoResponse
.creatorId == SharedPreferenceManager.userId,
isActiveRoulette = rawMessage.isActiveRoulette ?: false
)
}
} }
LiveRoomChatRawMessageType.ROULETTE_DONATION -> { LiveRoomChatRawMessageType.ROULETTE_DONATION -> {
@ -1787,17 +1560,7 @@ class LiveRoomActivity : BaseActivity<ActivityLiveRoomBinding>(ActivityLiveRoomB
) )
) )
invalidateChat() invalidateChat()
lifecycleScope.launch { viewModel.addDonationCan(rawMessage.can)
viewModel.addDonationCan(rawMessage.can)
}
}
}
LiveRoomChatRawMessageType.HEART_DONATION -> {
handler.post {
addHeartMessage(nickname)
addHeartAnimation()
lifecycleScope.launch { viewModel.addHeartDonation() }
} }
} }
@ -1867,7 +1630,6 @@ class LiveRoomActivity : BaseActivity<ActivityLiveRoomBinding>(ActivityLiveRoomB
if (containNoChatRoom()) { if (containNoChatRoom()) {
startNoChatting() startNoChatting()
} }
setHeartButtonPosition()
}, },
rtmChannelJoinFail = { rtmChannelJoinFail = {
agoraConnectFail() agoraConnectFail()
@ -2123,6 +1885,7 @@ class LiveRoomActivity : BaseActivity<ActivityLiveRoomBinding>(ActivityLiveRoomB
) )
) )
invalidateChat() invalidateChat()
viewModel.addDonationCan(message.can)
if (message.signature != null) { if (message.signature != null) {
addSignature(message.signature) addSignature(message.signature)
@ -2135,46 +1898,6 @@ 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) {
@ -2283,6 +2006,6 @@ class LiveRoomActivity : BaseActivity<ActivityLiveRoomBinding>(ActivityLiveRoomB
} }
companion object { companion object {
private const val NO_CHATTING_TIME = 180L private const val noChattingTime = 180L
} }
} }

View File

@ -13,8 +13,6 @@ import com.google.gson.Gson
import com.orhanobut.logger.Logger import com.orhanobut.logger.Logger
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
import io.reactivex.rxjava3.schedulers.Schedulers import io.reactivex.rxjava3.schedulers.Schedulers
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
import kr.co.vividnext.sodalive.base.BaseViewModel import kr.co.vividnext.sodalive.base.BaseViewModel
import kr.co.vividnext.sodalive.common.SharedPreferenceManager import kr.co.vividnext.sodalive.common.SharedPreferenceManager
import kr.co.vividnext.sodalive.live.LiveRepository import kr.co.vividnext.sodalive.live.LiveRepository
@ -66,10 +64,6 @@ class LiveRoomViewModel(
val totalDonationCan: LiveData<Int> val totalDonationCan: LiveData<Int>
get() = _totalDonationCan get() = _totalDonationCan
private val _totalHeartCount = MutableLiveData(0)
val totalHeartCount: LiveData<Int>
get() = _totalHeartCount
private val _userProfileLiveData = MutableLiveData<GetLiveRoomUserProfileResponse>() private val _userProfileLiveData = MutableLiveData<GetLiveRoomUserProfileResponse>()
val userProfileLiveData: LiveData<GetLiveRoomUserProfileResponse> val userProfileLiveData: LiveData<GetLiveRoomUserProfileResponse>
get() = _userProfileLiveData get() = _userProfileLiveData
@ -102,8 +96,6 @@ class LiveRoomViewModel(
private val blockedMemberIdList: MutableList<Long> = mutableListOf() private val blockedMemberIdList: MutableList<Long> = mutableListOf()
val mutex = Mutex()
fun getUserNickname(memberId: Int): String { fun getUserNickname(memberId: Int): String {
for (manager in roomInfoResponse.managerList) { for (manager in roomInfoResponse.managerList) {
if (manager.id.toInt() == memberId) { if (manager.id.toInt() == memberId) {
@ -223,7 +215,6 @@ class LiveRoomViewModel(
} }
getTotalDonationCan(roomId = roomId) getTotalDonationCan(roomId = roomId)
getTotalHeart(roomId = roomId)
if (it.data.isAdult && !SharedPreferenceManager.isAuth) { if (it.data.isAdult && !SharedPreferenceManager.isAuth) {
_changeIsAdultLiveData.value = true _changeIsAdultLiveData.value = true
@ -567,36 +558,6 @@ class LiveRoomViewModel(
) )
} }
fun likeHeart(roomId: Long, onSuccess: () -> Unit, onFailure: () -> Unit) {
compositeDisposable.add(
repository.likeHeart(roomId, token = "Bearer ${SharedPreferenceManager.token}")
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
{
if (it.success) {
SharedPreferenceManager.can -= 1
onSuccess()
} else {
if (it.message != null) {
_toastLiveData.postValue(it.message)
} else {
_toastLiveData.postValue(
"알 수 없는 오류가 발생했습니다. 다시 시도해 주세요."
)
}
onFailure()
}
},
{
it.message?.let { message -> Logger.e(message) }
_toastLiveData.postValue("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.")
onFailure()
}
)
)
}
fun donation( fun donation(
roomId: Long, roomId: Long,
can: Int, can: Int,
@ -676,16 +637,8 @@ class LiveRoomViewModel(
) )
} }
suspend fun addDonationCan(can: Int) { fun addDonationCan(can: Int) {
mutex.withLock { _totalDonationCan.postValue(totalDonationCan.value!! + can)
_totalDonationCan.postValue(totalDonationCan.value!! + can)
}
}
suspend fun addHeartDonation() {
mutex.withLock {
_totalHeartCount.postValue(totalHeartCount.value!! + 1)
}
} }
fun donationStatus(roomId: Long, onSuccess: (GetLiveRoomDonationStatusResponse) -> Unit) { fun donationStatus(roomId: Long, onSuccess: (GetLiveRoomDonationStatusResponse) -> Unit) {
@ -729,27 +682,6 @@ class LiveRoomViewModel(
} }
} }
private fun getTotalHeart(roomId: Long) {
compositeDisposable.add(
repository.getTotalHeartCount(
roomId = roomId,
token = "Bearer ${SharedPreferenceManager.token}"
)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
{
if (it.success && it.data != null) {
_totalHeartCount.postValue(it.data.totalHeartCount)
}
},
{
_totalHeartCount.postValue(0)
}
)
)
}
private fun getTotalDonationCan(roomId: Long) { private fun getTotalDonationCan(roomId: Long) {
compositeDisposable.add( compositeDisposable.add(
repository.getTotalDonationCan( repository.getTotalDonationCan(

View File

@ -53,9 +53,6 @@ data class LiveRoomJoinChat(
) : LiveRoomChat() { ) : LiveRoomChat() {
override var type = LiveRoomChatType.JOIN override var type = LiveRoomChatType.JOIN
override fun bind(context: Context, binding: ViewBinding, onClickProfile: ((Long) -> Unit)?) { override fun bind(context: Context, binding: ViewBinding, onClickProfile: ((Long) -> Unit)?) {
(binding as ItemLiveRoomJoinChatBinding).tvJoin.setTextColor(
ContextCompat.getColor(context, R.color.color_eeeeee)
)
val str = "'$nickname'님이 입장하셨습니다." val str = "'$nickname'님이 입장하셨습니다."
val spStr = SpannableString(str) val spStr = SpannableString(str)
@ -79,7 +76,6 @@ data class LiveRoomJoinChat(
) )
(binding as ItemLiveRoomJoinChatBinding).tvJoin.text = spStr (binding as ItemLiveRoomJoinChatBinding).tvJoin.text = spStr
binding.root.setBackgroundResource(R.drawable.bg_round_corner_4_7_cc004462)
} }
} }

View File

@ -35,8 +35,5 @@ enum class LiveRoomChatRawMessageType {
TOGGLE_ROULETTE, TOGGLE_ROULETTE,
@SerializedName("ROULETTE_DONATION") @SerializedName("ROULETTE_DONATION")
ROULETTE_DONATION, ROULETTE_DONATION
@SerializedName("HEART_DONATION")
HEART_DONATION
} }

View File

@ -7,8 +7,7 @@ import com.google.gson.annotations.SerializedName
data class GetLiveRoomDonationStatusResponse( data class GetLiveRoomDonationStatusResponse(
@SerializedName("donationList") val donationList: List<GetLiveRoomDonationItem>, @SerializedName("donationList") val donationList: List<GetLiveRoomDonationItem>,
@SerializedName("totalCount") val totalCount: Int, @SerializedName("totalCount") val totalCount: Int,
@SerializedName("totalCan") val totalCan: Int, @SerializedName("totalCan") val totalCan: Int
@SerializedName("totalSecretCan") val totalSecretCan: Int
) )
@Keep @Keep
@ -16,6 +15,5 @@ data class GetLiveRoomDonationItem(
@SerializedName("profileImage") val profileImage: String, @SerializedName("profileImage") val profileImage: String,
@SerializedName("nickname") val nickname: String, @SerializedName("nickname") val nickname: String,
@SerializedName("userId") val userId: Long, @SerializedName("userId") val userId: Long,
@SerializedName("can") val can: Int, @SerializedName("can") val can: Int
@SerializedName("secretCan") val secretCan: Int
) )

View File

@ -19,7 +19,6 @@ import kr.co.vividnext.sodalive.common.Constants
import kr.co.vividnext.sodalive.common.SharedPreferenceManager import kr.co.vividnext.sodalive.common.SharedPreferenceManager
import kr.co.vividnext.sodalive.databinding.DialogLiveRoomDonationBinding import kr.co.vividnext.sodalive.databinding.DialogLiveRoomDonationBinding
import kr.co.vividnext.sodalive.extensions.moneyFormat import kr.co.vividnext.sodalive.extensions.moneyFormat
import kr.co.vividnext.sodalive.extensions.prefix
import kr.co.vividnext.sodalive.mypage.can.charge.CanChargeActivity import kr.co.vividnext.sodalive.mypage.can.charge.CanChargeActivity
class LiveRoomDonationDialog( class LiveRoomDonationDialog(
@ -51,11 +50,11 @@ class LiveRoomDonationDialog(
dialogView.tvDonation.setOnClickListener { dialogView.tvDonation.setOnClickListener {
try { try {
val can = dialogView.etDonationCan.text.toString().toInt() val can = dialogView.etDonationCan.text.toString().toInt()
val message = dialogView.etDonationMessage.text.toString().prefix(200) val message = dialogView.etDonationMessage.text.toString()
if (can > 0) { if (can > 0) {
bottomSheetDialog.dismiss() bottomSheetDialog.dismiss()
onClickDonation(can, message, dialogView.tvSecret.isSelected) onClickDonation(can, message, dialogView.chkSecret.isChecked)
} else { } else {
Toast.makeText( Toast.makeText(
activity, activity,
@ -72,20 +71,10 @@ class LiveRoomDonationDialog(
} }
} }
if (isLiveDonation) { dialogView.rlSecret.visibility = if (isLiveDonation) {
dialogView.rlSecret.visibility = View.VISIBLE View.VISIBLE
dialogView.tvSecret.setOnClickListener {
val isSelected = dialogView.tvSecret.isSelected
dialogView.tvSecret.isSelected = !isSelected
dialogView.etDonationMessage.hint = if (!isSelected) {
"함께 보낼 비밀 메시지 입력(최대 200자)"
} else {
"함께 보낼 메시지 입력(최대 200자)"
}
}
dialogView.tvSecret.isSelected = false
} else { } else {
dialogView.rlSecret.visibility = View.GONE View.GONE
} }
setupView() setupView()

View File

@ -50,12 +50,6 @@ class LiveRoomDonationRankingAdapter :
} }
binding.tvDonationCan.text = item.can.moneyFormat() binding.tvDonationCan.text = item.can.moneyFormat()
binding.tvDonationSecretCan.text = item.secretCan.moneyFormat()
binding.llDonationSecret.visibility = if (item.secretCan > 0) {
View.VISIBLE
} else {
View.GONE
}
val lp = binding.rlDonationRanking.layoutParams as FrameLayout.LayoutParams val lp = binding.rlDonationRanking.layoutParams as FrameLayout.LayoutParams

View File

@ -37,17 +37,6 @@ class LiveRoomDonationRankingDialog(
adapter.notifyDataSetChanged() adapter.notifyDataSetChanged()
dialogView.tvTotalCan.text = it.totalCan.moneyFormat() dialogView.tvTotalCan.text = it.totalCan.moneyFormat()
dialogView.tvTotalCount.text = it.totalCount.moneyFormat() dialogView.tvTotalCount.text = it.totalCount.moneyFormat()
dialogView.tvTotalSecretCan.text = it.totalSecretCan.moneyFormat()
if (it.totalSecretCan > 0) {
dialogView.llTotalCanSubTitle.visibility = View.VISIBLE
dialogView.tvTotalSecretCan.visibility = View.VISIBLE
dialogView.tvTotalCanSlash.visibility = View.VISIBLE
} else {
dialogView.llTotalCanSubTitle.visibility = View.GONE
dialogView.tvTotalSecretCan.visibility = View.GONE
dialogView.tvTotalCanSlash.visibility = View.GONE
}
} }
} }

View File

@ -1,9 +0,0 @@
package kr.co.vividnext.sodalive.live.room.like
import androidx.annotation.Keep
import com.google.gson.annotations.SerializedName
@Keep
data class GetLiveRoomHeartTotalResponse(
@SerializedName("totalHeartCount") val totalHeartCount: Int
)

View File

@ -1,10 +0,0 @@
package kr.co.vividnext.sodalive.live.room.like
import androidx.annotation.Keep
import com.google.gson.annotations.SerializedName
@Keep
data class LiveRoomLikeHeartRequest(
@SerializedName("roomId") val roomId: Long,
@SerializedName("container") val container: String
)

View File

@ -195,6 +195,7 @@ class AlarmListActivity : BaseActivity<ActivityAlarmListBinding>(
val permissions = mutableListOf<String>() val permissions = mutableListOf<String>()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
permissions.add(Manifest.permission.USE_FULL_SCREEN_INTENT)
permissions.add(Manifest.permission.POST_NOTIFICATIONS) permissions.add(Manifest.permission.POST_NOTIFICATIONS)
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

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_fedc00" />
<corners android:radius="2.7dp" />
<stroke
android:width="1dp"
android:color="@color/color_fedc00" />
</shape>

View File

@ -479,10 +479,8 @@
android:layout_marginTop="8dp" android:layout_marginTop="8dp"
android:ellipsize="end" android:ellipsize="end"
android:maxLines="2" android:maxLines="2"
android:fontFamily="@font/gmarket_sans_medium" android:textColor="@color/color_777777"
android:lineSpacingExtra="5dp" android:textSize="13.3sp"
android:textColor="@color/color_909090"
android:textSize="14sp"
tools:text="작품설명 작품설명 작품설명 작품설명 작품설명 작품설명 작품설명 작품설명 작품설명 작품설명 작품설명 작품설명 작품설명 작품설명 작품설명 작품설명" /> tools:text="작품설명 작품설명 작품설명 작품설명 작품설명 작품설명 작품설명 작품설명 작품설명 작품설명 작품설명 작품설명 작품설명 작품설명 작품설명 작품설명" />
</LinearLayout> </LinearLayout>
@ -679,7 +677,7 @@
android:background="@drawable/bg_round_corner_10_13181b_3bb9f1" android:background="@drawable/bg_round_corner_10_13181b_3bb9f1"
android:hint="댓글을 입력해 보세요" android:hint="댓글을 입력해 보세요"
android:importantForAutofill="no" android:importantForAutofill="no"
android:inputType="text|textMultiLine" android:inputType="text"
android:paddingVertical="13.3dp" android:paddingVertical="13.3dp"
android:paddingStart="13.3dp" android:paddingStart="13.3dp"
android:paddingEnd="50.7dp" android:paddingEnd="50.7dp"

File diff suppressed because it is too large Load Diff

View File

@ -78,19 +78,16 @@
android:layout_marginBottom="13.3dp" android:layout_marginBottom="13.3dp"
android:visibility="gone"> android:visibility="gone">
<TextView <CheckBox
android:id="@+id/tv_secret" android:id="@+id/chk_secret"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_alignParentEnd="true" android:layout_alignParentEnd="true"
android:button="@null" android:button="@drawable/ic_select_square"
android:drawablePadding="8dp"
android:fontFamily="@font/gmarket_sans_medium" android:fontFamily="@font/gmarket_sans_medium"
android:gravity="center"
android:paddingHorizontal="8dp" android:paddingHorizontal="8dp"
android:text="비밀후원" android:text="비밀후원"
android:textColor="@color/color_check_secret" android:textColor="@color/color_check_secret" />
app:drawableStartCompat="@drawable/ic_select_square" />
</RelativeLayout> </RelativeLayout>
<EditText <EditText
@ -107,7 +104,7 @@
android:textColor="@color/color_eeeeee" android:textColor="@color/color_eeeeee"
android:textColorHint="@color/color_777777" android:textColorHint="@color/color_777777"
android:textCursorDrawable="@drawable/edit_text_cursor" android:textCursorDrawable="@drawable/edit_text_cursor"
android:textSize="13.3sp" android:textSize="14.7sp"
tools:ignore="LabelFor" /> tools:ignore="LabelFor" />
<LinearLayout <LinearLayout
@ -198,16 +195,16 @@
android:layout_marginStart="10.3dp" android:layout_marginStart="10.3dp"
android:background="@drawable/bg_round_corner_6_7_88333333" android:background="@drawable/bg_round_corner_6_7_88333333"
android:fontFamily="@font/gmarket_sans_medium" android:fontFamily="@font/gmarket_sans_medium"
android:hint="함께 보낼 메시지 입력(최대 200자)" android:hint="함께 보낼 메시지 입력(최대 50자)"
android:importantForAutofill="no" android:importantForAutofill="no"
android:inputType="text" android:inputType="text"
android:maxLength="200" android:maxLength="50"
android:maxLines="1" android:maxLines="1"
android:padding="13.3dp" android:padding="13.3dp"
android:textColor="@color/color_eeeeee" android:textColor="@color/color_eeeeee"
android:textColorHint="@color/color_777777" android:textColorHint="@color/color_777777"
android:textCursorDrawable="@drawable/edit_text_cursor" android:textCursorDrawable="@drawable/edit_text_cursor"
android:textSize="13.3sp" android:textSize="14.7sp"
tools:ignore="LabelFor" /> tools:ignore="LabelFor" />
</LinearLayout> </LinearLayout>

View File

@ -41,112 +41,30 @@
android:paddingHorizontal="18.7dp" android:paddingHorizontal="18.7dp"
android:paddingVertical="10.7dp"> android:paddingVertical="10.7dp">
<LinearLayout <TextView
android:id="@+id/ll_total_can_title" android:id="@+id/tv_total_can_title"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_alignParentStart="true" android:layout_alignParentStart="true"
android:layout_centerVertical="true" android:layout_centerVertical="true"
android:orientation="horizontal"> android:fontFamily="@font/gmarket_sans_bold"
android:text="합계"
android:textColor="@color/color_d2d2d2"
android:textSize="13.3sp" />
<TextView <TextView
android:layout_width="wrap_content" android:id="@+id/tv_total_can"
android:layout_height="wrap_content"
android:fontFamily="@font/gmarket_sans_bold"
android:text="합계"
android:textColor="@color/color_d2d2d2"
android:textSize="13.3sp" />
<LinearLayout
android:id="@+id/ll_total_can_sub_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:visibility="gone">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="@font/gmarket_sans_bold"
android:text=" ("
android:textColor="@color/color_d2d2d2"
android:textSize="13.3sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="@font/gmarket_sans_medium"
android:text="일반"
android:textColor="@color/color_3bb9f1"
android:textSize="13.3sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="@font/gmarket_sans_medium"
android:text="/"
android:textColor="@color/color_d2d2d2"
android:textSize="13.3sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="@font/gmarket_sans_medium"
android:text="비밀"
android:textColor="@color/color_fedc00"
android:textSize="13.3sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="@font/gmarket_sans_bold"
android:text=")"
android:textColor="@color/color_d2d2d2"
android:textSize="13.3sp" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_centerVertical="true" android:layout_centerVertical="true"
android:layout_marginEnd="2.7dp" android:layout_marginEnd="2.7dp"
android:layout_toStartOf="@+id/tv_total_can_unit" android:layout_toStartOf="@+id/tv_total_can_unit"
android:layout_toEndOf="@+id/ll_total_can_title" android:layout_toEndOf="@+id/tv_total_can_title"
android:gravity="end"> android:fontFamily="@font/gmarket_sans_medium"
android:gravity="end"
<TextView android:textColor="@color/color_80d8ff"
android:id="@+id/tv_total_can" android:textSize="16sp"
android:layout_width="wrap_content" tools:text="1,999,999" />
android:layout_height="wrap_content"
android:fontFamily="@font/gmarket_sans_medium"
android:gravity="end"
android:textColor="@color/color_80d8ff"
android:textSize="14sp"
tools:text="1,999,999" />
<TextView
android:id="@+id/tv_total_can_slash"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="@font/gmarket_sans_medium"
android:gravity="end"
android:text="/"
android:textColor="@color/white"
android:textSize="14sp"
android:visibility="gone" />
<TextView
android:id="@+id/tv_total_secret_can"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="@font/gmarket_sans_medium"
android:gravity="end"
android:textColor="@color/color_fedc00"
android:textSize="14sp"
android:visibility="gone"
tools:text="1,999,999" />
</LinearLayout>
<TextView <TextView
android:id="@+id/tv_total_can_unit" android:id="@+id/tv_total_can_unit"
@ -192,7 +110,7 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:fontFamily="@font/gmarket_sans_medium" android:fontFamily="@font/gmarket_sans_medium"
android:text=" 명" android:text="명"
android:textColor="@color/color_777777" android:textColor="@color/color_777777"
android:textSize="12sp" /> android:textSize="12sp" />
</LinearLayout> </LinearLayout>

View File

@ -111,7 +111,7 @@
android:background="@drawable/bg_round_corner_10_232323_3bb9f1" android:background="@drawable/bg_round_corner_10_232323_3bb9f1"
android:hint="댓글을 입력해 보세요" android:hint="댓글을 입력해 보세요"
android:importantForAutofill="no" android:importantForAutofill="no"
android:inputType="text|textMultiLine" android:inputType="text"
android:paddingVertical="13.3dp" android:paddingVertical="13.3dp"
android:paddingStart="13.3dp" android:paddingStart="13.3dp"
android:paddingEnd="50.7dp" android:paddingEnd="50.7dp"

View File

@ -193,7 +193,7 @@
android:background="@drawable/bg_round_corner_10_232323_3bb9f1" android:background="@drawable/bg_round_corner_10_232323_3bb9f1"
android:hint="댓글을 입력해 보세요" android:hint="댓글을 입력해 보세요"
android:importantForAutofill="no" android:importantForAutofill="no"
android:inputType="text|textMultiLine" android:inputType="text"
android:paddingVertical="13.3dp" android:paddingVertical="13.3dp"
android:paddingStart="13.3dp" android:paddingStart="13.3dp"
android:paddingEnd="50.7dp" android:paddingEnd="50.7dp"

View File

@ -2,8 +2,7 @@
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content">
tools:background="@color/black">
<RelativeLayout <RelativeLayout
android:id="@+id/rl_donation_ranking" android:id="@+id/rl_donation_ranking"
@ -70,86 +69,32 @@
android:textSize="13.3sp" android:textSize="13.3sp"
tools:text="Remix" /> tools:text="Remix" />
<LinearLayout <TextView
android:layout_width="0dp" android:id="@+id/tv_donation_can"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginEnd="4dp"
android:layout_toStartOf="@+id/tv_donation_can_unit"
android:layout_toEndOf="@+id/tv_nickname"
android:fontFamily="@font/gmarket_sans_medium"
android:gravity="end"
android:textColor="@color/color_3bb9f1"
android:textSize="13.3sp"
tools:text="1000" />
<TextView
android:id="@+id/tv_donation_can_unit"
android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_alignParentEnd="true" android:layout_alignParentEnd="true"
android:layout_centerVertical="true" android:layout_centerVertical="true"
android:layout_marginHorizontal="13.3dp" android:layout_marginEnd="13.3dp"
android:layout_toEndOf="@+id/tv_nickname" android:fontFamily="@font/gmarket_sans_medium"
android:gravity="end|center_vertical" android:gravity="end"
android:orientation="vertical"> android:text="캔"
android:textColor="@color/color_eeeeee"
<LinearLayout android:textSize="10.7sp"
android:layout_width="wrap_content" tools:ignore="SmallSp" />
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/tv_donation_can"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="4dp"
android:fontFamily="@font/gmarket_sans_medium"
android:gravity="end"
android:textColor="@color/color_3bb9f1"
android:textSize="13.3sp"
tools:text="1000" />
<TextView
android:id="@+id/tv_donation_can_unit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="@font/gmarket_sans_medium"
android:gravity="end"
android:text="캔"
android:textColor="@color/color_eeeeee"
android:textSize="10.7sp"
tools:ignore="SmallSp" />
</LinearLayout>
<LinearLayout
android:id="@+id/ll_donation_secret"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:orientation="horizontal"
android:visibility="gone">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/bg_round_corner_2_7_fedc00"
android:fontFamily="@font/gmarket_sans_medium"
android:gravity="end"
android:paddingHorizontal="3.33dp"
android:paddingVertical="2.67dp"
android:text="비밀"
android:textColor="@color/color_111111"
android:textSize="12sp"
tools:ignore="SmallSp" />
<TextView
android:id="@+id/tv_donation_secret_can"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginHorizontal="4dp"
android:fontFamily="@font/gmarket_sans_medium"
android:gravity="end"
android:textColor="@color/color_fedc00"
android:textSize="13.3sp"
tools:text="1000" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="@font/gmarket_sans_medium"
android:gravity="end"
android:text="캔"
android:textColor="@color/color_eeeeee"
android:textSize="10.7sp"
tools:ignore="SmallSp" />
</LinearLayout>
</LinearLayout>
</RelativeLayout> </RelativeLayout>
</FrameLayout> </FrameLayout>

View File

@ -33,7 +33,6 @@
<color name="color_a285eb">#A285EB</color> <color name="color_a285eb">#A285EB</color>
<color name="color_3d2a6c">#3D2A6C</color> <color name="color_3d2a6c">#3D2A6C</color>
<color name="color_ffdc00">#FFDC00</color> <color name="color_ffdc00">#FFDC00</color>
<color name="color_fedc00">#FEDC00</color>
<color name="color_4999e3">#4999E3</color> <color name="color_4999e3">#4999E3</color>
<color name="color_35c2ff">#35C2FF</color> <color name="color_35c2ff">#35C2FF</color>
<color name="color_97aeff">#97AEFF</color> <color name="color_97aeff">#97AEFF</color>
@ -126,8 +125,4 @@
<color name="color_ff14d9">#FF14D9</color> <color name="color_ff14d9">#FF14D9</color>
<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_cc777777">#CC777777</color>
<color name="color_ec3aa6">#EC3AA6</color>
<color name="color_f0c030">#F0C030</color>
</resources> </resources>