From 650d5bd903391144140b000ec067d314a2480605 Mon Sep 17 00:00:00 2001 From: devfeijoa Date: Tue, 16 Jun 2026 13:21:05 +0900 Subject: [PATCH 1/7] =?UTF-8?q?fix:=20=EC=9D=B8=EA=B8=B0=20=ED=94=BC?= =?UTF-8?q?=EB=93=9C=20=EC=8A=AC=EB=A1=AF=20UI=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 인기 피드 내용(`tv_popular_feed_content`)의 상단 여백을 4dp에서 8dp로 변경 --- app/src/main/res/layout/item_popular_feed_slot.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/layout/item_popular_feed_slot.xml b/app/src/main/res/layout/item_popular_feed_slot.xml index 61572d87c..835f67d57 100644 --- a/app/src/main/res/layout/item_popular_feed_slot.xml +++ b/app/src/main/res/layout/item_popular_feed_slot.xml @@ -32,7 +32,7 @@ android:id="@+id/tv_popular_feed_content" android:layout_width="195dp" android:layout_height="wrap_content" - android:layout_marginTop="4dp" + android:layout_marginTop="8dp" android:ellipsize="end" android:maxLines="3" android:textAppearance="@style/body5" From ca49791c235dc219701d53da503aa13389d6d20b Mon Sep 17 00:00:00 2001 From: devfeijoa Date: Tue, 16 Jun 2026 14:08:15 +0900 Subject: [PATCH 2/7] =?UTF-8?q?fix:=20=EC=9D=B8=EA=B8=B0=20=ED=94=BC?= =?UTF-8?q?=EB=93=9C=20UI=20=EB=A0=88=EC=9D=B4=EC=95=84=EC=9B=83=20?= =?UTF-8?q?=EB=B0=8F=20=EC=A0=9C=EB=AA=A9=20=EC=83=9D=EB=9E=B5=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - `item_popular_feed_slot.xml`의 패딩 값을 미세 조정하고 텍스트 뷰 너비를 `0dp`(match constraint)로 변경하여 레이아웃 최적화 - `PopularFeedsViewHolder`의 `ellipsizeByLength` 메서드 로직을 공백을 제외한 글자 수 기준으로 계산하도록 수정 - 제목 생략 시 노출되는 말줄임표 기호를 `...`에서 `…`으로 변경 --- .../main/home/adpater/PopularFeedsViewHolder.kt | 17 ++++++++++++----- .../main/res/layout/item_popular_feed_slot.xml | 12 +++++++----- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/into/websoso/ui/main/home/adpater/PopularFeedsViewHolder.kt b/app/src/main/java/com/into/websoso/ui/main/home/adpater/PopularFeedsViewHolder.kt index 5a11463a0..4b5f12450 100644 --- a/app/src/main/java/com/into/websoso/ui/main/home/adpater/PopularFeedsViewHolder.kt +++ b/app/src/main/java/com/into/websoso/ui/main/home/adpater/PopularFeedsViewHolder.kt @@ -66,12 +66,19 @@ class PopularFeedsViewHolder( else -> itemView.getS3ImageUrl(this) } - private fun String.ellipsizeByLength(): String = - if (length > MAX_TITLE_LENGTH) { - take(MAX_TITLE_LENGTH) + "..." - } else { - this + private fun String.ellipsizeByLength(): String { + var titleLength = 0 + val title = StringBuilder() + + for (char in this) { + if (!char.isWhitespace()) { + if (titleLength == MAX_TITLE_LENGTH) return title.toString().trimEnd() + "…" + titleLength++ + } + title.append(char) } + return this + } companion object { private const val MAX_TITLE_LENGTH = 16 diff --git a/app/src/main/res/layout/item_popular_feed_slot.xml b/app/src/main/res/layout/item_popular_feed_slot.xml index 835f67d57..452869fed 100644 --- a/app/src/main/res/layout/item_popular_feed_slot.xml +++ b/app/src/main/res/layout/item_popular_feed_slot.xml @@ -10,12 +10,14 @@ + android:paddingStart="20.5dp" + android:paddingTop="16dp" + android:paddingEnd="20.5dp" + android:paddingBottom="16dp"> Date: Tue, 16 Jun 2026 14:29:14 +0900 Subject: [PATCH 3/7] =?UTF-8?q?fix:=20=ED=99=88=20=ED=99=94=EB=A9=B4=20?= =?UTF-8?q?=EC=9D=B8=EA=B8=B0=20=ED=94=BC=EB=93=9C=20=EC=B5=9C=EB=8C=80=20?= =?UTF-8?q?=EB=85=B8=EC=B6=9C=20=EA=B0=9C=EC=88=98=20=EC=A0=9C=ED=95=9C=20?= =?UTF-8?q?=EB=B0=8F=20=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 인기 피드 노출 개수를 최대 6개로 제한하기 위해 `HOME_POPULAR_FEED_MAX_COUNT` 상수 추가 - `popularFeeds` 데이터를 페이지 단위로 가공하는 `toHomePopularFeedPages` 확장 함수 구현 - `HomeViewModel` 내 데이터 로딩 및 업데이트 로직에 개수 제한 및 청크 로직 통합 적용 --- .../com/into/websoso/ui/main/home/HomeViewModel.kt | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/into/websoso/ui/main/home/HomeViewModel.kt b/app/src/main/java/com/into/websoso/ui/main/home/HomeViewModel.kt index 619050877..bc8ad71fb 100644 --- a/app/src/main/java/com/into/websoso/ui/main/home/HomeViewModel.kt +++ b/app/src/main/java/com/into/websoso/ui/main/home/HomeViewModel.kt @@ -5,6 +5,7 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import com.into.websoso.data.model.PopularFeedsEntity import com.into.websoso.data.model.PopularNovelsEntity import com.into.websoso.data.model.RecommendedNovelsByUserTasteEntity import com.into.websoso.data.model.TermsAgreementEntity @@ -98,7 +99,7 @@ class HomeViewModel loading = false, error = false, popularNovels = popularNovels.popularNovels, - popularFeeds = popularFeeds.chunked(HOME_POPULAR_FEED_PAGE_SIZE), + popularFeeds = popularFeeds.toHomePopularFeedPages(), recommendedNovelsByUserTaste = recommendedNovels.tasteNovels, ) } @@ -148,7 +149,7 @@ class HomeViewModel loading = false, error = false, popularNovels = popularNovels.popularNovels, - popularFeeds = popularFeeds.chunked(HOME_POPULAR_FEED_PAGE_SIZE), + popularFeeds = popularFeeds.toHomePopularFeedPages(), ) } } @@ -167,7 +168,7 @@ class HomeViewModel }.onSuccess { popularFeeds -> _uiState.value = uiState.value?.copy( error = false, - popularFeeds = popularFeeds.chunked(HOME_POPULAR_FEED_PAGE_SIZE), + popularFeeds = popularFeeds.toHomePopularFeedPages(), ) }.onFailure { _uiState.value = uiState.value?.copy(error = true) @@ -260,7 +261,11 @@ class HomeViewModel } } + private fun List.toHomePopularFeedPages(): List> = + take(HOME_POPULAR_FEED_MAX_COUNT).chunked(HOME_POPULAR_FEED_PAGE_SIZE) + companion object { + private const val HOME_POPULAR_FEED_MAX_COUNT = 6 private const val HOME_POPULAR_FEED_PAGE_SIZE = 2 } } From 8f641d852fa4e10e059e83b81df6657793ee9f82 Mon Sep 17 00:00:00 2001 From: devfeijoa Date: Tue, 16 Jun 2026 17:11:29 +0900 Subject: [PATCH 4/7] =?UTF-8?q?fix:=20=EC=9D=B8=EA=B8=B0=20=EC=9E=91?= =?UTF-8?q?=ED=92=88=20=EC=95=84=EC=9D=B4=ED=85=9C=20UI=20=EB=B0=B0?= =?UTF-8?q?=EA=B2=BD=20=EB=A6=AC=EC=86=8C=EC=8A=A4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 불필요한 배경 리소스(`bg_popular_novel_translucent_radius_14dp`) 삭제 및 `item_popular_novel`의 배경을 공통 리소스로 교체 - 인기 작품 아이템 하단 영역 배경(`bg_popular_novel_bottom_radius_14dp`)에 `layer-list`를 적용하여 색상 및 투명도 레이어 수정 --- .../bg_popular_novel_bottom_radius_14dp.xml | 26 ++++++++++++++----- ..._popular_novel_translucent_radius_14dp.xml | 5 ---- .../main/res/layout/item_popular_novel.xml | 2 +- 3 files changed, 20 insertions(+), 13 deletions(-) delete mode 100644 app/src/main/res/drawable/bg_popular_novel_translucent_radius_14dp.xml diff --git a/app/src/main/res/drawable/bg_popular_novel_bottom_radius_14dp.xml b/app/src/main/res/drawable/bg_popular_novel_bottom_radius_14dp.xml index d329595b7..9778fb95e 100644 --- a/app/src/main/res/drawable/bg_popular_novel_bottom_radius_14dp.xml +++ b/app/src/main/res/drawable/bg_popular_novel_bottom_radius_14dp.xml @@ -1,7 +1,19 @@ - - - - + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/bg_popular_novel_translucent_radius_14dp.xml b/app/src/main/res/drawable/bg_popular_novel_translucent_radius_14dp.xml deleted file mode 100644 index d58922819..000000000 --- a/app/src/main/res/drawable/bg_popular_novel_translucent_radius_14dp.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - diff --git a/app/src/main/res/layout/item_popular_novel.xml b/app/src/main/res/layout/item_popular_novel.xml index 41ca8d725..faa92c710 100644 --- a/app/src/main/res/layout/item_popular_novel.xml +++ b/app/src/main/res/layout/item_popular_novel.xml @@ -18,7 +18,7 @@ android:layout_width="292dp" android:layout_height="362dp" android:layout_marginHorizontal="5dp" - android:background="@drawable/bg_popular_novel_translucent_radius_14dp" + android:background="@drawable/bg_novel_detail_white_radius_14dp" android:onClick="@{() -> onClick.invoke(popularNovel.novelId)}"> Date: Wed, 17 Jun 2026 15:47:24 +0900 Subject: [PATCH 5/7] =?UTF-8?q?fix:=20=EC=9D=B8=EA=B8=B0=20=EC=9E=91?= =?UTF-8?q?=ED=92=88=20=EC=A0=9C=EB=AA=A9=20=EC=83=9D=EB=9E=B5(Ellipsis)?= =?UTF-8?q?=20=EB=A1=9C=EC=A7=81=20=EB=B0=8F=20=EB=AC=B8=EC=9E=90=EC=97=B4?= =?UTF-8?q?=20=EB=A6=AC=EC=86=8C=EC=8A=A4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - `PopularNovelTextExtensions.kt`: 제목 생략 처리 시 공백을 제외한 화면에 보이는 글자 수를 기준으로 하도록 `takeWithEllipsis` 로직 고도화 - `strings.xml`: 제목 생략 기호를 일반 마침표 3개(...)에서 생략 부호(…)로 변경 --- .../home/adpater/PopularNovelTextExtensions.kt | 14 +++++++++++--- core/resource/src/main/res/values/strings.xml | 2 +- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/into/websoso/ui/main/home/adpater/PopularNovelTextExtensions.kt b/app/src/main/java/com/into/websoso/ui/main/home/adpater/PopularNovelTextExtensions.kt index 3bf840862..8d7a50b1d 100644 --- a/app/src/main/java/com/into/websoso/ui/main/home/adpater/PopularNovelTextExtensions.kt +++ b/app/src/main/java/com/into/websoso/ui/main/home/adpater/PopularNovelTextExtensions.kt @@ -46,12 +46,20 @@ private val TextView.textAreaWidth: Float private fun String.takeWithEllipsis( maxLength: Int, ellipsis: String, -): String = - if (length > maxLength) { - take(maxLength) + ellipsis +): String { + var visibleLength = 0 + val truncatedTitle = takeWhile { character -> + if (character.isWhitespace()) return@takeWhile true + visibleLength++ + visibleLength <= maxLength + } + + return if (visibleLength > maxLength || truncatedTitle.length < length) { + truncatedTitle.trimEnd() + ellipsis } else { this } +} private fun String.wrapByWord( textPaint: TextPaint, diff --git a/core/resource/src/main/res/values/strings.xml b/core/resource/src/main/res/values/strings.xml index 1f5421318..f23681432 100644 --- a/core/resource/src/main/res/values/strings.xml +++ b/core/resource/src/main/res/values/strings.xml @@ -245,7 +245,7 @@ 이 웹소설은 어때요? (´ヮ`)ノ📚 %s님의 한마디 작품 소개 - ... + %1$s · %2$s 연재작 완결작 From b26ae62ff65e532fc891c3189f9b71c2a0760894 Mon Sep 17 00:00:00 2001 From: devfeijoa Date: Wed, 17 Jun 2026 16:01:47 +0900 Subject: [PATCH 6/7] =?UTF-8?q?fix:=20=ED=99=88=20=ED=99=94=EB=A9=B4=20?= =?UTF-8?q?=EC=9D=B8=EA=B8=B0=20=EC=86=8C=EC=84=A4=20=EC=9E=91=EA=B0=80?= =?UTF-8?q?=EB=AA=85=20=EB=A7=90=EC=A4=84=EC=9E=84=ED=91=9C=20=EC=B2=98?= =?UTF-8?q?=EB=A6=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - `PopularNovelEntity.toAuthorStatus`에서 작가명이 최대 길이를 초과할 경우 말줄임표(...)를 표시하도록 로직 수정 --- .../ui/main/home/adpater/PopularNovelTextExtensions.kt | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/into/websoso/ui/main/home/adpater/PopularNovelTextExtensions.kt b/app/src/main/java/com/into/websoso/ui/main/home/adpater/PopularNovelTextExtensions.kt index 8d7a50b1d..ed3e78275 100644 --- a/app/src/main/java/com/into/websoso/ui/main/home/adpater/PopularNovelTextExtensions.kt +++ b/app/src/main/java/com/into/websoso/ui/main/home/adpater/PopularNovelTextExtensions.kt @@ -20,7 +20,13 @@ internal fun PopularNovelEntity.toPopularNovelTitle(titleView: TextView): String ) internal fun PopularNovelEntity.toAuthorStatus(context: Context): String { - val authorName = author.take(MAX_AUTHOR_LENGTH) + val ellipsis = context.getString(home_popular_novel_title_ellipsis) + val authorName = + if (author.length > MAX_AUTHOR_LENGTH) { + author.take(MAX_AUTHOR_LENGTH).trimEnd() + ellipsis + } else { + author + } val status = context.getString( if (isNovelCompleted) { From 66a51431cc667518cbc60e4290cba0ca86c6b732 Mon Sep 17 00:00:00 2001 From: devfeijoa Date: Wed, 17 Jun 2026 17:00:52 +0900 Subject: [PATCH 7/7] =?UTF-8?q?fix:=20=EC=9D=B8=EA=B8=B0=20=EC=9E=91?= =?UTF-8?q?=ED=92=88=20=EC=95=84=EC=9D=B4=ED=85=9C=20=EC=BB=A4=EB=B2=84=20?= =?UTF-8?q?=EC=9D=B4=EB=AF=B8=EC=A7=80=20UI=20=EC=88=98=EC=A0=95=20?= =?UTF-8?q?=EB=B0=8F=20=EA=B7=B8=EB=A6=BC=EC=9E=90=20=ED=9A=A8=EA=B3=BC=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - `item_popular_novel.xml`: 소설 커버 이미지와 장르 아이콘을 `MaterialCardView`로 감싸 그림자(`cardElevation`) 및 라운드 처리 적용 - 커버 이미지의 라운드 처리 방식을 커스텀 속성에서 `MaterialCardView` 속성(`cardCornerRadius`)으로 변경 - 카드 뷰 내부 아이콘들의 배치 방식을 `ConstraintLayout` 제약 조건에서 `layout_gravity` 활용 방식으로 수정 --- .../main/res/layout/item_popular_novel.xml | 56 +++++++++++-------- 1 file changed, 32 insertions(+), 24 deletions(-) diff --git a/app/src/main/res/layout/item_popular_novel.xml b/app/src/main/res/layout/item_popular_novel.xml index faa92c710..ef2911a7f 100644 --- a/app/src/main/res/layout/item_popular_novel.xml +++ b/app/src/main/res/layout/item_popular_novel.xml @@ -108,37 +108,45 @@ tools:text="라이벌/앙숙" /> - - - + app:layout_constraintTop_toTopOf="parent"> - + + + + + +