feat(home): 사업자 정보 inline 더보기를 추가한다
This commit is contained in:
@@ -4,6 +4,9 @@ import android.app.Application
|
||||
import android.content.Context
|
||||
import android.content.res.Configuration
|
||||
import android.graphics.drawable.ColorDrawable
|
||||
import android.text.Spanned
|
||||
import android.text.TextUtils
|
||||
import android.text.style.ClickableSpan
|
||||
import android.view.Gravity
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
@@ -30,6 +33,7 @@ import kr.co.vividnext.sodalive.v2.main.home.model.visibleHomePopularCommunityPo
|
||||
import kr.co.vividnext.sodalive.v2.main.home.model.visibleHomeGenreCreatorGroups
|
||||
import kr.co.vividnext.sodalive.v2.main.home.data.HomePopularCommunityPostItem
|
||||
import kr.co.vividnext.sodalive.v2.main.home.ui.HomeAiCharacterAdapter
|
||||
import kr.co.vividnext.sodalive.v2.main.home.ui.HomeBusinessInfoBinder
|
||||
import kr.co.vividnext.sodalive.v2.main.home.ui.HomeCheerCreatorAdapter
|
||||
import kr.co.vividnext.sodalive.v2.main.home.ui.HomeFirstAudioAdapter
|
||||
import kr.co.vividnext.sodalive.v2.main.home.ui.HomeFollowAllButtonBinder
|
||||
@@ -819,6 +823,88 @@ class HomeMainFragmentLayoutTest {
|
||||
assertNotNull(genreGroup.findViewById<TextView>(R.id.tv_home_genre_creator_group_title_suffix))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `business info layout starts collapsed without separate toggle view`() {
|
||||
val root = inflateView(R.layout.fragment_v2_main_home)
|
||||
val businessInfoContainer = root.findViewById<LinearLayout>(R.id.ll_home_business_info)
|
||||
val businessInfo = root.findViewById<TextView>(R.id.tv_home_business_info)
|
||||
|
||||
assertEquals(1, businessInfoContainer.childCount)
|
||||
assertEquals(3, businessInfo.maxLines)
|
||||
assertEquals(TextUtils.TruncateAt.END, businessInfo.ellipsize)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `business info binder appends inline more action when content is longer than three lines`() {
|
||||
val context = ApplicationProvider.getApplicationContext<Context>()
|
||||
val businessInfo = TextView(context).apply {
|
||||
setPadding(0, 0, 0, 0)
|
||||
layout(0, 0, 180.dpToPx(), 1000.dpToPx())
|
||||
}
|
||||
val originalText = "사업자 정보가 여러 줄로 길게 표시되어 마지막 줄 우측에 더보기 액션이 붙어야 합니다. 반복 텍스트입니다."
|
||||
|
||||
HomeBusinessInfoBinder.bind(businessInfo)
|
||||
HomeBusinessInfoBinder.updateToggleVisibility(
|
||||
textView = businessInfo,
|
||||
originalText = originalText,
|
||||
totalLineCount = 4
|
||||
)
|
||||
|
||||
assertEquals(3, businessInfo.maxLines)
|
||||
assertEquals(null, businessInfo.ellipsize)
|
||||
assertFalse(
|
||||
businessInfo.text.toString().contains("\n" + context.getString(R.string.home_recommendation_more))
|
||||
)
|
||||
assertEquals(true, businessInfo.text.toString().endsWith("… " + context.getString(R.string.home_recommendation_more)))
|
||||
assertEquals(1, businessInfo.clickableSpanCount())
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `business info inline action toggles collapsed and expanded state`() {
|
||||
val context = ApplicationProvider.getApplicationContext<Context>()
|
||||
val businessInfo = TextView(context).apply {
|
||||
setPadding(0, 0, 0, 0)
|
||||
layout(0, 0, 180.dpToPx(), 1000.dpToPx())
|
||||
}
|
||||
val originalText = "사업자 정보가 여러 줄로 길게 표시되어 마지막 줄 우측에 더보기 액션이 붙어야 합니다. 반복 텍스트입니다."
|
||||
|
||||
HomeBusinessInfoBinder.bind(businessInfo)
|
||||
HomeBusinessInfoBinder.updateToggleVisibility(
|
||||
textView = businessInfo,
|
||||
originalText = originalText,
|
||||
totalLineCount = 4
|
||||
)
|
||||
businessInfo.performLastClickableSpanClick()
|
||||
|
||||
assertEquals(Int.MAX_VALUE, businessInfo.maxLines)
|
||||
assertEquals(null, businessInfo.ellipsize)
|
||||
assertEquals(true, businessInfo.text.toString().endsWith(" " + context.getString(R.string.home_recommendation_collapse)))
|
||||
|
||||
businessInfo.performLastClickableSpanClick()
|
||||
|
||||
assertEquals(3, businessInfo.maxLines)
|
||||
assertEquals(null, businessInfo.ellipsize)
|
||||
assertEquals(true, businessInfo.text.toString().endsWith("… " + context.getString(R.string.home_recommendation_more)))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `business info inline action is absent when content is three lines or fewer`() {
|
||||
val context = ApplicationProvider.getApplicationContext<Context>()
|
||||
val businessInfo = TextView(context)
|
||||
val originalText = "짧은 사업자 정보"
|
||||
|
||||
HomeBusinessInfoBinder.updateToggleVisibility(
|
||||
textView = businessInfo,
|
||||
originalText = originalText,
|
||||
totalLineCount = 3
|
||||
)
|
||||
|
||||
assertEquals(3, businessInfo.maxLines)
|
||||
assertEquals(TextUtils.TruncateAt.END, businessInfo.ellipsize)
|
||||
assertEquals(originalText, businessInfo.text.toString())
|
||||
assertEquals(0, businessInfo.clickableSpanCount())
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `home title bar exposes right icons in cash search bell order`() {
|
||||
val titleBar = inflateView(R.layout.view_title_bar_home)
|
||||
@@ -841,6 +927,16 @@ class HomeMainFragmentLayoutTest {
|
||||
}
|
||||
}
|
||||
|
||||
private fun TextView.clickableSpanCount(): Int {
|
||||
val spanned = text as? Spanned ?: return 0
|
||||
return spanned.getSpans(0, spanned.length, ClickableSpan::class.java).size
|
||||
}
|
||||
|
||||
private fun TextView.performLastClickableSpanClick() {
|
||||
val spanned = text as Spanned
|
||||
spanned.getSpans(0, spanned.length, ClickableSpan::class.java).last().onClick(this)
|
||||
}
|
||||
|
||||
private fun inflateView(layoutResId: Int): View {
|
||||
val context = ApplicationProvider.getApplicationContext<Context>()
|
||||
return LayoutInflater.from(context).inflate(layoutResId, null, false)
|
||||
|
||||
Reference in New Issue
Block a user