커뮤니티 유료 게시글 조회, 구매 기능 추가

This commit is contained in:
klaus 2024-05-23 23:13:25 +09:00
parent a9511dcb51
commit 9d5ca7c36d
14 changed files with 376 additions and 49 deletions

View File

@ -20,6 +20,7 @@ import androidx.appcompat.widget.PopupMenu
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import coil.load import coil.load
import coil.transform.BlurTransformation
import coil.transform.CircleCropTransformation import coil.transform.CircleCropTransformation
import coil.transform.RoundedCornersTransformation import coil.transform.RoundedCornersTransformation
import kr.co.vividnext.sodalive.R import kr.co.vividnext.sodalive.R
@ -27,7 +28,6 @@ import kr.co.vividnext.sodalive.audio_content.AudioContentActivity
import kr.co.vividnext.sodalive.audio_content.AudioContentAdapter import kr.co.vividnext.sodalive.audio_content.AudioContentAdapter
import kr.co.vividnext.sodalive.audio_content.detail.AudioContentDetailActivity import kr.co.vividnext.sodalive.audio_content.detail.AudioContentDetailActivity
import kr.co.vividnext.sodalive.audio_content.series.GetSeriesListResponse import kr.co.vividnext.sodalive.audio_content.series.GetSeriesListResponse
import kr.co.vividnext.sodalive.audio_content.series.SeriesListAdapter
import kr.co.vividnext.sodalive.audio_content.series.SeriesListAllActivity import kr.co.vividnext.sodalive.audio_content.series.SeriesListAllActivity
import kr.co.vividnext.sodalive.audio_content.series.detail.SeriesDetailActivity import kr.co.vividnext.sodalive.audio_content.series.detail.SeriesDetailActivity
import kr.co.vividnext.sodalive.audio_content.upload.AudioContentUploadActivity import kr.co.vividnext.sodalive.audio_content.upload.AudioContentUploadActivity
@ -831,6 +831,16 @@ class UserProfileActivity : BaseActivity<ActivityUserProfileBinding>(
crossfade(true) crossfade(true)
placeholder(R.drawable.ic_place_holder) placeholder(R.drawable.ic_place_holder)
transformations(RoundedCornersTransformation(4.7f.dpToPx())) transformations(RoundedCornersTransformation(4.7f.dpToPx()))
if (!item.existOrdered) {
transformations(
BlurTransformation(
this@UserProfileActivity,
25f,
2.5f
)
)
}
} }
layout.tvLikeCount.text = "${item.likeCount}" layout.tvLikeCount.text = "${item.likeCount}"

View File

@ -4,6 +4,7 @@ import io.reactivex.rxjava3.core.Single
import kr.co.vividnext.sodalive.audio_content.comment.ModifyCommentRequest import kr.co.vividnext.sodalive.audio_content.comment.ModifyCommentRequest
import kr.co.vividnext.sodalive.common.ApiResponse import kr.co.vividnext.sodalive.common.ApiResponse
import kr.co.vividnext.sodalive.explorer.profile.creator_community.all.PostCommunityPostLikeRequest import kr.co.vividnext.sodalive.explorer.profile.creator_community.all.PostCommunityPostLikeRequest
import kr.co.vividnext.sodalive.explorer.profile.creator_community.all.PurchasePostRequest
import kr.co.vividnext.sodalive.explorer.profile.creator_community.all.comment.CreateCommunityPostCommentRequest import kr.co.vividnext.sodalive.explorer.profile.creator_community.all.comment.CreateCommunityPostCommentRequest
import okhttp3.MultipartBody import okhttp3.MultipartBody
import okhttp3.RequestBody import okhttp3.RequestBody
@ -91,4 +92,10 @@ interface CreatorCommunityApi {
@Query("timezone") timezone: String, @Query("timezone") timezone: String,
@Header("Authorization") authHeader: String @Header("Authorization") authHeader: String
): Single<ApiResponse<GetCommunityPostListResponse>> ): Single<ApiResponse<GetCommunityPostListResponse>>
@POST("/creator-community/purchase")
fun purchaseCommunityPost(
@Body request: PurchasePostRequest,
@Header("Authorization") authHeader: String
): Single<ApiResponse<GetCommunityPostListResponse>>
} }

View File

@ -2,6 +2,7 @@ package kr.co.vividnext.sodalive.explorer.profile.creator_community
import kr.co.vividnext.sodalive.audio_content.comment.ModifyCommentRequest import kr.co.vividnext.sodalive.audio_content.comment.ModifyCommentRequest
import kr.co.vividnext.sodalive.explorer.profile.creator_community.all.PostCommunityPostLikeRequest import kr.co.vividnext.sodalive.explorer.profile.creator_community.all.PostCommunityPostLikeRequest
import kr.co.vividnext.sodalive.explorer.profile.creator_community.all.PurchasePostRequest
import kr.co.vividnext.sodalive.explorer.profile.creator_community.all.comment.CreateCommunityPostCommentRequest import kr.co.vividnext.sodalive.explorer.profile.creator_community.all.comment.CreateCommunityPostCommentRequest
import okhttp3.MultipartBody import okhttp3.MultipartBody
import okhttp3.RequestBody import okhttp3.RequestBody
@ -98,4 +99,9 @@ class CreatorCommunityRepository(private val api: CreatorCommunityApi) {
timezone = TimeZone.getDefault().id, timezone = TimeZone.getDefault().id,
authHeader = token authHeader = token
) )
fun purchaseCommunityPost(postId: Long, token: String) = api.purchaseCommunityPost(
request = PurchasePostRequest(postId = postId, timezone = TimeZone.getDefault().id),
authHeader = token
)
} }

View File

@ -9,10 +9,12 @@ data class GetCommunityPostListResponse(
@SerializedName("creatorProfileUrl") val creatorProfileUrl: String, @SerializedName("creatorProfileUrl") val creatorProfileUrl: String,
@SerializedName("imageUrl") val imageUrl: String?, @SerializedName("imageUrl") val imageUrl: String?,
@SerializedName("content") val content: String, @SerializedName("content") val content: String,
@SerializedName("price") val price: Int,
@SerializedName("date") val date: String, @SerializedName("date") val date: String,
@SerializedName("isCommentAvailable") val isCommentAvailable: Boolean, @SerializedName("isCommentAvailable") val isCommentAvailable: Boolean,
@SerializedName("isAdult") val isAdult: Boolean, @SerializedName("isAdult") val isAdult: Boolean,
@SerializedName("isLike") var isLike: Boolean, @SerializedName("isLike") var isLike: Boolean,
@SerializedName("existOrdered") val existOrdered: Boolean,
@SerializedName("likeCount") val likeCount: Int, @SerializedName("likeCount") val likeCount: Int,
@SerializedName("commentCount") val commentCount: Int, @SerializedName("commentCount") val commentCount: Int,
@SerializedName("firstComment") val firstComment: GetCommunityPostCommentListItem?, @SerializedName("firstComment") val firstComment: GetCommunityPostCommentListItem?,

View File

@ -62,6 +62,7 @@ class CreatorCommunityAllActivity : BaseActivity<ActivityCreatorCommunityAllBind
binding.toolbar.tvBack.setOnClickListener { finish() } binding.toolbar.tvBack.setOnClickListener { finish() }
adapter = CreatorCommunityAllAdapter( adapter = CreatorCommunityAllAdapter(
screenWidth = screenWidth,
onClickLike = { viewModel.communityPostLike(it) }, onClickLike = { viewModel.communityPostLike(it) },
writeComment = { postId, parentId, comment -> writeComment = { postId, parentId, comment ->
viewModel.registerComment( viewModel.registerComment(
@ -111,6 +112,18 @@ class CreatorCommunityAllActivity : BaseActivity<ActivityCreatorCommunityAllBind
reason = it reason = it
) )
}.show(screenWidth) }.show(screenWidth)
},
onClickPurchaseContent = { postId, can, onSuccess ->
PurchaseCommunityPostDialog(
activity = this@CreatorCommunityAllActivity,
layoutInflater = layoutInflater,
can = can,
confirmButtonClick = {
viewModel.purchaseCommunityPost(postId) {
onSuccess(it)
}
}
).show(screenWidth)
} }
) )

View File

@ -11,6 +11,8 @@ import android.text.style.ClickableSpan
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.ImageView
import android.widget.LinearLayout
import android.widget.TextView import android.widget.TextView
import androidx.appcompat.widget.PopupMenu import androidx.appcompat.widget.PopupMenu
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
@ -19,17 +21,22 @@ import coil.transform.CircleCropTransformation
import kr.co.vividnext.sodalive.R import kr.co.vividnext.sodalive.R
import kr.co.vividnext.sodalive.common.SharedPreferenceManager import kr.co.vividnext.sodalive.common.SharedPreferenceManager
import kr.co.vividnext.sodalive.databinding.ItemCreatorCommunityAllBinding import kr.co.vividnext.sodalive.databinding.ItemCreatorCommunityAllBinding
import kr.co.vividnext.sodalive.explorer.profile.creator_community.GetCommunityPostCommentListItem
import kr.co.vividnext.sodalive.explorer.profile.creator_community.GetCommunityPostListResponse import kr.co.vividnext.sodalive.explorer.profile.creator_community.GetCommunityPostListResponse
import kr.co.vividnext.sodalive.extensions.dpToPx
import kr.co.vividnext.sodalive.extensions.loadUrl import kr.co.vividnext.sodalive.extensions.loadUrl
import java.util.regex.Pattern import java.util.regex.Pattern
class CreatorCommunityAllAdapter( class CreatorCommunityAllAdapter(
private val screenWidth: Int,
private val onClickLike: (Long) -> Unit, private val onClickLike: (Long) -> Unit,
private val writeComment: (Long, Long?, String) -> Unit, private val writeComment: (Long, Long?, String) -> Unit,
private val showCommentBottomSheetDialog: (Long) -> Unit, private val showCommentBottomSheetDialog: (Long) -> Unit,
private val onClickModify: (Long) -> Unit, private val onClickModify: (Long) -> Unit,
private val onClickDelete: (Long) -> Unit, private val onClickDelete: (Long) -> Unit,
private val onClickReport: (Long) -> Unit private val onClickReport: (Long) -> Unit,
private val onClickPurchaseContent:
(Long, Int, onSuccess: (GetCommunityPostListResponse) -> Unit) -> Unit
) : RecyclerView.Adapter<CreatorCommunityAllAdapter.ViewHolder>() { ) : RecyclerView.Adapter<CreatorCommunityAllAdapter.ViewHolder>() {
val items = mutableListOf<GetCommunityPostListResponse>() val items = mutableListOf<GetCommunityPostListResponse>()
@ -38,7 +45,7 @@ class CreatorCommunityAllAdapter(
private val context: Context, private val context: Context,
private val binding: ItemCreatorCommunityAllBinding private val binding: ItemCreatorCommunityAllBinding
) : RecyclerView.ViewHolder(binding.root) { ) : RecyclerView.ViewHolder(binding.root) {
@SuppressLint("NotifyDataSetChanged") @SuppressLint("NotifyDataSetChanged", "SetTextI18n")
fun bind(item: GetCommunityPostListResponse, index: Int) { fun bind(item: GetCommunityPostListResponse, index: Int) {
binding.tvDate.text = item.date binding.tvDate.text = item.date
binding.tvNickname.text = item.creatorNickname binding.tvNickname.text = item.creatorNickname
@ -48,19 +55,41 @@ class CreatorCommunityAllAdapter(
transformations(CircleCropTransformation()) transformations(CircleCropTransformation())
} }
setNoticeAndClickableUrl(binding.tvContent, item.content) if (item.price > 0) {
binding.tvContent.setOnClickListener { if (item.existOrdered) {
items[index] = items[index].copy( setContent(item, index)
isExpand = !item.isExpand, } else {
) binding.llLike.visibility = View.GONE
notifyDataSetChanged() binding.tvContent.visibility = View.GONE
} binding.ivContent.visibility = View.GONE
binding.tvContent.maxLines = if (item.isExpand) { binding.llComment.visibility = View.GONE
Int.MAX_VALUE binding.ivSeeMore.visibility = View.GONE
} else { binding.llLockPost.visibility = View.VISIBLE
3
}
val lockPostWidth = (screenWidth - 42f.dpToPx()).toInt()
val lp = binding.llLockPost.layoutParams as LinearLayout.LayoutParams
lp.width = lockPostWidth
lp.height = lockPostWidth
binding.llLockPost.layoutParams = lp
binding.tvPurchase.text = "${item.price}캔으로 게시글 보기"
binding.tvPurchase.setOnClickListener {
onClickPurchaseContent(item.postId, item.price) { post ->
items[index] = post
setContent(post, index)
}
}
}
} else {
setContent(item, index)
}
}
private fun setContent(item: GetCommunityPostListResponse, index: Int) {
binding.llLockPost.visibility = View.GONE
binding.llLike.visibility = View.VISIBLE
binding.llComment.visibility = View.VISIBLE
binding.ivSeeMore.visibility = View.VISIBLE
binding.ivSeeMore.setOnClickListener { binding.ivSeeMore.setOnClickListener {
showOptionMenu( showOptionMenu(
context = context, context = context,
@ -70,55 +99,54 @@ class CreatorCommunityAllAdapter(
) )
} }
binding.ivLike.setImageResource( setImageContent(binding.ivContent, item.imageUrl)
if (item.isLike) { setContentLike(item.isLike, item.likeCount, item.postId, index)
R.drawable.ic_audio_content_heart_pressed setNoticeAndClickableUrl(binding.tvContent, item.content, item.isExpand, index)
} else { setContentComment(
R.drawable.ic_audio_content_heart_normal item.postId,
} item.commentCount,
item.isCommentAvailable,
comment = item.firstComment
) )
}
binding.tvLike.text = "${item.likeCount}" private fun setImageContent(ivContent: ImageView, imageUrl: String?) {
binding.llLike.setOnClickListener { ivContent.visibility = View.VISIBLE
val isLike = !item.isLike if (imageUrl != null) {
ivContent.visibility = View.VISIBLE
items[index] = items[index].copy( ivContent.loadUrl(imageUrl) {
isLike = !item.isLike,
likeCount = if (isLike) item.likeCount + 1 else item.likeCount - 1
)
notifyDataSetChanged()
onClickLike(item.postId)
}
if (item.imageUrl != null) {
binding.ivContent.visibility = View.VISIBLE
binding.ivContent.loadUrl(item.imageUrl) {
crossfade(true) crossfade(true)
placeholder(R.drawable.bg_placeholder) placeholder(R.drawable.bg_placeholder)
} }
} else { } else {
binding.ivContent.visibility = View.GONE ivContent.visibility = View.GONE
} }
}
if (item.isCommentAvailable) { private fun setContentComment(
postId: Long,
commentCount: Int,
isCommentAvailable: Boolean,
comment: GetCommunityPostCommentListItem?
) {
if (isCommentAvailable) {
binding.llComment.visibility = View.VISIBLE binding.llComment.visibility = View.VISIBLE
binding.tvCommentCount.text = "${item.commentCount}" binding.tvCommentCount.text = "$commentCount"
} else { } else {
binding.llComment.visibility = View.GONE binding.llComment.visibility = View.GONE
} }
if (item.commentCount > 0) { if (commentCount > 0 && comment != null) {
binding.ivCommentProfile.load(item.firstComment!!.profileUrl) { binding.ivCommentProfile.load(comment.profileUrl) {
crossfade(true) crossfade(true)
placeholder(R.drawable.bg_placeholder) placeholder(R.drawable.bg_placeholder)
transformations(CircleCropTransformation()) transformations(CircleCropTransformation())
} }
binding.tvCommentText.text = item.firstComment.comment binding.tvCommentText.text = comment.comment
binding.tvCommentText.visibility = View.VISIBLE binding.tvCommentText.visibility = View.VISIBLE
binding.rlInputComment.visibility = View.GONE binding.rlInputComment.visibility = View.GONE
binding.llComment.setOnClickListener { showCommentBottomSheetDialog(item.postId) } binding.llComment.setOnClickListener { showCommentBottomSheetDialog(postId) }
} else { } else {
binding.tvCommentText.visibility = View.GONE binding.tvCommentText.visibility = View.GONE
binding.rlInputComment.visibility = View.VISIBLE binding.rlInputComment.visibility = View.VISIBLE
@ -129,16 +157,45 @@ class CreatorCommunityAllAdapter(
} }
binding.ivCommentSend.setOnClickListener { binding.ivCommentSend.setOnClickListener {
val comment = binding.etComment.text.toString() val inputComment = binding.etComment.text.toString()
binding.etComment.setText("") binding.etComment.setText("")
writeComment(item.postId, null, comment) writeComment(postId, null, inputComment)
} }
binding.llComment.setOnClickListener {} binding.llComment.setOnClickListener {}
} }
} }
private fun setNoticeAndClickableUrl(textView: TextView, text: String) { @SuppressLint("NotifyDataSetChanged")
private fun setContentLike(isLike: Boolean, likeCount: Int, postId: Long, index: Int) {
binding.ivLike.setImageResource(
if (isLike) {
R.drawable.ic_audio_content_heart_pressed
} else {
R.drawable.ic_audio_content_heart_normal
}
)
binding.tvLike.text = "$likeCount"
binding.llLike.setOnClickListener {
items[index] = items[index].copy(
isLike = !isLike,
likeCount = if (!isLike) likeCount + 1 else likeCount - 1
)
notifyDataSetChanged()
onClickLike(postId)
}
}
@SuppressLint("NotifyDataSetChanged")
private fun setNoticeAndClickableUrl(
textView: TextView,
text: String,
isExpand: Boolean,
index: Int
) {
textView.visibility = View.VISIBLE
textView.text = text textView.text = text
val spannable = SpannableString(text) val spannable = SpannableString(text)
@ -159,6 +216,19 @@ class CreatorCommunityAllAdapter(
textView.text = spannable textView.text = spannable
textView.movementMethod = LinkMovementMethod.getInstance() textView.movementMethod = LinkMovementMethod.getInstance()
textView.setOnClickListener {
items[index] = items[index].copy(
isExpand = !isExpand,
)
notifyDataSetChanged()
}
textView.maxLines = if (isExpand) {
Int.MAX_VALUE
} else {
3
}
} }
} }

View File

@ -220,4 +220,41 @@ class CreatorCommunityAllViewModel(
) )
) )
} }
fun purchaseCommunityPost(postId: Long, onSuccess: (GetCommunityPostListResponse) -> Unit) {
if (!_isLoading.value!!) {
_isLoading.value = true
compositeDisposable.add(
repository
.purchaseCommunityPost(
postId = postId,
token = "Bearer ${SharedPreferenceManager.token}"
)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
{
if (it.success && it.data != null) {
onSuccess(it.data)
} else {
if (it.message != null) {
_toastLiveData.postValue(it.message)
} else {
_toastLiveData.postValue(
"알 수 없는 오류가 발생했습니다. 다시 시도해 주세요."
)
}
}
_isLoading.value = false
},
{
_isLoading.value = false
it.message?.let { message -> Logger.e(message) }
_toastLiveData.postValue("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.")
}
)
)
}
}
} }

View File

@ -0,0 +1,51 @@
package kr.co.vividnext.sodalive.explorer.profile.creator_community.all
import android.annotation.SuppressLint
import android.app.Activity
import android.graphics.Color
import android.graphics.drawable.ColorDrawable
import android.view.LayoutInflater
import android.view.WindowManager
import androidx.appcompat.app.AlertDialog
import kr.co.vividnext.sodalive.databinding.DialogPurchaseCommunityPostBinding
import kr.co.vividnext.sodalive.extensions.dpToPx
import kr.co.vividnext.sodalive.extensions.moneyFormat
@SuppressLint("SetTextI18n")
class PurchaseCommunityPostDialog(
activity: Activity,
layoutInflater: LayoutInflater,
can: Int,
confirmButtonClick: () -> Unit,
) {
private val alertDialog: AlertDialog
val dialogView = DialogPurchaseCommunityPostBinding.inflate(layoutInflater)
init {
val dialogBuilder = AlertDialog.Builder(activity)
dialogBuilder.setView(dialogView.root)
alertDialog = dialogBuilder.create()
alertDialog.setCancelable(false)
alertDialog.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
dialogView.tvCan.text = "${can.moneyFormat()}캔으로 보기"
dialogView.tvCan.setOnClickListener {
alertDialog.dismiss()
confirmButtonClick()
}
dialogView.tvCancel.setOnClickListener { alertDialog.dismiss() }
}
fun show(width: Int) {
alertDialog.show()
val lp = WindowManager.LayoutParams()
lp.copyFrom(alertDialog.window?.attributes)
lp.width = width - (26.7f.dpToPx()).toInt()
lp.height = WindowManager.LayoutParams.WRAP_CONTENT
alertDialog.window?.attributes = lp
}
}

View File

@ -0,0 +1,9 @@
package kr.co.vividnext.sodalive.explorer.profile.creator_community.all
import com.google.gson.annotations.SerializedName
data class PurchasePostRequest(
@SerializedName("postId") val postId: Long,
@SerializedName("timezone") val timezone: String,
@SerializedName("container") val container: String = "aos",
)

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

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

View File

@ -0,0 +1,79 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="@drawable/bg_round_corner_10_13181b">
<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="40dp"
android:fontFamily="@font/gmarket_sans_bold"
android:gravity="center"
android:text="게시글 보기"
android:textColor="@color/color_bbbbbb"
android:textSize="18.3sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/tv_desc"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginHorizontal="13.3dp"
android:layout_marginTop="13.3dp"
android:fontFamily="@font/gmarket_sans_medium"
android:gravity="center"
android:text="게시글을\n확인하시겠습니까?"
android:textColor="@color/color_bbbbbb"
android:textSize="15sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tv_title" />
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16.7dp"
android:layout_marginTop="35dp"
android:layout_marginBottom="16.7dp"
android:gravity="center"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tv_desc">
<TextView
android:id="@+id/tv_cancel"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="13.3dp"
android:layout_weight="1"
android:background="@drawable/bg_round_corner_10_13181b_3bb9f1"
android:fontFamily="@font/gmarket_sans_bold"
android:gravity="center"
android:paddingVertical="16dp"
android:text="취소"
android:textColor="@color/color_3bb9f1"
android:textSize="18.3sp" />
<TextView
android:id="@+id/tv_can"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:background="@drawable/bg_round_corner_10_3bb9f1"
android:paddingVertical="16dp"
android:fontFamily="@font/gmarket_sans_bold"
android:gravity="center"
android:textColor="@color/white"
android:textSize="18.3sp"
tools:text="100캔으로 보기" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -69,6 +69,7 @@
android:layout_width="53.3dp" android:layout_width="53.3dp"
android:layout_height="53.3dp" android:layout_height="53.3dp"
android:layout_alignParentEnd="true" android:layout_alignParentEnd="true"
android:scaleType="centerCrop"
android:contentDescription="@null" /> android:contentDescription="@null" />
</RelativeLayout> </RelativeLayout>

View File

@ -57,7 +57,8 @@
android:layout_centerVertical="true" android:layout_centerVertical="true"
android:layout_marginEnd="8.3dp" android:layout_marginEnd="8.3dp"
android:contentDescription="@null" android:contentDescription="@null"
android:src="@drawable/ic_seemore_vertical" /> android:src="@drawable/ic_seemore_vertical"
android:visibility="gone" />
</RelativeLayout> </RelativeLayout>
<TextView <TextView
@ -71,6 +72,7 @@
android:maxLines="3" android:maxLines="3"
android:textColor="@color/color_bbbbbb" android:textColor="@color/color_bbbbbb"
android:textSize="13.3sp" android:textSize="13.3sp"
android:visibility="gone"
tools:text="너무 조하유 앞으로도 좋은 라이브 많이 들려주세요!너무 조하유 앞으로도 좋은 라이브 많이 들려주세요!너무 조하유 앞으로도 좋은 라이브 많이 들려주세요!너무 조하유 앞으로도 좋은 라이브 많이 들려주세요!너무 조하유 앞으로도 좋은 라이브 많이 들려주세요!너무 조하유 앞으로도 좋은 라이브 많이 들려주세요!너무 조하유 앞으로도 좋은 라이브 많이 들려주세요!너무 조하유 앞으로도 좋은 라이브 많이 들려주세요!너무 조하유 앞으로도 좋은 라이브 많이 들려주세요!너무 조하유 앞으로도 좋은 라이브 많이 들려주세요!너무 조하유 앞으로도 좋은 라이브 많이 들려주세요!너무 조하유 앞으로도 좋은 라이브 많이 들려주세요!" /> tools:text="너무 조하유 앞으로도 좋은 라이브 많이 들려주세요!너무 조하유 앞으로도 좋은 라이브 많이 들려주세요!너무 조하유 앞으로도 좋은 라이브 많이 들려주세요!너무 조하유 앞으로도 좋은 라이브 많이 들려주세요!너무 조하유 앞으로도 좋은 라이브 많이 들려주세요!너무 조하유 앞으로도 좋은 라이브 많이 들려주세요!너무 조하유 앞으로도 좋은 라이브 많이 들려주세요!너무 조하유 앞으로도 좋은 라이브 많이 들려주세요!너무 조하유 앞으로도 좋은 라이브 많이 들려주세요!너무 조하유 앞으로도 좋은 라이브 많이 들려주세요!너무 조하유 앞으로도 좋은 라이브 많이 들려주세요!너무 조하유 앞으로도 좋은 라이브 많이 들려주세요!" />
<ImageView <ImageView
@ -80,7 +82,8 @@
android:layout_marginTop="13.3dp" android:layout_marginTop="13.3dp"
android:adjustViewBounds="true" android:adjustViewBounds="true"
android:contentDescription="@null" android:contentDescription="@null"
android:scaleType="fitCenter" /> android:scaleType="fitCenter"
android:visibility="gone" />
<LinearLayout <LinearLayout
android:id="@+id/ll_like" android:id="@+id/ll_like"
@ -92,6 +95,7 @@
android:orientation="horizontal" android:orientation="horizontal"
android:paddingHorizontal="13.3dp" android:paddingHorizontal="13.3dp"
android:paddingVertical="5.3dp" android:paddingVertical="5.3dp"
android:visibility="gone"
tools:ignore="UselessParent"> tools:ignore="UselessParent">
<ImageView <ImageView
@ -209,4 +213,34 @@
tools:text="너무 좋아요!!! 너무 좋아요!!! 너무 좋아요!!! 너무 좋아요!!! 너무 좋아요!!! 너무 좋아요!!!" /> tools:text="너무 좋아요!!! 너무 좋아요!!! 너무 좋아요!!! 너무 좋아요!!! 너무 좋아요!!! 너무 좋아요!!!" />
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>
<LinearLayout
android:id="@+id/ll_lock_post"
android:layout_width="match_parent"
android:layout_height="318dp"
android:layout_marginTop="13.3dp"
android:background="@drawable/bg_round_corner_5_3_333333"
android:gravity="center"
android:layout_gravity="center"
android:orientation="vertical"
android:visibility="visible">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@null"
android:src="@drawable/ic_lock_bb" />
<TextView
android:id="@+id/tv_purchase"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="26.7dp"
android:background="@drawable/bg_round_corner_26_7_transparent_3bb9f1"
android:fontFamily="@font/gmarket_sans_bold"
android:paddingHorizontal="21dp"
android:paddingVertical="11dp"
android:textColor="@color/color_3bb9f1"
tools:text="5캔으로 게시물 보기" />
</LinearLayout>
</LinearLayout> </LinearLayout>