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 } } 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/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..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) { @@ -46,12 +52,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/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_feed_slot.xml b/app/src/main/res/layout/item_popular_feed_slot.xml index 61572d87c..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"> - - - + app:layout_constraintTop_toTopOf="parent"> - + + + + + + 이 웹소설은 어때요? (´ヮ`)ノ📚 %s님의 한마디 작품 소개 - ... + %1$s · %2$s 연재작 완결작