From 7bc331f2d2d4a6f5f09643b9363695f3bde90541 Mon Sep 17 00:00:00 2001 From: m6z1 Date: Sat, 10 Jan 2026 16:58:52 +0900 Subject: [PATCH 1/8] =?UTF-8?q?feat:=20=ED=94=BC=EB=93=9C=20=EB=8B=A8?= =?UTF-8?q?=EA=B1=B4=20=EC=A1=B0=ED=9A=8C=20api=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../into/websoso/data/mapper/FeedMapper.kt | 32 ++++++++++------ .../websoso/data/model/FeedDetailEntity.kt | 38 +++++++++++++++++++ .../remote/response/FeedDetailResponseDto.kt | 10 +++++ 3 files changed, 68 insertions(+), 12 deletions(-) create mode 100644 app/src/main/java/com/into/websoso/data/model/FeedDetailEntity.kt diff --git a/app/src/main/java/com/into/websoso/data/mapper/FeedMapper.kt b/app/src/main/java/com/into/websoso/data/mapper/FeedMapper.kt index a427ad387..047c182b3 100644 --- a/app/src/main/java/com/into/websoso/data/mapper/FeedMapper.kt +++ b/app/src/main/java/com/into/websoso/data/mapper/FeedMapper.kt @@ -2,9 +2,10 @@ package com.into.websoso.data.mapper import com.into.websoso.data.model.CommentEntity import com.into.websoso.data.model.CommentsEntity +import com.into.websoso.data.model.FeedDetailEntity +import com.into.websoso.data.model.FeedDetailEntity.NovelEntity +import com.into.websoso.data.model.FeedDetailEntity.UserEntity import com.into.websoso.data.model.FeedEntity -import com.into.websoso.data.model.FeedEntity.NovelEntity -import com.into.websoso.data.model.FeedEntity.UserEntity import com.into.websoso.data.model.FeedsEntity import com.into.websoso.data.model.PopularFeedsEntity import com.into.websoso.data.model.UserInterestFeedsEntity @@ -25,7 +26,7 @@ fun FeedsResponseDto.toData(): FeedsEntity = fun FeedResponseDto.toData(): FeedEntity = FeedEntity( - user = UserEntity( + user = FeedEntity.UserEntity( id = userId, nickname = nickname, avatarImage = avatarImage, @@ -43,7 +44,7 @@ fun FeedResponseDto.toData(): FeedEntity = isPublic = isPublic, images = thumbnailUrl?.let { listOf(it) } ?: emptyList(), imageCount = imageCount, - novel = NovelEntity( + novel = FeedEntity.NovelEntity( id = novelId, title = title, rating = novelRating, @@ -74,8 +75,8 @@ fun CommentResponseDto.toData(): CommentEntity = isSpoiler = isSpoiler, ) -fun FeedDetailResponseDto.toData(): FeedEntity = - FeedEntity( +fun FeedDetailResponseDto.toData(): FeedDetailEntity = + FeedDetailEntity( user = UserEntity( id = userId, nickname = nickname, @@ -94,12 +95,19 @@ fun FeedDetailResponseDto.toData(): FeedEntity = isPublic = isPublic, images = images, imageCount = images.size, - novel = NovelEntity( - id = novelId, - title = title, - rating = novelRating, - ratingCount = novelRatingCount, - ), + novel = novelId?.let { id -> + NovelEntity( + id = id, + title = title.orEmpty(), + rating = novelRating ?: 0.0f, + ratingCount = novelRatingCount ?: 0, + thumbnail = novelThumbnailImage.orEmpty(), + genre = novelGenre.orEmpty(), + author = novelAuthor.orEmpty(), + description = novelDescription.orEmpty(), + feedWriterNovelRating = feedWriterNovelRating ?: 0.0f, + ) + }, ) fun PopularFeedsResponseDto.toData(): PopularFeedsEntity = diff --git a/app/src/main/java/com/into/websoso/data/model/FeedDetailEntity.kt b/app/src/main/java/com/into/websoso/data/model/FeedDetailEntity.kt new file mode 100644 index 000000000..bd24a338f --- /dev/null +++ b/app/src/main/java/com/into/websoso/data/model/FeedDetailEntity.kt @@ -0,0 +1,38 @@ +package com.into.websoso.data.model + +data class FeedDetailEntity( + val user: UserEntity, + val createdDate: String, + val id: Long, + val content: String, + val relevantCategories: List, + val likeCount: Int, + val isLiked: Boolean, + val commentCount: Int, + val isModified: Boolean, + val isSpoiler: Boolean, + val isMyFeed: Boolean, + val isPublic: Boolean, + val novel: NovelEntity?, + val images: List, + val imageCount: Int, +) { + data class UserEntity( + val id: Long, + val nickname: String, + val avatarImage: String, + ) + + data class NovelEntity( + val id: Long, + val title: String, + val rating: Float, + val ratingCount: Int, + val thumbnail: String, + val genre: String, + val author: String, + val description: String, + val feedWriterNovelRating: Float, + ) +} + diff --git a/app/src/main/java/com/into/websoso/data/remote/response/FeedDetailResponseDto.kt b/app/src/main/java/com/into/websoso/data/remote/response/FeedDetailResponseDto.kt index d1debb1f4..30e10422c 100644 --- a/app/src/main/java/com/into/websoso/data/remote/response/FeedDetailResponseDto.kt +++ b/app/src/main/java/com/into/websoso/data/remote/response/FeedDetailResponseDto.kt @@ -43,4 +43,14 @@ data class FeedDetailResponseDto( val isPublic: Boolean, @SerialName("images") val images: List, + @SerialName("novelThumbnailImage") + val novelThumbnailImage: String?, + @SerialName("novelGenre") + val novelGenre: String?, + @SerialName("novelAuthor") + val novelAuthor: String?, + @SerialName("feedWriterNovelRating") + val feedWriterNovelRating: Float?, + @SerialName("novelDescription") + val novelDescription: String?, ) From 0e974d33c0a0dc3ae5441a6b949e94bae7bff8e4 Mon Sep 17 00:00:00 2001 From: m6z1 Date: Sat, 10 Jan 2026 17:11:22 +0900 Subject: [PATCH 2/8] =?UTF-8?q?feat:=20=ED=94=BC=EB=93=9C=20=EB=8B=A8?= =?UTF-8?q?=EA=B1=B4=20=EC=A1=B0=ED=9A=8C=20model=20=EC=A0=95=EC=9D=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../into/websoso/data/mapper/FeedMapper.kt | 2 +- .../websoso/data/repository/FeedRepository.kt | 3 +- .../ui/feedDetail/FeedDetailViewModel.kt | 19 +++++----- .../ui/feedDetail/model/FeedDetailModel.kt | 2 + .../com/into/websoso/ui/mapper/FeedMapper.kt | 37 +++++++++++++++++++ 5 files changed, 52 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/com/into/websoso/data/mapper/FeedMapper.kt b/app/src/main/java/com/into/websoso/data/mapper/FeedMapper.kt index 047c182b3..8568d4fa2 100644 --- a/app/src/main/java/com/into/websoso/data/mapper/FeedMapper.kt +++ b/app/src/main/java/com/into/websoso/data/mapper/FeedMapper.kt @@ -60,7 +60,7 @@ fun CommentsResponseDto.toData(): CommentsEntity = fun CommentResponseDto.toData(): CommentEntity = CommentEntity( - user = UserEntity( + user = FeedEntity.UserEntity( id = userId, nickname = nickname, avatarImage = avatarImage, diff --git a/app/src/main/java/com/into/websoso/data/repository/FeedRepository.kt b/app/src/main/java/com/into/websoso/data/repository/FeedRepository.kt index a68f7bff0..69e1c89fb 100644 --- a/app/src/main/java/com/into/websoso/data/repository/FeedRepository.kt +++ b/app/src/main/java/com/into/websoso/data/repository/FeedRepository.kt @@ -6,6 +6,7 @@ import com.into.websoso.data.library.datasource.LibraryLocalDataSource import com.into.websoso.data.mapper.MultiPartMapper import com.into.websoso.data.mapper.toData import com.into.websoso.data.model.CommentsEntity +import com.into.websoso.data.model.FeedDetailEntity import com.into.websoso.data.model.FeedEntity import com.into.websoso.data.model.FeedsEntity import com.into.websoso.data.model.PopularFeedsEntity @@ -125,7 +126,7 @@ class FeedRepository } } - suspend fun fetchFeed(feedId: Long): FeedEntity = feedApi.getFeed(feedId).toData() + suspend fun fetchFeed(feedId: Long): FeedDetailEntity = feedApi.getFeed(feedId).toData() suspend fun fetchPopularFeeds(): PopularFeedsEntity = feedApi.getPopularFeeds().toData() diff --git a/app/src/main/java/com/into/websoso/ui/feedDetail/FeedDetailViewModel.kt b/app/src/main/java/com/into/websoso/ui/feedDetail/FeedDetailViewModel.kt index 743ad2564..e34481ff7 100644 --- a/app/src/main/java/com/into/websoso/ui/feedDetail/FeedDetailViewModel.kt +++ b/app/src/main/java/com/into/websoso/ui/feedDetail/FeedDetailViewModel.kt @@ -6,7 +6,7 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.into.websoso.core.common.ui.model.ResultFrom import com.into.websoso.data.model.CommentsEntity -import com.into.websoso.data.model.FeedEntity +import com.into.websoso.data.model.FeedDetailEntity import com.into.websoso.data.model.MyProfileEntity import com.into.websoso.data.repository.FeedRepository import com.into.websoso.data.repository.NotificationRepository @@ -62,21 +62,21 @@ class FeedDetailViewModel } }.onSuccess { result -> val myProfile = result[0] as MyProfileEntity - val feed = (result[1] as FeedEntity) + val feedDetail = (result[1] as FeedDetailEntity) val comments = result[2] as CommentsEntity - val uiFeed = feed.toUi() - val updatedFeed = if (feed.isLiked == isLiked) { + val uiFeed = feedDetail.toUi().feed + val updatedFeed = if (feedDetail.isLiked == isLiked) { uiFeed - } else if (!isLiked && feed.isLiked) { - uiFeed.copy( + } else if (!isLiked && feedDetail.isLiked) { + uiFeed?.copy( isLiked = false, - likeCount = feed.likeCount - 1, + likeCount = feedDetail.likeCount - 1, ) } else { - uiFeed.copy( + uiFeed?.copy( isLiked = true, - likeCount = feed.likeCount + 1, + likeCount = feedDetail.likeCount + 1, ) } @@ -89,6 +89,7 @@ class FeedDetailViewModel user = FeedDetailModel.UserModel( avatarImage = myProfile.avatarImage, ), + novel = feedDetail.novel, ), ) }.onFailure { diff --git a/app/src/main/java/com/into/websoso/ui/feedDetail/model/FeedDetailModel.kt b/app/src/main/java/com/into/websoso/ui/feedDetail/model/FeedDetailModel.kt index 679eb1de9..154388e88 100644 --- a/app/src/main/java/com/into/websoso/ui/feedDetail/model/FeedDetailModel.kt +++ b/app/src/main/java/com/into/websoso/ui/feedDetail/model/FeedDetailModel.kt @@ -1,11 +1,13 @@ package com.into.websoso.ui.feedDetail.model +import com.into.websoso.data.model.FeedDetailEntity import com.into.websoso.ui.main.feed.model.FeedModel data class FeedDetailModel( val feed: FeedModel? = null, val comments: List = emptyList(), val user: UserModel? = null, + val novel: FeedDetailEntity.NovelEntity? = null, ) { data class UserModel( val avatarImage: String, diff --git a/app/src/main/java/com/into/websoso/ui/mapper/FeedMapper.kt b/app/src/main/java/com/into/websoso/ui/mapper/FeedMapper.kt index 04b8d92fd..5df34250a 100644 --- a/app/src/main/java/com/into/websoso/ui/mapper/FeedMapper.kt +++ b/app/src/main/java/com/into/websoso/ui/mapper/FeedMapper.kt @@ -1,9 +1,11 @@ package com.into.websoso.ui.mapper import com.into.websoso.data.model.CommentEntity +import com.into.websoso.data.model.FeedDetailEntity import com.into.websoso.data.model.FeedEntity import com.into.websoso.domain.model.Feed import com.into.websoso.ui.feedDetail.model.CommentModel +import com.into.websoso.ui.feedDetail.model.FeedDetailModel import com.into.websoso.ui.main.feed.model.FeedModel import com.into.websoso.ui.main.feed.model.FeedModel.NovelModel import com.into.websoso.ui.main.feed.model.FeedModel.UserModel @@ -80,3 +82,38 @@ fun CommentEntity.toUi(): CommentModel = isSpoiler = isSpoiler, isBlocked = isBlocked, ) + +fun FeedDetailEntity.toUi(): FeedDetailModel = + FeedDetailModel( + feed = FeedModel( + user = UserModel( + id = user.id, + nickname = user.nickname, + avatarImage = user.avatarImage, + ), + createdDate = createdDate, + id = id, + content = content, + relevantCategories = relevantCategories, + likeCount = likeCount, + commentCount = commentCount, + isModified = isModified, + isSpoiler = isSpoiler, + isLiked = isLiked, + isMyFeed = isMyFeed, + isPublic = isPublic, + imageUrls = images, + imageCount = imageCount, + novel = NovelModel( + id = novel?.id, + title = novel?.title, + rating = novel?.rating, + ratingCount = novel?.ratingCount, + ), + ), + comments = emptyList(), + user = FeedDetailModel.UserModel( + avatarImage = user.avatarImage, + ), + novel = novel, + ) From 6ea774c29a0699739d8f0fee7816b7ae9738c272 Mon Sep 17 00:00:00 2001 From: m6z1 Date: Sat, 10 Jan 2026 18:12:43 +0900 Subject: [PATCH 3/8] =?UTF-8?q?feat:=20=EC=88=98=EC=A0=95=EB=90=9C=20ui=20?= =?UTF-8?q?=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/common/util/BindingAdapter.kt | 4 +- .../ui/feedDetail/FeedDetailActivity.kt | 20 +- .../feedDetail/adapter/FeedDetailAdapter.kt | 9 +- .../adapter/FeedDetailContentViewHolder.kt | 15 +- .../ui/feedDetail/adapter/FeedDetailType.kt | 4 +- .../ui/feedDetail/model/FeedDetailModel.kt | 7 + .../into/websoso/ui/feedDetail/model/Genre.kt | 27 +++ .../main/res/drawable/btn_feed_novel_info.xml | 4 +- app/src/main/res/drawable/ic_bl.xml | 23 +++ app/src/main/res/drawable/ic_drama.xml | 20 ++ app/src/main/res/drawable/ic_fantasy.xml | 16 ++ .../drawable/ic_feed_detail_novel_star.xml | 9 + .../drawable/ic_feed_detail_writer_star.xml | 9 + app/src/main/res/drawable/ic_hf.xml | 16 ++ app/src/main/res/drawable/ic_ln.xml | 20 ++ app/src/main/res/drawable/ic_mystery.xml | 20 ++ app/src/main/res/drawable/ic_romance.xml | 23 +++ .../main/res/drawable/ic_romance_fantasy.xml | 16 ++ app/src/main/res/drawable/ic_wuxia.xml | 16 ++ app/src/main/res/layout/item_feed.xml | 20 +- .../res/layout/item_feed_detail_header.xml | 193 ++++++++++++------ core/resource/src/main/res/values/strings.xml | 2 +- 22 files changed, 405 insertions(+), 88 deletions(-) create mode 100644 app/src/main/java/com/into/websoso/ui/feedDetail/model/Genre.kt create mode 100644 app/src/main/res/drawable/ic_bl.xml create mode 100644 app/src/main/res/drawable/ic_drama.xml create mode 100644 app/src/main/res/drawable/ic_fantasy.xml create mode 100644 app/src/main/res/drawable/ic_feed_detail_novel_star.xml create mode 100644 app/src/main/res/drawable/ic_feed_detail_writer_star.xml create mode 100644 app/src/main/res/drawable/ic_hf.xml create mode 100644 app/src/main/res/drawable/ic_ln.xml create mode 100644 app/src/main/res/drawable/ic_mystery.xml create mode 100644 app/src/main/res/drawable/ic_romance.xml create mode 100644 app/src/main/res/drawable/ic_romance_fantasy.xml create mode 100644 app/src/main/res/drawable/ic_wuxia.xml diff --git a/app/src/main/java/com/into/websoso/core/common/util/BindingAdapter.kt b/app/src/main/java/com/into/websoso/core/common/util/BindingAdapter.kt index c5d8c4023..3e5fbaf21 100644 --- a/app/src/main/java/com/into/websoso/core/common/util/BindingAdapter.kt +++ b/app/src/main/java/com/into/websoso/core/common/util/BindingAdapter.kt @@ -12,15 +12,17 @@ import jp.wasabeef.transformers.coil.BlurTransformation object BindingAdapter { @JvmStatic - @BindingAdapter("loads3ImageUrl") + @BindingAdapter(value = ["loads3ImageUrl", "cornerRadius"], requireAll = false) fun loadS3ImageUrl( view: ImageView, s3ImageKey: String, + cornerRadius: Float?, ) { val fullUrl: String = view.getS3ImageUrl(s3ImageKey) view.load(fullUrl) { error(img_loading_thumbnail) + if (cornerRadius != null) transformations(RoundedCornersTransformation(cornerRadius.toFloatPxFromDp())) } } diff --git a/app/src/main/java/com/into/websoso/ui/feedDetail/FeedDetailActivity.kt b/app/src/main/java/com/into/websoso/ui/feedDetail/FeedDetailActivity.kt index 23215fd7d..02e0fef10 100644 --- a/app/src/main/java/com/into/websoso/ui/feedDetail/FeedDetailActivity.kt +++ b/app/src/main/java/com/into/websoso/ui/feedDetail/FeedDetailActivity.kt @@ -337,19 +337,21 @@ class FeedDetailActivity : BaseActivity(activity_feed noinline event: () -> Unit, ) { when (Dialog::class) { - DialogRemovePopupMenuBinding::class -> + DialogRemovePopupMenuBinding::class -> { FeedRemoveDialogFragment .newInstance( menuType = menuType ?: throw IllegalArgumentException(), event = { event() }, ).show(supportFragmentManager, FeedRemoveDialogFragment.TAG) + } - DialogReportPopupMenuBinding::class -> + DialogReportPopupMenuBinding::class -> { FeedReportDialogFragment .newInstance( menuType = menuType ?: throw IllegalArgumentException(), event = { event() }, ).show(supportFragmentManager, FeedReportDialogFragment.TAG) + } } } @@ -371,7 +373,9 @@ class FeedDetailActivity : BaseActivity(activity_feed NovelDetailBack.RESULT_OK, CreateFeed.RESULT_OK, OtherUserProfileBack.RESULT_OK, - -> feedDetailViewModel.updateFeedDetail(feedId, CreateFeed) + -> { + feedDetailViewModel.updateFeedDetail(feedId, CreateFeed) + } BlockUser.RESULT_OK -> { val nickname = result.data?.getStringExtra(USER_NICKNAME).orEmpty() @@ -482,18 +486,22 @@ class FeedDetailActivity : BaseActivity(activity_feed private fun setupObserver() { feedDetailViewModel.feedDetailUiState.observe(this) { feedDetailUiState -> when { - feedDetailUiState.loading -> binding.wllFeed.setWebsosoLoadingVisibility(true) + feedDetailUiState.loading -> { + binding.wllFeed.setWebsosoLoadingVisibility(true) + } + feedDetailUiState.error -> { binding.wllFeed.setLoadingLayoutVisibility(false) when (feedDetailUiState.previousStack.from) { - CreateFeed, FeedDetailRefreshed -> + CreateFeed, FeedDetailRefreshed -> { RemovedFeedDialogFragment .newInstance { val extraIntent = Intent().apply { putExtra(FEED_ID, feedId) } setResult(FeedDetailRefreshed.RESULT_OK, extraIntent) if (!isFinishing) finish() }.show(supportFragmentManager, RemovedFeedDialogFragment.TAG) + } else -> { val extraIntent = Intent().apply { putExtra(FEED_ID, feedId) } @@ -553,7 +561,7 @@ class FeedDetailActivity : BaseActivity(activity_feed } } - val header = feedDetailUiState.feedDetail.feed?.let { Header(it) } + val header = Header(feedDetailUiState.feedDetail) val comments = feedDetailUiState.feedDetail.comments.map { Comment(it) } val feedDetail = listOf(header) + comments diff --git a/app/src/main/java/com/into/websoso/ui/feedDetail/adapter/FeedDetailAdapter.kt b/app/src/main/java/com/into/websoso/ui/feedDetail/adapter/FeedDetailAdapter.kt index ae1f6fb6b..d5871ead3 100644 --- a/app/src/main/java/com/into/websoso/ui/feedDetail/adapter/FeedDetailAdapter.kt +++ b/app/src/main/java/com/into/websoso/ui/feedDetail/adapter/FeedDetailAdapter.kt @@ -47,7 +47,7 @@ class FeedDetailAdapter( ) { when (holder) { is FeedDetailCommentViewHolder -> holder.bind((getItem(position) as Comment).comment) - is FeedDetailContentViewHolder -> holder.bind((getItem(position) as Header).feed) + is FeedDetailContentViewHolder -> holder.bind((getItem(position) as Header).feedDetail) } } @@ -58,10 +58,13 @@ class FeedDetailAdapter( newItem: FeedDetailType, ): Boolean = when { - (oldItem is Comment) and (newItem is Comment) -> + (oldItem is Comment) and (newItem is Comment) -> { (oldItem as Comment).comment.commentId == (newItem as Comment).comment.commentId + } - else -> oldItem == newItem + else -> { + oldItem == newItem + } } override fun areContentsTheSame( diff --git a/app/src/main/java/com/into/websoso/ui/feedDetail/adapter/FeedDetailContentViewHolder.kt b/app/src/main/java/com/into/websoso/ui/feedDetail/adapter/FeedDetailContentViewHolder.kt index 19213f325..0df3f7676 100644 --- a/app/src/main/java/com/into/websoso/ui/feedDetail/adapter/FeedDetailContentViewHolder.kt +++ b/app/src/main/java/com/into/websoso/ui/feedDetail/adapter/FeedDetailContentViewHolder.kt @@ -7,7 +7,7 @@ import com.into.websoso.core.common.util.getS3ImageUrl import com.into.websoso.databinding.ItemFeedDetailHeaderBinding import com.into.websoso.ui.feedDetail.FeedDetailClickListener import com.into.websoso.ui.feedDetail.component.AdaptationFeedImageContainer -import com.into.websoso.ui.main.feed.model.FeedModel +import com.into.websoso.ui.feedDetail.model.FeedDetailModel class FeedDetailContentViewHolder( private val feedDetailClickListener: FeedDetailClickListener, @@ -17,16 +17,17 @@ class FeedDetailContentViewHolder( binding.onClick = feedDetailClickListener } - fun bind(feed: FeedModel) { - binding.feed = feed.copy( - user = feed.user.copy(avatarImage = itemView.getS3ImageUrl(feed.user.avatarImage)), + fun bind(feedDetail: FeedDetailModel) { + binding.feedDetail = feedDetail.copy( + user = feedDetail.user?.copy(avatarImage = itemView.getS3ImageUrl(feedDetail.user.avatarImage)), ) - binding.clFeedLike.isSelected = feed.isLiked + binding.clFeedLike.isSelected = feedDetail.feed?.isLiked == true binding.cvFeedImage.setContent { - AdaptationFeedImageContainer(feed.imageUrls) { index -> - feedDetailClickListener.onFeedImageClick(index, feed.imageUrls) + AdaptationFeedImageContainer(feedDetail.feed?.imageUrls ?: return@setContent) { index -> + feedDetailClickListener.onFeedImageClick(index, feedDetail.feed.imageUrls) } } + binding.ivFeedDetailNovelGenre.setImageResource(feedDetail.novelImage) } companion object { diff --git a/app/src/main/java/com/into/websoso/ui/feedDetail/adapter/FeedDetailType.kt b/app/src/main/java/com/into/websoso/ui/feedDetail/adapter/FeedDetailType.kt index 00d47dbd0..4e192f111 100644 --- a/app/src/main/java/com/into/websoso/ui/feedDetail/adapter/FeedDetailType.kt +++ b/app/src/main/java/com/into/websoso/ui/feedDetail/adapter/FeedDetailType.kt @@ -1,11 +1,11 @@ package com.into.websoso.ui.feedDetail.adapter import com.into.websoso.ui.feedDetail.model.CommentModel -import com.into.websoso.ui.main.feed.model.FeedModel +import com.into.websoso.ui.feedDetail.model.FeedDetailModel sealed interface FeedDetailType { data class Header( - val feed: FeedModel, + val feedDetail: FeedDetailModel, ) : FeedDetailType data class Comment( diff --git a/app/src/main/java/com/into/websoso/ui/feedDetail/model/FeedDetailModel.kt b/app/src/main/java/com/into/websoso/ui/feedDetail/model/FeedDetailModel.kt index 154388e88..2afcd9dfc 100644 --- a/app/src/main/java/com/into/websoso/ui/feedDetail/model/FeedDetailModel.kt +++ b/app/src/main/java/com/into/websoso/ui/feedDetail/model/FeedDetailModel.kt @@ -1,5 +1,6 @@ package com.into.websoso.ui.feedDetail.model +import androidx.annotation.DrawableRes import com.into.websoso.data.model.FeedDetailEntity import com.into.websoso.ui.main.feed.model.FeedModel @@ -9,6 +10,12 @@ data class FeedDetailModel( val user: UserModel? = null, val novel: FeedDetailEntity.NovelEntity? = null, ) { + @get:DrawableRes + val novelImage: Int + get() = novel?.genre?.let { tag -> + Genre.from(tag).drawableRes + } ?: Genre.ROMANCE.drawableRes + data class UserModel( val avatarImage: String, ) diff --git a/app/src/main/java/com/into/websoso/ui/feedDetail/model/Genre.kt b/app/src/main/java/com/into/websoso/ui/feedDetail/model/Genre.kt new file mode 100644 index 000000000..d30062ba5 --- /dev/null +++ b/app/src/main/java/com/into/websoso/ui/feedDetail/model/Genre.kt @@ -0,0 +1,27 @@ +package com.into.websoso.ui.feedDetail.model + +import androidx.annotation.DrawableRes +import com.into.websoso.R + +enum class Genre( + val tag: String, + @DrawableRes val drawableRes: Int, +) { + ROMANCE("romance", R.drawable.ic_romance), + ROMANCE_FANTASY("romanceFantasy", R.drawable.ic_romance_fantasy), + BL("BL", R.drawable.ic_bl), + FANTASY("fantasy", R.drawable.ic_fantasy), + MODERN_FANTASY(tag = "modernFantasy", drawableRes = R.drawable.ic_hf), + WUXIA("wuxia", R.drawable.ic_wuxia), + LIGHT_NOVEL( + "lightNovel", + R.drawable.ic_ln, + ), + DRAMA("drama", R.drawable.ic_drama), + MYSTERY("mystery", R.drawable.ic_mystery), + ; + + companion object { + fun from(tag: String): Genre = entries.find { it.tag == tag } ?: ROMANCE + } +} diff --git a/app/src/main/res/drawable/btn_feed_novel_info.xml b/app/src/main/res/drawable/btn_feed_novel_info.xml index 98a12f896..13ac78b9a 100644 --- a/app/src/main/res/drawable/btn_feed_novel_info.xml +++ b/app/src/main/res/drawable/btn_feed_novel_info.xml @@ -2,5 +2,7 @@ - + diff --git a/app/src/main/res/drawable/ic_bl.xml b/app/src/main/res/drawable/ic_bl.xml new file mode 100644 index 000000000..21c658c5f --- /dev/null +++ b/app/src/main/res/drawable/ic_bl.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_drama.xml b/app/src/main/res/drawable/ic_drama.xml new file mode 100644 index 000000000..dc2f6cd63 --- /dev/null +++ b/app/src/main/res/drawable/ic_drama.xml @@ -0,0 +1,20 @@ + + + + + + + diff --git a/app/src/main/res/drawable/ic_fantasy.xml b/app/src/main/res/drawable/ic_fantasy.xml new file mode 100644 index 000000000..291494685 --- /dev/null +++ b/app/src/main/res/drawable/ic_fantasy.xml @@ -0,0 +1,16 @@ + + + + + + + diff --git a/app/src/main/res/drawable/ic_feed_detail_novel_star.xml b/app/src/main/res/drawable/ic_feed_detail_novel_star.xml new file mode 100644 index 000000000..7fd0da7c4 --- /dev/null +++ b/app/src/main/res/drawable/ic_feed_detail_novel_star.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_feed_detail_writer_star.xml b/app/src/main/res/drawable/ic_feed_detail_writer_star.xml new file mode 100644 index 000000000..5aa471eb2 --- /dev/null +++ b/app/src/main/res/drawable/ic_feed_detail_writer_star.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_hf.xml b/app/src/main/res/drawable/ic_hf.xml new file mode 100644 index 000000000..098ae489e --- /dev/null +++ b/app/src/main/res/drawable/ic_hf.xml @@ -0,0 +1,16 @@ + + + + + + + diff --git a/app/src/main/res/drawable/ic_ln.xml b/app/src/main/res/drawable/ic_ln.xml new file mode 100644 index 000000000..00e658a0e --- /dev/null +++ b/app/src/main/res/drawable/ic_ln.xml @@ -0,0 +1,20 @@ + + + + + + + diff --git a/app/src/main/res/drawable/ic_mystery.xml b/app/src/main/res/drawable/ic_mystery.xml new file mode 100644 index 000000000..5b01c3729 --- /dev/null +++ b/app/src/main/res/drawable/ic_mystery.xml @@ -0,0 +1,20 @@ + + + + + + + diff --git a/app/src/main/res/drawable/ic_romance.xml b/app/src/main/res/drawable/ic_romance.xml new file mode 100644 index 000000000..b0b795e7e --- /dev/null +++ b/app/src/main/res/drawable/ic_romance.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_romance_fantasy.xml b/app/src/main/res/drawable/ic_romance_fantasy.xml new file mode 100644 index 000000000..a3c6b6de4 --- /dev/null +++ b/app/src/main/res/drawable/ic_romance_fantasy.xml @@ -0,0 +1,16 @@ + + + + + + + diff --git a/app/src/main/res/drawable/ic_wuxia.xml b/app/src/main/res/drawable/ic_wuxia.xml new file mode 100644 index 000000000..a2d748340 --- /dev/null +++ b/app/src/main/res/drawable/ic_wuxia.xml @@ -0,0 +1,16 @@ + + + + + + + diff --git a/app/src/main/res/layout/item_feed.xml b/app/src/main/res/layout/item_feed.xml index c939a7690..a376a4069 100644 --- a/app/src/main/res/layout/item_feed.xml +++ b/app/src/main/res/layout/item_feed.xml @@ -170,7 +170,7 @@ app:layout_constraintTop_toBottomOf="@+id/iv_feed_image"> + app:layout_constraintBottom_toBottomOf="@+id/tv_feed_detail_all_score" + app:layout_constraintEnd_toStartOf="@+id/tv_feed_detail_all_score" + app:layout_constraintTop_toTopOf="@+id/tv_feed_detail_all_score" /> + app:layout_constraintTop_toTopOf="@+id/tv_feed_detail_all_score" /> + name="feedDetail" + type="com.into.websoso.ui.feedDetail.model.FeedDetailModel" /> + app:layout_constraintTop_toTopOf="parent" + tools:src="@drawable/img_loading_thumbnail" /> + + + app:layout_constraintBottom_toTopOf="@id/cl_feed_detail_writer_rating" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toEndOf="@+id/iv_feed_novel_thumbnail" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintVertical_chainStyle="packed" + tools:text="화산귀환화산귀환화산귀환화산귀환화산귀환화산귀환화산귀환화산귀환화산귀환화산귀환" /> - + android:layout_marginTop="4dp" + app:layout_constraintBottom_toTopOf="@id/tv_feed_detail_novel_description" + app:layout_constraintStart_toStartOf="@id/tv_feed_novel_name" + app:layout_constraintTop_toBottomOf="@id/tv_feed_novel_name"> - + + + + + + + + android:layout_marginStart="8dp" + app:layout_constraintBottom_toBottomOf="@id/cl_feed_detail_writer_rating" + app:layout_constraintStart_toEndOf="@id/cl_feed_detail_writer_rating" + app:layout_constraintTop_toTopOf="@id/cl_feed_detail_writer_rating"> - + + + + + + + + app:layout_constraintStart_toStartOf="@id/cl_feed_detail_writer_rating" + app:layout_constraintTop_toBottomOf="@id/cl_feed_detail_writer_rating" + tools:text="소설 줄거리 내용입니다...소설 줄거리 내용입니다...소설 줄거리 내용입니다...소설 줄거리 내용입니다...소설 줄거리 내용입니다...소설 줄거리 내용입니다...소설 줄거리 내용입니다..." /> @@ -222,7 +301,7 @@ android:layout_marginStart="4dp" android:layout_marginEnd="8dp" android:maxLines="1" - android:text="@{String.valueOf(feed.likeCount)}" + android:text="@{String.valueOf(feedDetail.feed.likeCount)}" android:textAppearance="@style/body2" android:textColor="@color/gray_200_949399" app:layout_constraintBottom_toBottomOf="@+id/iv_feed_thumb_up" @@ -260,7 +339,7 @@ android:layout_marginStart="4dp" android:layout_marginEnd="8dp" android:maxLines="1" - android:text="@{String.valueOf(feed.commentCount)}" + android:text="@{String.valueOf(feedDetail.feed.commentCount)}" android:textAppearance="@style/body2" android:textColor="@color/gray_200_949399" app:layout_constraintBottom_toBottomOf="@+id/iv_feed_comment" diff --git a/core/resource/src/main/res/values/strings.xml b/core/resource/src/main/res/values/strings.xml index dad1758ec..5213a3f05 100644 --- a/core/resource/src/main/res/values/strings.xml +++ b/core/resource/src/main/res/values/strings.xml @@ -95,7 +95,7 @@ 아직 글이 없어요\n최초로 남겨보세요! - %.1f (%d) + %.1f 스포일러 신고, 부적절한 표현 신고 수정하기, 삭제하기 소소피드 From 97e89a4c99c1f1af605f9f20dded196cfdccdacb Mon Sep 17 00:00:00 2001 From: m6z1 Date: Sat, 10 Jan 2026 18:14:27 +0900 Subject: [PATCH 4/8] =?UTF-8?q?fix:=20=EC=9E=91=ED=92=88=20=EC=8D=B8?= =?UTF-8?q?=EB=84=A4=EC=9D=BC=20=EC=9E=98=EB=A0=A4=EB=B3=B4=EC=9D=B4?= =?UTF-8?q?=EB=8A=94=20=ED=98=84=EC=83=81=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/item_feed_detail_header.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/res/layout/item_feed_detail_header.xml b/app/src/main/res/layout/item_feed_detail_header.xml index 5b00075db..724c197b2 100644 --- a/app/src/main/res/layout/item_feed_detail_header.xml +++ b/app/src/main/res/layout/item_feed_detail_header.xml @@ -134,6 +134,7 @@ loadImageUrl="@{feedDetail.novel.thumbnail}" android:layout_width="86dp" android:layout_height="124dp" + android:scaleType="centerCrop" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" From 5af6fd2a9dfb289cbdd75f8fbf25f2e52bb75d8c Mon Sep 17 00:00:00 2001 From: m6z1 Date: Sat, 10 Jan 2026 18:20:31 +0900 Subject: [PATCH 5/8] =?UTF-8?q?feat:=20=EB=A7=88=EC=A7=84=20=EA=B0=92=20?= =?UTF-8?q?=EC=A1=B0=EC=A0=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/res/layout/item_feed_detail_header.xml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/app/src/main/res/layout/item_feed_detail_header.xml b/app/src/main/res/layout/item_feed_detail_header.xml index 724c197b2..b91282113 100644 --- a/app/src/main/res/layout/item_feed_detail_header.xml +++ b/app/src/main/res/layout/item_feed_detail_header.xml @@ -107,7 +107,7 @@ android:id="@+id/cv_feed_image" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_marginTop="20dp" + android:layout_marginTop="30dp" app:isVisible="@{!feedDetail.feed.imageUrls.empty}" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -118,10 +118,8 @@ isVisible="@{!feedDetail.feed.novel.nothing}" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_marginStart="20dp" - android:layout_marginTop="20dp" - android:layout_marginEnd="20dp" - android:layout_marginBottom="20dp" + android:layout_marginHorizontal="20dp" + android:layout_marginTop="16dp" android:background="@drawable/btn_feed_novel_info" android:clipToOutline="true" android:onClick="@{() -> onClick.onNovelInfoClick(feedDetail.feed.novel.id)}" @@ -276,12 +274,14 @@ android:id="@+id/cl_feed_like" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginVertical="10dp" android:layout_marginStart="12dp" + android:layout_marginTop="24dp" + android:layout_marginBottom="10dp" android:onClick="@{(cl_feed_like) -> onClick.onLikeButtonClick(cl_feed_like, feedDetail.feed.id)}" app:layout_constraintBottom_toTopOf="@+id/view_feed_indicator" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/cl_feed_novel_info"> + app:layout_constraintTop_toBottomOf="@+id/cl_feed_novel_info" + app:layout_constraintVertical_bias="0.0"> Date: Sat, 10 Jan 2026 18:31:45 +0900 Subject: [PATCH 6/8] =?UTF-8?q?feat:=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20?= =?UTF-8?q?=EC=82=AC=EC=9D=B4=EC=A6=88=20=EC=A1=B0=EC=A0=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../component/DoubleImageContainer.kt | 12 ++++---- .../component/MultipleImageContainer.kt | 2 -- .../component/SingleImageContainer.kt | 28 +++++++++++-------- .../component/TripleImageContainer.kt | 11 ++++---- .../res/layout/item_feed_detail_header.xml | 3 +- 5 files changed, 27 insertions(+), 29 deletions(-) diff --git a/app/src/main/java/com/into/websoso/ui/feedDetail/component/DoubleImageContainer.kt b/app/src/main/java/com/into/websoso/ui/feedDetail/component/DoubleImageContainer.kt index 6a6015e49..250a5028e 100644 --- a/app/src/main/java/com/into/websoso/ui/feedDetail/component/DoubleImageContainer.kt +++ b/app/src/main/java/com/into/websoso/ui/feedDetail/component/DoubleImageContainer.kt @@ -2,9 +2,9 @@ package com.into.websoso.ui.feedDetail.component import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.aspectRatio import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier @@ -13,7 +13,6 @@ import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.unit.dp import com.into.websoso.core.common.ui.component.AdaptationImage import com.into.websoso.core.common.util.clickableWithoutRipple -import com.into.websoso.ui.feedDetail.model.ImageContainerType.DOUBLE @Composable fun DoubleImageContainer( @@ -24,18 +23,17 @@ fun DoubleImageContainer( modifier = Modifier .fillMaxWidth() .padding(horizontal = 20.dp), - horizontalArrangement = Arrangement.spacedBy(8.dp), + horizontalArrangement = Arrangement.spacedBy(6.dp), ) { - imageUrls.take(DOUBLE.size).forEach { imageUrl -> + imageUrls.take(2).forEachIndexed { index, imageUrl -> AdaptationImage( imageUrl = imageUrl, contentScale = ContentScale.Crop, modifier = Modifier - .weight(1f) - .aspectRatio(1f) + .size(100.dp) .clip(RoundedCornerShape(8.dp)) .clickableWithoutRipple { - onImageClick(imageUrls.indexOf(imageUrl)) + onImageClick(index) }, ) } diff --git a/app/src/main/java/com/into/websoso/ui/feedDetail/component/MultipleImageContainer.kt b/app/src/main/java/com/into/websoso/ui/feedDetail/component/MultipleImageContainer.kt index ce5d90735..11d06fde4 100644 --- a/app/src/main/java/com/into/websoso/ui/feedDetail/component/MultipleImageContainer.kt +++ b/app/src/main/java/com/into/websoso/ui/feedDetail/component/MultipleImageContainer.kt @@ -2,7 +2,6 @@ package com.into.websoso.ui.feedDetail.component import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.PaddingValues -import androidx.compose.foundation.layout.aspectRatio import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.size import androidx.compose.foundation.lazy.LazyRow @@ -32,7 +31,6 @@ fun MultipleImageContainer( contentScale = ContentScale.Crop, modifier = Modifier .size(100.dp) - .aspectRatio(1f) .clip(RoundedCornerShape(8.dp)) .clickableWithoutRipple { onImageClick(index) diff --git a/app/src/main/java/com/into/websoso/ui/feedDetail/component/SingleImageContainer.kt b/app/src/main/java/com/into/websoso/ui/feedDetail/component/SingleImageContainer.kt index 8ce5f04a2..976ccd24c 100644 --- a/app/src/main/java/com/into/websoso/ui/feedDetail/component/SingleImageContainer.kt +++ b/app/src/main/java/com/into/websoso/ui/feedDetail/component/SingleImageContainer.kt @@ -1,8 +1,8 @@ package com.into.websoso.ui.feedDetail.component -import androidx.compose.foundation.layout.aspectRatio -import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier @@ -17,16 +17,20 @@ fun SingleImageContainer( imageUrl: String, onImageClick: () -> Unit, ) { - AdaptationImage( - imageUrl = imageUrl, - contentScale = ContentScale.Crop, + Box( modifier = Modifier - .fillMaxWidth() .padding(horizontal = 20.dp) - .aspectRatio(1f) - .clip(RoundedCornerShape(8.dp)) - .clickableWithoutRipple { - onImageClick() - }, - ) + .size(100.dp), + ) { + AdaptationImage( + imageUrl = imageUrl, + contentScale = ContentScale.Crop, + modifier = Modifier + .matchParentSize() + .clip(RoundedCornerShape(8.dp)) + .clickableWithoutRipple { + onImageClick() + }, + ) + } } diff --git a/app/src/main/java/com/into/websoso/ui/feedDetail/component/TripleImageContainer.kt b/app/src/main/java/com/into/websoso/ui/feedDetail/component/TripleImageContainer.kt index 73ca82de4..e34e98be0 100644 --- a/app/src/main/java/com/into/websoso/ui/feedDetail/component/TripleImageContainer.kt +++ b/app/src/main/java/com/into/websoso/ui/feedDetail/component/TripleImageContainer.kt @@ -2,9 +2,9 @@ package com.into.websoso.ui.feedDetail.component import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.aspectRatio import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier @@ -23,18 +23,17 @@ fun TripleImageContainer( modifier = Modifier .fillMaxWidth() .padding(horizontal = 20.dp), - horizontalArrangement = Arrangement.spacedBy(8.dp), + horizontalArrangement = Arrangement.spacedBy(6.dp), ) { - imageUrls.take(3).forEach { imageUrl -> + imageUrls.take(3).forEachIndexed { index, imageUrl -> AdaptationImage( imageUrl = imageUrl, contentScale = ContentScale.Crop, modifier = Modifier - .weight(1f) - .aspectRatio(1f) + .size(100.dp) .clip(RoundedCornerShape(8.dp)) .clickableWithoutRipple { - onImageClick(imageUrls.indexOf(imageUrl)) + onImageClick(index) }, ) } diff --git a/app/src/main/res/layout/item_feed_detail_header.xml b/app/src/main/res/layout/item_feed_detail_header.xml index b91282113..d84b82390 100644 --- a/app/src/main/res/layout/item_feed_detail_header.xml +++ b/app/src/main/res/layout/item_feed_detail_header.xml @@ -105,11 +105,10 @@ From 157c7434eb8e7e5b76c0e830694227e667db1244 Mon Sep 17 00:00:00 2001 From: m6z1 Date: Sat, 10 Jan 2026 19:10:37 +0900 Subject: [PATCH 7/8] =?UTF-8?q?fix:=20=ED=8F=89=EC=A0=90=20=EC=97=86?= =?UTF-8?q?=EC=9D=84=20=EB=95=8C=20=EA=B0=80=EC=8B=9C=EC=84=B1=20=EC=B2=98?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../into/websoso/data/mapper/FeedMapper.kt | 4 +- .../websoso/data/model/FeedDetailEntity.kt | 10 +- .../res/layout/item_feed_detail_header.xml | 173 +++++++++--------- 3 files changed, 99 insertions(+), 88 deletions(-) diff --git a/app/src/main/java/com/into/websoso/data/mapper/FeedMapper.kt b/app/src/main/java/com/into/websoso/data/mapper/FeedMapper.kt index 8568d4fa2..9cc3eca8c 100644 --- a/app/src/main/java/com/into/websoso/data/mapper/FeedMapper.kt +++ b/app/src/main/java/com/into/websoso/data/mapper/FeedMapper.kt @@ -99,13 +99,13 @@ fun FeedDetailResponseDto.toData(): FeedDetailEntity = NovelEntity( id = id, title = title.orEmpty(), - rating = novelRating ?: 0.0f, + rating = novelRating, ratingCount = novelRatingCount ?: 0, thumbnail = novelThumbnailImage.orEmpty(), genre = novelGenre.orEmpty(), author = novelAuthor.orEmpty(), description = novelDescription.orEmpty(), - feedWriterNovelRating = feedWriterNovelRating ?: 0.0f, + feedWriterNovelRating = feedWriterNovelRating, ) }, ) diff --git a/app/src/main/java/com/into/websoso/data/model/FeedDetailEntity.kt b/app/src/main/java/com/into/websoso/data/model/FeedDetailEntity.kt index bd24a338f..c7c95e5df 100644 --- a/app/src/main/java/com/into/websoso/data/model/FeedDetailEntity.kt +++ b/app/src/main/java/com/into/websoso/data/model/FeedDetailEntity.kt @@ -26,13 +26,15 @@ data class FeedDetailEntity( data class NovelEntity( val id: Long, val title: String, - val rating: Float, + val rating: Float?, val ratingCount: Int, val thumbnail: String, val genre: String, val author: String, val description: String, - val feedWriterNovelRating: Float, - ) + val feedWriterNovelRating: Float?, + ) { + val isRatingNoting: Boolean = rating == null + val isWriterRatingNoting: Boolean = feedWriterNovelRating == null + } } - diff --git a/app/src/main/res/layout/item_feed_detail_header.xml b/app/src/main/res/layout/item_feed_detail_header.xml index d84b82390..42d5c7496 100644 --- a/app/src/main/res/layout/item_feed_detail_header.xml +++ b/app/src/main/res/layout/item_feed_detail_header.xml @@ -156,100 +156,109 @@ android:text="@{feedDetail.feed.novel.title}" android:textAppearance="@style/title3" android:textColor="@color/black" - app:layout_constraintBottom_toTopOf="@id/cl_feed_detail_writer_rating" + app:layout_constraintBottom_toTopOf="@id/ll_feed_detail_ratings" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@+id/iv_feed_novel_thumbnail" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_chainStyle="packed" tools:text="화산귀환화산귀환화산귀환화산귀환화산귀환화산귀환화산귀환화산귀환화산귀환화산귀환" /> - - - - - - - - - - + app:layout_constraintTop_toBottomOf="@id/tv_feed_novel_name" + app:layout_constraintVertical_chainStyle="packed"> - - - - - + + + + + + + + + - + app:isVisible="@{!feedDetail.novel.isRatingNoting}"> + + + + + + + + + app:layout_constraintStart_toStartOf="@id/tv_feed_novel_name" + app:layout_constraintTop_toBottomOf="@id/ll_feed_detail_ratings" + tools:text="소설 줄거리 내용입니다...ㅇㅁㅇㄹㅁㄴㅇㄹㅁㄴㅇㄹㅁㄴㅇㄹㅁㄴㅇㄹㄴㅁㅇㄹㄴㅁㅇㄹㄴㅁㄹㄴ" /> Date: Sat, 10 Jan 2026 19:21:01 +0900 Subject: [PATCH 8/8] =?UTF-8?q?feat:=20=EA=B8=80=EC=93=B4=EC=9D=B4=20?= =?UTF-8?q?=EB=8B=89=EB=84=A4=EC=9E=84=20=EB=B3=B4=EC=9D=B4=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/item_feed_detail_header.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/layout/item_feed_detail_header.xml b/app/src/main/res/layout/item_feed_detail_header.xml index 42d5c7496..373b71d5c 100644 --- a/app/src/main/res/layout/item_feed_detail_header.xml +++ b/app/src/main/res/layout/item_feed_detail_header.xml @@ -187,7 +187,7 @@ android:id="@+id/tv_feed_detail_writer_rating" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="글쓴이" + android:text="@{feedDetail.feed.user.nickname}" android:textAppearance="@style/body5" android:textColor="@color/gray_300_52515F" app:layout_constraintBottom_toBottomOf="parent"