feat(creator): 채널 홈 시리즈, 커뮤니티, 팬 Talk 섹션을 재구성한다
This commit is contained in:
@@ -650,7 +650,7 @@
|
||||
- 검증 기록:
|
||||
- 2026-06-15: Figma `296:14958`을 확인해 오디오 컨텐츠 섹션이 `SectionTitle`, 88dp 썸네일, 16sp title, 14sp secondary text를 가진 item row이며, 아이템 최대 width가 402dp 기준 346dp인 구조임을 반영했다. 사용자 요구에 따라 최대 9개만 표시하고, 섹션은 `RecyclerView + GridLayoutManager`로 구성했다. `AudioContentCardView`는 요구사항과 달라 재사용하지 않고 `CreatorChannelHomeAudioContentCardView` 전용 Android View와 `item_creator_channel_home_audio_content.xml`을 추가했다. item 내부는 썸네일 + 텍스트 컬럼의 단순 행 구조라 사용자 피드백에 따라 `GridLayout`이 아니라 `LinearLayout`으로 구성하고, 목록 grid는 `GridLayoutManager`로 유지했다. 아이템 클릭은 `AudioContentDetailActivity`에 `Constants.EXTRA_AUDIO_CONTENT_ID`로 이동하도록 연결했다. RED로 `CreatorChannelHomeActivitySourceTest`에 오디오 전용 layout/View, 최대 9개, 346dp width 비율 계산, `GridLayoutManager`, 상세 이동 계약을 추가했고, 최초 실행에서 `calculateCreatorChannelAudioItemWidthDp` 미구현으로 실패함을 확인했다. 구현 후 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelHomeActivitySourceTest"`, `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*"`, `./gradlew :app:mergeDebugResources`, `./gradlew :app:compileDebugKotlin`, `./gradlew :app:ktlintCheck`, `git diff --check`가 PASS했다. `compileDebugKotlin` 중 Kotlin daemon cache/파일 경합으로 fallback compile이 발생했으나 최종 빌드는 성공했다. `ktlintCheck`의 `.editorconfig disabled_rules` deprecation 경고와 Kotlin/Gradle deprecation warning은 기존 경고로 이번 변경과 무관하다.
|
||||
|
||||
- [ ] **Task 5R.7: 시리즈 섹션 재구성**
|
||||
- [x] **Task 5R.7: 시리즈 섹션 재구성**
|
||||
- 수정 예정:
|
||||
- `CreatorChannelHomeSectionAdapter.kt`
|
||||
- `item_creator_channel_home_series.xml`
|
||||
@@ -661,12 +661,17 @@
|
||||
- 작업:
|
||||
- `series`가 empty이면 섹션을 표시하지 않는다.
|
||||
- 시리즈 썸네일은 163dp x 230dp 비율과 radius 14dp를 따른다.
|
||||
- `isOriginal`, `isNew`, `isPopular`, `isComplete`, `numberOfContent`, `publishedDaysOfWeek`를 Figma tag/label 정책에 맞춰 표시한다.
|
||||
- 백엔드에서 내려오지 않는 `isPopular`, `isComplete`, `publishedDaysOfWeek`는 표시하지 않고, 현재 응답에서 화면 표시가 가능한 `coverImageUrl`, `isOriginal`만 표시한다.
|
||||
- item click에 필요한 `seriesId`는 row click callback으로 전달 가능한 구조를 둔다.
|
||||
- 기존 `SeriesContentCardView` 또는 시리즈 카드 layout을 재사용할 수 있는지 먼저 확인한다.
|
||||
- 검증 기준:
|
||||
- 시리즈 섹션은 Figma `Contents` 구조에 대응하는 View/layout으로 렌더링된다.
|
||||
- 검증 기록:
|
||||
- 2026-06-15: Figma `296:14970`을 확인해 시리즈 섹션이 `SectionTitle`, 163dp x 230dp `Contents(type=series, size=m)` 썸네일 카드 row 구조임을 반영했다. 사용자 추가 설명에 따라 `CreatorChannelSeriesResponse`에서 현재 화면에 쓰는 값은 `coverImageUrl`, `isOriginal`이고 터치 시 필요한 값은 `seriesId`로 범위를 축소했다. RED로 `CreatorChannelHomeActivitySourceTest`에 시리즈 전용 layout/custom view, radius clipping custom view, 402dp 기준 163dp width 비율 계산, 백엔드 미전송 필드 미사용 계약을 추가했고, 최초 실행에서 기존 adapter의 `publishedDaysOfWeek` 참조로 `compileDebugKotlin` 실패함을 확인했다. 구현 후 focused source test와 creator channel 전체 테스트가 PASS했다.
|
||||
- 2026-06-15: reviewer gate에서 작은 화면에서 adapter row width는 146dp로 줄지만 내부 썸네일 XML은 163dp x 230dp 고정이라 클리핑/비율 불일치가 발생할 수 있다는 FAIL을 받았다. RED로 `calculateCreatorChannelSeriesCardHeightDp` 미구현 컴파일 실패를 확인한 뒤, `CreatorChannelHomeSeriesCardView.setThumbnailSize(widthDp, heightDp)`와 높이 비율 계산을 추가해 thumbnail width/height를 함께 조정했다. 수정 후 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelHomeActivitySourceTest"`, `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*"`, `./gradlew :app:mergeDebugResources`, `./gradlew :app:compileDebugKotlin`, `./gradlew :app:ktlintCheck`, `git diff --check`가 PASS했다.
|
||||
- 2026-06-15: 사용자 후속 확인에서 `item_creator_channel_home_series_content.xml`의 오리지널 태그가 Figma `296:14973`과 다르다는 지적을 반영했다. 기존 단일 `ic_content_tag_original` 이미지를 제거하고 `layout_series_original_tag` 70dp x 24dp 컨테이너 안에 `iv_series_original_icon`과 `tv_series_original_text(Only)`를 배치했다. `CreatorChannelHomeSeriesCardView`는 새 태그 컨테이너 visibility를 `series.isOriginal`로 토글하도록 변경했다.
|
||||
|
||||
- [ ] **Task 5R.8: 커뮤니티 섹션 재구성**
|
||||
- [x] **Task 5R.8: 커뮤니티 섹션 재구성**
|
||||
- 수정 예정:
|
||||
- `CreatorChannelHomeSectionAdapter.kt`
|
||||
- `item_creator_channel_home_community.xml`
|
||||
@@ -680,8 +685,14 @@
|
||||
- Figma의 `전체보기` capsule 버튼을 표시하되, 이동 대상이 없는 경우 click listener는 후속 범위로 분리한다.
|
||||
- 검증 기준:
|
||||
- 커뮤니티는 단순 `addFeedCard`가 아니라 Figma `Feed` 구조를 가진 View/layout으로 렌더링된다.
|
||||
- 검증 기록:
|
||||
- 2026-06-15: Figma `296:14982`를 확인해 커뮤니티 섹션이 `SectionTitle(hasRightIcon=false)`, 374dp feed card 최대 3개, 42dp 프로필, 작성자/날짜, 본문, 선택 이미지, 유료 잠금 overlay, 댓글/좋아요 reaction, `전체보기` capsule 버튼 구조임을 반영했다. RED로 `CreatorChannelHomeActivitySourceTest`에 커뮤니티 전용 layout/row/custom view, 최대 3개, 402dp 기준 374dp width 비율 계산, `addFeedCard` 제거 계약을 추가했고, 구현 후 focused source test와 creator channel 전체 테스트가 PASS했다.
|
||||
- 2026-06-15: reviewer gate에서 `imageUrl`이 없는 게시글도 236dp 이미지 컨테이너가 남는 문제와 잠긴 유료 이미지가 그대로 `loadUrl` 되는 privacy leak 가능성으로 FAIL을 받았다. RED로 `layout_community_thumbnail` visibility, `hasCommunityImage`, `isCommunityLocked`, 잠김 이미지 미로드/clear 계약을 추가한 뒤, `bindCommunityRow()`에서 이미지 컨테이너는 이미지가 있거나 잠김 상태일 때만 보이게 하고, 잠긴 상태에서는 썸네일을 숨기고 `setImageDrawable(null)`로 초기화하도록 수정했다. 수정 후 focused source test와 creator channel 전체 테스트, 리소스/컴파일/ktlint/diff check가 PASS했다.
|
||||
- 2026-06-15: 사용자 후속 확인에서 `FeedCommunityView`와 새로 만든 `CreatorChannelCommunityCardView`가 동일 UI이며, 실제로는 `FeedCommunityView`를 `item_creator_channel_home_community_row.xml`와 동일하게 고쳐 재사용해야 한다는 지적을 반영했다. `view_feed_community.xml`을 커뮤니티 row 구조에 맞춰 keyword row 제거, 본문 5줄, 이미지 컨테이너 236dp 고정, `bg_creator_channel_community_price`/`ic_bar_cash`, reaction `gray_400`, root `match_parent` 구조로 수정했다. `CreatorChannelHomeSectionAdapter`는 `R.layout.view_feed_community`를 inflate하고 `FeedItem.Community`로 변환해 `FeedCommunityView`를 바인딩하도록 변경했으며, 더 이상 필요 없는 `CreatorChannelCommunityCardView`, `CreatorChannelCommunityThumbnailView`, `item_creator_channel_home_community_row.xml`는 참조 제거 후 삭제했다.
|
||||
- 2026-06-15: 사용자 후속 확인에서 `tv_feed_community_price`의 `drawableStart` 방식은 Figma처럼 가격과 아이콘 간격을 정확히 표현하기 어렵다는 지적을 반영했다. 가격 capsule을 `LinearLayout` 안의 별도 `ImageView(ic_bar_cash)`와 `TextView(tv_feed_community_price)` 구조로 바꾸고, 텍스트에 `layout_marginStart=@dimen/spacing_6`을 지정해 아이콘/가격 간격을 명시했다. 미구매 유료 커뮤니티 이미지 blur는 원본 보호 관점에서 클라이언트 blur보다 서버가 비가역 preview/blur 이미지를 별도 URL로 내려주는 방식이 더 안전하다고 판단했다.
|
||||
- 2026-06-15: 사용자 후속 요청으로 서버가 미구매 유료 커뮤니티 게시글의 `imageUrl`을 blur 처리하지 않고 내려줄 가능성에 대비해 클라이언트에서도 blur를 한 번 더 적용하도록 변경했다. 기존 커뮤니티 목록 `CreatorCommunityAdapter`에서 사용하던 `BlurTransformation(context, 25f, 2.5f)` 패턴을 확인했고, 크리에이터 채널 홈과 홈 추천의 `FeedCommunityView` 이미지 바인딩에도 같은 transformation을 적용했다. 이제 미구매 유료 게시글도 `imageUrl`을 로드하되 이미지 위에 lock overlay를 유지하고, 구매하지 않은 상태에서는 클라이언트 blur fallback을 적용한다.
|
||||
|
||||
- [ ] **Task 5R.9: 팬Talk 섹션 재구성**
|
||||
- [x] **Task 5R.9: 팬Talk 섹션 재구성**
|
||||
- 수정 예정:
|
||||
- `CreatorChannelHomeSectionAdapter.kt`
|
||||
- `item_creator_channel_home_fantalk.xml`
|
||||
@@ -694,6 +705,10 @@
|
||||
- 최신 팬Talk의 프로필 28dp 원형 이미지, 댓글 본문 2줄 말줄임, chevron-down 아이콘을 표시한다.
|
||||
- 검증 기준:
|
||||
- 팬Talk는 `addCommentCard`가 아니라 `ListComment` 대응 View/layout으로 렌더링된다.
|
||||
- 검증 기록:
|
||||
- 2026-06-15: Figma `296:14989`를 확인해 팬Talk 섹션이 `SectionTitle`, 374dp `ListComment` card, `전체` label과 total count, 28dp 프로필, 2줄 말줄임 본문, 18dp chevron-down 구조임을 반영했다. RED로 `CreatorChannelHomeActivitySourceTest`에 팬Talk 전용 layout/custom view, 402dp 기준 374dp width 비율 계산, `addCommentCard` 제거 계약을 추가했고, 구현 후 focused source test와 creator channel 전체 테스트가 PASS했다. `전체` label은 기존 다국어 string `screen_chat_filter_all`을 재사용했다.
|
||||
- 2026-06-15: reviewer gate에서 `latestFanTalk == null` 리바인드 시 이전 ViewHolder의 프로필/본문이 남을 수 있다는 FAIL을 받았다. RED로 `layout_fantalk_latest_row`, null 시 row 숨김, 본문 빈 문자열, placeholder 초기화 계약을 추가한 뒤, `bindFanTalk()`에서 최신 팬Talk 유무에 따라 row visibility와 값을 명시적으로 초기화했다. 수정 후 focused source test와 creator channel 전체 테스트, 리소스/컴파일/ktlint/diff check가 PASS했다.
|
||||
- 2026-06-15: 사용자 후속 요청으로 팬Talk가 없을 때 표시할 empty UI Figma `304:17362`를 반영했다. 기존에는 `totalCount=0`, `latestFanTalk=null`이면 FanTalk section을 생성하지 않았지만, empty card 표시를 위해 mapper가 항상 FanTalk section을 포함하도록 변경했다. `item_creator_channel_home_fantalk.xml`에는 `layout_fantalk_empty`를 추가하고, `당신의 첫 응원을\n기다리고 있어요!` 문구와 `ic_new_fantalk_plus` 아이콘, `응원 남기기` 흰색 capsule 버튼을 배치했다. `bindFanTalk()`는 최신 팬Talk가 있으면 total/latest row를 표시하고 empty UI를 숨기며, 없으면 total/latest row를 숨기고 empty UI를 표시하도록 변경했다.
|
||||
|
||||
- [ ] **Task 5R.10: 소개 섹션 재구성**
|
||||
- 수정 예정:
|
||||
@@ -934,3 +949,4 @@
|
||||
- 2026-06-14: Phase 5 SNS 후속 리뷰 검증으로 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelHomeMapperTest"`, `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelHomeActivitySourceTest"`, `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*"`, `./gradlew :app:compileDebugKotlin`, `./gradlew :app:ktlintCheck`, `git diff --check`를 실행했다. 모두 `BUILD SUCCESSFUL` 또는 출력 없음(`git diff --check`)을 확인했다. 첫 RED 테스트 시도는 sandbox의 `~/.gradle` lock 파일 접근 제한으로 실패해 승인 후 재실행했다. `ktlintCheck`의 `.editorconfig disabled_rules` deprecation 경고는 기존 설정 경고로 이번 변경과 무관하다.
|
||||
- 2026-06-15: 사용자 요청에 따라 탭 바 아래 홈 컨텐츠를 전부 삭제 후 Figma `296:14895`의 `SectionTitle`, `Contents`, `Feed`, `ListComment`, `SNS` 컴포넌트 기준으로 다시 구성하는 Phase 5R을 추가했다. 각 홈 섹션을 하나의 Task로 분리했고, 현재 API 응답에 없는 `화보` 섹션은 이번 재구성 구현 범위에서 제외한다고 명시했다. 이번 단계는 문서 수정만 수행했으며 구현/빌드/테스트는 실행하지 않았다.
|
||||
- 2026-06-15: Phase 5R.4 공지 섹션 재구성으로 Figma `296:14915` 기준 `SectionTitle`, `ic_pin` Notice label, 프로필/작성자/날짜, 본문, 선택 썸네일을 가진 공지 전용 가로 feed card를 추가했다. 공지는 최대 3개까지 표시하고, item width는 402dp 기준 최대 346dp 및 작은 화면 비율 축소로 계산한다. RED로 공지 row/custom thumbnail 부재와 기존 374dp width 계산 실패를 확인한 뒤 구현했으며, `CreatorChannelHomeActivitySourceTest` 공지 단일 테스트 2개, `kr.co.vividnext.sodalive.v2.creator.channel.*`, `:app:mergeDebugResources`, `:app:compileDebugKotlin`, `:app:ktlintCheck`, `git diff --check`가 모두 PASS했다. `ktlintCheck`의 `.editorconfig disabled_rules` deprecation 경고는 기존 설정 경고로 이번 변경과 무관하다.
|
||||
- 2026-06-15: 코드 리뷰에서 커뮤니티 카드가 `setFeedSize(374dp 기준)` 호출 후 `LinearLayout.LayoutParams.MATCH_PARENT`로 덮여 실제 폭 계산이 적용되지 않는다는 지적을 확인했다. `CreatorChannelHomeSectionAdapter.bindCommunities()`에서 `communityWidthDp`를 한 번 계산해 `FeedSize.rootWidthDp`와 row `layoutParams.width`에 동일하게 적용하도록 수정하고, `CreatorChannelHomeActivitySourceTest`가 `communityWidthDp.dp()` 계약을 검증하도록 갱신했다.
|
||||
|
||||
Reference in New Issue
Block a user