From 402ea5e9c0526ab6f83517578e5088aea2e9ffcc Mon Sep 17 00:00:00 2001 From: klaus Date: Mon, 15 Jun 2026 13:19:56 +0900 Subject: [PATCH] =?UTF-8?q?docs(creator):=20=EC=B1=84=EB=84=90=20=ED=99=88?= =?UTF-8?q?=20=EC=84=B8=EB=B6=80=20=EA=B5=AC=ED=98=84=20=EA=B3=84=ED=9A=8D?= =?UTF-8?q?=EC=9D=84=20=EA=B0=B1=EC=8B=A0=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plan-task.md | 397 +++++++++++++++++- docs/20260611_크리에이터_채널_홈_탭/prd.md | 40 ++ 2 files changed, 431 insertions(+), 6 deletions(-) diff --git a/docs/20260611_크리에이터_채널_홈_탭/plan-task.md b/docs/20260611_크리에이터_채널_홈_탭/plan-task.md index ace8f646..fe3c4fcf 100644 --- a/docs/20260611_크리에이터_채널_홈_탭/plan-task.md +++ b/docs/20260611_크리에이터_채널_홈_탭/plan-task.md @@ -297,7 +297,7 @@ ### Phase 5: 레이아웃과 홈 탭 UI 연결 -- [ ] **Task 5.1: 화면 layout 생성** +- [x] **Task 5.1: 화면 layout 생성** - 생성: - `app/src/main/res/layout/activity_creator_channel_home.xml` - 작업: @@ -306,14 +306,15 @@ - title-bar는 이미지 위 overlay로 배치하고 `ic_new_bar_back`, `ic_new_more`를 사용한다. - follow, following, bell icon view를 title-bar 우측에 배치한다. - `대화하기`, `DM 보내기` 버튼 영역은 버튼이 없어도 높이를 보존할 수 있는 container로 만든다. - - tab-bar는 7개 탭을 표시할 container로 만든다. + - tab-bar는 7개 긴 라벨이 가로 폭을 초과해도 표시되도록 `HorizontalScrollView` + 동적 `TextView` container로 만든다. + - 각 tab 이름은 하드코딩 문자열이 아니라 `CreatorChannelTab.labelResId`와 `values`, `values-en`, `values-ja` string resource를 사용한다. - 홈 컨텐츠는 `RecyclerView` 또는 기존 섹션 패턴에 맞는 container로 둔다. - 검증 명령: - `./gradlew :app:mergeDebugResources` - 기대 결과: - 신규 layout과 drawable 참조가 resource merge를 통과한다. -- [ ] **Task 5.2: 홈 섹션 Adapter와 item layout 추가** +- [x] **Task 5.2: 홈 섹션 Adapter와 item layout 추가** - 생성: - `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/ui/CreatorChannelHomeSectionAdapter.kt` - `app/src/main/res/layout/item_creator_channel_home_live.xml` @@ -338,7 +339,7 @@ - 기대 결과: - section adapter와 item layout이 컴파일된다. -- [ ] **Task 5.3: Activity 생성 및 ViewModel observe 연결** +- [x] **Task 5.3: Activity 생성 및 ViewModel observe 연결** - 생성: - `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelHomeActivity.kt` - `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelHomeActivitySourceTest.kt` @@ -346,17 +347,19 @@ - `app/src/main/AndroidManifest.xml` - 작업: - `EXTRA_CREATOR_ID`와 `newIntent(context, creatorId)`를 추가한다. + - 7개 tab은 `content.tabs`를 순회하며 `getString(tab.labelResId)`로 생성한다. - `creatorId <= 0`이면 API 호출 없이 finish한다. - `onCreate`에서 ViewModel observe, adapter, tab-bar, title-bar click listener를 연결한다. - `onCreate` 또는 `onStart`에서 `viewModel.loadHome(creatorId)`를 호출한다. - Manifest에 Activity를 등록한다. + - Source test에서 `HorizontalScrollView` 탭 구조, string resource 기반 탭명, 채팅/DM 이동 계약, Manifest 등록, `CreatorFollowNotifyFragment` 미참조를 검증한다. - 검증 명령: - `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelHomeActivitySourceTest"` - `./gradlew :app:compileDebugKotlin` - 기대 결과: - intent extra, invalid creatorId 처리, Manifest 등록 검증이 PASS한다. -- [ ] **Task 5.4: title-bar와 이미지 영역 bind 구현** +- [x] **Task 5.4: title-bar와 이미지 영역 bind 구현** - 수정: - `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelHomeActivity.kt` - 작업: @@ -370,7 +373,7 @@ - 기대 결과: - header/title bind가 컴파일된다. -- [ ] **Task 5.5: 대화하기/DM 버튼 표시와 이동 연결** +- [x] **Task 5.5: 대화하기/DM 버튼 표시와 이동 연결** - 수정: - `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelHomeActivity.kt` - 작업: @@ -387,6 +390,352 @@ - 기대 결과: - 버튼 표시 조건과 AI 채팅/DM 이동이 컴파일된다. +- [x] **Task 5.6: Phase 5 코드 리뷰 지적 title-bar capsule 구조 수정** + - 수정: + - `app/src/main/res/layout/activity_creator_channel_home.xml` + - `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelHomeActivity.kt` + - `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelHomeActivitySourceTest.kt` + - 생성: + - `app/src/main/res/drawable/bg_creator_channel_follow_capsule.xml` + - `app/src/main/res/drawable/bg_creator_channel_following_capsule.xml` + - 작업: + - Figma `296:14287`의 미팔로우 상태는 follow icon + `팔로우` 텍스트가 하나의 capsule 안에 표시되도록 구성한다. + - Figma `296:14288`, `296:14289`의 팔로우 상태는 흰색 원형 capsule 안 follow icon, 별도 bell icon, 별도 more icon 구조로 표시되도록 구성한다. + - 기존 `tv_follow`와 `iv_follow`가 배경 없이 나란히 놓인 구조를 제거한다. + - 검증 명령: + - `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelHomeActivitySourceTest"` + - `./gradlew :app:mergeDebugResources` + - `./gradlew :app:compileDebugKotlin` + - 기대 결과: + - title-bar 상태별 capsule 구조 source 계약과 리소스/컴파일이 PASS한다. + +- [x] **Task 5.7: Phase 5 코드 리뷰 지적 홈 섹션 데이터 보존 수정** + - 수정: + - `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/ui/CreatorChannelHomeSectionAdapter.kt` + - `app/src/main/res/values/strings.xml` + - `app/src/main/res/values-en/strings.xml` + - `app/src/main/res/values-ja/strings.xml` + - `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelHomeActivitySourceTest.kt` + - 작업: + - 모든 section을 `tv_section_title`/`tv_primary`/`tv_secondary`/`iv_thumbnail` 공통 카드 하나로 동일 처리하던 바인딩을 section별 `bind*` 함수로 분리한다. + - 오디오/시리즈/커뮤니티/SNS 등 list section은 `firstOrNull()` 또는 단일 `joinToString()` 축약으로 주요 데이터를 버리지 않고 여러 항목 텍스트를 줄 단위로 보존한다. + - 활동 section은 `debutDateUtc`, `liveCount`, `liveDurationHours`, `liveContributorCount`, `audioContentCount`, `seriesCount`를 모두 resource format으로 표시한다. + - 검증 명령: + - `./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:ktlintCheck` + - 기대 결과: + - section별 데이터 보존 source 계약, creator channel 테스트, ktlint가 PASS한다. + +- [x] **Task 5.8: Phase 5 코드 리뷰 Findings 반영** + - 수정: + - `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelHomeActivity.kt` + - `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/ui/CreatorChannelHomeSectionAdapter.kt` + - `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelHomeActivitySourceTest.kt` + - 작업: + - 시리즈 가로 타일 row는 화면 밖으로 잘리지 않도록 가로 스크롤 가능한 컨테이너에 넣는다. + - SNS 버튼은 `CreatorChannelSnsUiItem.url`을 사용해 외부 링크 intent를 실행할 수 있게 한다. + - 일정 타입은 서버 code가 아니라 `CreatorActivityType.labelResId` 기반 다국어 label로 표시한다. + - 크리에이터 채널 홈 화면은 어두운 헤더 위 status bar icon 가독성을 위해 light status bar를 끈다. + - 검증 명령: + - `./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` + - 기대 결과: + - Phase 5 코드 리뷰 Findings 4건이 모두 source 계약과 빌드/테스트에서 PASS한다. + +- [x] **Task 5.9: Phase 5 추가 리뷰 반영** + - 수정: + - `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelHomeActivity.kt` + - `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelHomeViewModel.kt` + - `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/ui/CreatorChannelHomeSectionAdapter.kt` + - `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelHomeActivitySourceTest.kt` + - `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelHomeViewModelTest.kt` + - 작업: + - SNS 버튼은 고정 52dp가 아니라 52dp를 최대값으로 두고, 디바이스 width가 402dp보다 작으면 `52 * width / 402` 비율로 축소한다. + - toast 이벤트는 화면 재생성 시 중복 표시되지 않도록 `CreatorChannelEvent`로 한 번만 소비되게 한다. + - 검증 명령: + - `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelHomeActivitySourceTest"` + - `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelHomeViewModelTest"` + - `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*"` + - `./gradlew :app:compileDebugKotlin` + - `./gradlew :app:ktlintCheck` + - 기대 결과: + - SNS 버튼 크기 비율 계산과 toast 단발 이벤트 계약이 PASS한다. + +- [x] **Task 5.10: Phase 5 코드 리뷰 Finding 1/2와 SNS 아이콘 정책 반영** + - 수정: + - `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/model/CreatorChannelHomeUiModels.kt` + - `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/model/CreatorChannelHomeMappers.kt` + - `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/ui/CreatorChannelHomeSectionAdapter.kt` + - `app/src/main/res/values/strings.xml` + - `app/src/main/res/values-en/strings.xml` + - `app/src/main/res/values-ja/strings.xml` + - `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelHomeActivitySourceTest.kt` + - 작업: + - 활동 섹션의 데뷔 row는 `데뷔` label과 `debutDateUtc(dDay)` 형식 value를 resource format으로 표시한다. + - 활동 섹션의 count/hour/person/content/series 값은 단위가 포함된 resource format으로 표시한다. + - 오디오 콘텐츠 섹션은 각 항목을 세로로 쌓지 않고 단일 가로 스크롤 row로 표시한다. + - SNS는 텍스트 버튼이 아니라 `ic_sns_`로 시작하는 drawable icon을 사용하는 원형 아이콘 버튼으로 표시한다. + - 검증 명령: + - `./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` + - 기대 결과: + - 활동 섹션 단위 표시, 오디오 가로 스크롤, SNS 아이콘 source 계약과 빌드/테스트가 PASS한다. + +- [x] **Task 5.11: Phase 5 SNS 순서/URL 안전성/마지막 여백 리뷰 반영** + - 수정: + - `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/model/CreatorChannelHomeMappers.kt` + - `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/ui/CreatorChannelHomeSectionAdapter.kt` + - `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelHomeMapperTest.kt` + - `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelHomeActivitySourceTest.kt` + - 작업: + - SNS 매핑 순서를 Figma `296:14890` 기준 `Instagram`, `YouTube`, `X`, `Kakao Open Chat`, `Fancimm` 순서로 맞춘다. + - blank가 아니더라도 유효하지 않은 SNS URL은 UI item에서 제외한다. + - SNS 링크 클릭 시 `resolveActivity()`로 열 수 있는 intent만 실행한다. + - 작은 화면 SNS 버튼 비율 축소 정책은 유지하되, 마지막 아이콘 뒤 trailing `marginEnd`만 제거한다. + - 검증 명령: + - `./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` + - 기대 결과: + - SNS 순서, URL 안전성, 마지막 margin source 계약과 빌드/테스트가 PASS한다. + +--- + +### Phase 5R: 탭 바 아래 홈 컨텐츠 Figma Component 기준 재구성 + +> 2026-06-15 사용자 요청으로 추가된 후속 재구성 Phase다. 기존 Task 5.2에서 만든 탭 바 아래 홈 섹션 UI는 삭제 대상으로 보고, Figma `296:14895`에 있는 component 성격의 구조를 섹션별 Task로 다시 구성한다. 이번 문서 수정 단계에서는 구현하지 않는다. + +- [x] **Task 5R.0: 기존 홈 섹션 동적 조립 UI 제거 계획 확정** + - 수정 예정: + - `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/ui/CreatorChannelHomeSectionAdapter.kt` + - `app/src/main/res/layout/item_creator_channel_home_*.xml` + - `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelHomeActivitySourceTest.kt` + - 작업: + - 확인 결과 `CreatorChannelHomeSectionAdapter`는 `bind*` 함수에서 `addHeroCard`, `addAudioCard`, `createContentTile`, `addFeedCard`, `addScheduleRow`, `addDonationCard`, `addCommentCard`, `addTextCard`, `addActivityRow`, `createSnsButton` 등으로 view를 코드에서 직접 생성하고 있으므로 Phase 5R 섹션별 Task에서 삭제 대상으로 확정한다. + - 확인 결과 12개 `item_creator_channel_home_*.xml`은 동일한 `tv_section_title`/`ll_section_items` 컨테이너만 갖는 구조를 공유하므로 Phase 5R 재구성에서는 이 공통 컨테이너 구조를 재사용하지 않는다. + - adapter는 `getItemViewType()`, `onCreateViewHolder()`, `ViewHolder.bind()`에서 섹션 타입을 선택하고 해당 XML/ViewBinding 또는 재사용 가능한 Android View에 데이터를 전달하는 역할로 축소한다. + - 실제 UI 구성은 섹션별 XML/ViewBinding 또는 재사용 가능한 Android View로 옮기며, adapter 내부에서 `LinearLayout`, `TextView`, `ImageView`, `HorizontalScrollView`를 조합해 화면 구조를 만드는 패턴은 제거한다. + - 재사용 후보로 `AudioContentCardView`, `SeriesContentCardView`, `FeedAdapter`, `FeedCommunityView`, `LiveThumbnailSimpleView`, `LiveThumbnailDetailView`, `view_section_title.xml`을 확인했으며, 각 섹션 Task에서 Figma 요구와 맞는지 먼저 판정한다. + - Figma `296:14895`에는 `화보` 섹션이 있으나 현재 홈 API 응답에는 화보 데이터가 없으므로 이번 재구성 범위에서 제외한다. + - 검증 명령: + - 문서 단계에서는 실행하지 않는다. + - 기대 결과: + - 기존 구현을 어떤 기준으로 제거하고 어떤 단위로 재구성할지 문서에 명확히 남는다. + - 확인 근거: + - `CreatorChannelHomeSectionAdapter.kt`는 현재 섹션별 `bind*`에서 코드 생성 helper를 호출해 실제 UI를 조립한다. + - `item_creator_channel_home_live.xml`을 포함한 섹션 layout은 `tv_section_title`과 `ll_section_items` 중심의 동일 컨테이너 구조다. + - `view_section_title.xml`과 v2 widget/feed/live thumbnail 계열 컴포넌트는 재사용 후보로 확인했다. + - 검증 기록: + - 2026-06-15: 문서 확정 Task라 빌드/테스트는 실행하지 않았다. `rg`와 파일 확인으로 삭제 대상 helper, 공통 컨테이너 layout, 재사용 후보 컴포넌트를 확인했다. + +- [x] **Task 5R.1: 현재 라이브 섹션 재구성** + - 수정 예정: + - `CreatorChannelHomeSectionAdapter.kt` + - `item_creator_channel_home_live.xml` + - 필요 시 현재 라이브 전용 View/layout + - Figma 기준: + - `296:14897`의 현재 라이브 섹션 + - 최상단 현재 라이브는 `SectionTitle` 없이 374dp x 78dp cyan gradient pill card로 표시한다. + - 작업: + - `currentLive`가 null이면 섹션을 표시하지 않는다. + - `item_creator_channel_home_live.xml`은 기존 `tv_section_title`/`ll_section_items` 공통 컨테이너를 제거하고 현재 라이브 전용 layout id로 구성한다. + - 라이브 제목, 시작 시간, 유료 가격 capsule, 성인 상태가 있으면 Figma 라이브 카드 구조에 맞춰 표시한다. + - 기존 `LiveThumbnail*` 계열 위젯은 원형 프로필/썸네일 기반 구조라 `296:14897`의 pill card와 맞지 않아 재사용하지 않는다. + - 검증 기준: + - adapter가 `addHeroCard` 동적 helper로 라이브 카드를 만들지 않고 `item_creator_channel_home_live.xml`의 전용 view id를 bind한다. + - 검증 기록: + - 2026-06-15: Figma `296:14897`을 확인해 현재 라이브가 `SectionTitle`/썸네일 없는 374dp x 78dp cyan gradient pill card임을 반영했다. RED로 `CreatorChannelHomeActivitySourceTest`에 live 전용 layout/bind 계약을 추가해 기존 구현 실패를 확인했고, 구현 후 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelHomeActivitySourceTest"`, `./gradlew :app:mergeDebugResources`, `./gradlew :app:compileDebugKotlin`, `./gradlew :app:ktlintCheck`, `git diff --check`가 PASS했다. `ktlintCheck`의 `.editorconfig disabled_rules` deprecation 경고와 Kotlin deprecation warning은 기존 경고로 이번 변경과 무관하다. + +- [x] **Task 5R.2: 최신 오디오 섹션 재구성** + - 수정 예정: + - `CreatorChannelHomeSectionAdapter.kt` + - `item_creator_channel_home_latest_audio.xml` + - 필요 시 오디오 list row 전용 View/layout + - Figma 기준: + - `296:14898`의 최신 오디오 `Contents` 변형 card + - 최상단 최신 오디오는 `SectionTitle` 없이 gray 900 card 안에 88dp 썸네일, Point 태그, `New` label, 제목, duration을 표시한다. + - 작업: + - `latestAudioContent`가 null이면 섹션을 표시하지 않는다. + - Figma card 구조에 맞춰 이미지, Point 태그, `New` label, 제목, duration을 표시한다. + - 기존 `AudioContentCardView`는 Point 태그 구성은 유사하지만 세로 카드 구조라 `296:14898`과 맞지 않아 재사용하지 않고 전용 layout을 만든다. + - 검증 기준: + - 최신 오디오는 `addAudioCard` 같은 코드 생성 helper 없이 `item_creator_channel_home_latest_audio.xml`의 전용 view id를 bind한다. + - 검증 기록: + - 2026-06-15: Figma `296:14898`을 확인해 최신 오디오가 `SectionTitle` 없는 `Contents` 변형 card이며 기존 `AudioContentCardView`와 UI 구성이 다름을 반영했다. RED로 `CreatorChannelHomeActivitySourceTest`에 최신 오디오 전용 layout/bind 계약을 추가해 기존 구현 실패를 확인했고, 구현 후 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelHomeActivitySourceTest"`, `./gradlew :app:mergeDebugResources`, `./gradlew :app:compileDebugKotlin`, `./gradlew :app:ktlintCheck`, `git diff --check`가 PASS했다. `ktlintCheck`의 `.editorconfig disabled_rules` deprecation 경고와 Kotlin deprecation warning은 기존 경고로 이번 변경과 무관하다. + - 2026-06-15: `docs/agent-guides/code-style.md`의 radius clipping 규칙에 따라 `item_creator_channel_home_latest_audio.xml`의 `android:clipToOutline` 속성을 제거하고, `CreatorChannelLatestAudioThumbnailView`에서 `clipToOutline = true`와 `ViewOutlineProvider.setRoundRect(...)`를 함께 설정하도록 수정했다. `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelHomeActivitySourceTest"`, `./gradlew :app:mergeDebugResources`, `./gradlew :app:compileDebugKotlin`, `./gradlew :app:ktlintCheck`, `git diff --check`가 PASS했다. + +- [x] **Task 5R.3: 후원 섹션 재구성** + - 수정 예정: + - `CreatorChannelHomeSectionAdapter.kt` + - `item_creator_channel_home_donation.xml` + - 필요 시 후원 row 전용 View/layout + - Figma 기준: + - `296:14895`의 list/comment 계열 스타일 + - 공통 제목은 `SectionTitle` + - 작업: + - `channelDonations`가 empty이면 섹션을 표시하지 않는다. + - 후원자 프로필, 닉네임, 후원 메시지, can 수량을 표시한다. + - 비밀 후원은 기존 채널 후원 UI 정책을 확인해 닉네임/프로필 노출 방식을 맞춘다. + - 검증 기준: + - 후원 항목은 섹션 전용 row layout 또는 기존 후원 item layout 재사용으로 렌더링된다. + - 검증 기록: + - 2026-06-15: Figma `296:14908`을 확인해 후원 섹션이 `SectionTitle`, 가로 스크롤 후원 카드 row, `ic_new_donation` 후원하기 버튼 구조임을 반영했다. `CreatorChannelHomeActivitySourceTest`에 후원 전용 layout/row bind, can 수량별 헤더 배경색, 402dp 기준 최대 374dp/작은 화면 비율 축소, 최대 8개 표시, 빈 메시지 fallback 다국어 계약을 RED로 추가한 뒤 구현했다. 후원 메시지가 blank이면 `%1$d캔을 후원하였습니다.` 형식의 다국어 string을 표시하고, can 배경색은 1~50 `#E2E2E2`, 51~100 `#73FF01`, 101~499 `#00EAFF`, 500 이상 `#FF4C3C`로 매핑했다. 비밀 후원은 기존 채널 후원 UI 정책 확인 결과 닉네임/프로필을 숨기지 않으므로 동일하게 노출한다. `./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했다. `ktlintCheck`의 `.editorconfig disabled_rules` deprecation 경고와 Kotlin/Java deprecation warning은 기존 경고로 이번 변경과 무관하다. + - 2026-06-15: 후속 수정으로 `item_creator_channel_home_donation_row.xml`의 XML `android:clipToOutline`을 제거하고 `CreatorChannelDonationCardView` custom view에서 `clipToOutline = true`와 `ViewOutlineProvider.setRoundRect(..., R.dimen.radius_14)`를 설정하도록 변경했다. 또한 Figma 구조에 맞춰 후원하기 버튼 참조 기준을 child `tv_donation_button`이 아니라 parent `layout_donation_button`으로 고정하고 관련 source test 계약을 갱신했다. + +- [x] **Task 5R.4: 공지 섹션 재구성** + - 수정 예정: + - `CreatorChannelHomeSectionAdapter.kt` + - `item_creator_channel_home_notice.xml` + - 필요 시 공지 row/feed 전용 View/layout + - Figma 기준: + - `296:14915`의 공지 섹션 구조 + - 공통 제목은 `SectionTitle` + - 공지는 `ic_pin` + `Notice` label, 프로필 42dp, 작성자/날짜, 본문, 선택 이미지 썸네일을 가진 feed card로 표시한다. + - 공지 item UI width는 디바이스 width 402dp 기준 최대 346dp이며, 402dp 미만에서는 같은 비율로 축소한다. + - 작업: + - `notices`가 empty이면 섹션을 표시하지 않는다. + - 공지는 1개 고정이 아니라 최대 3개까지 가로 row에 나열한다. + - 공지 item width는 `346 * deviceWidth / 402` 비율로 계산하되 402dp 이상에서는 346dp로 고정한다. + - 공지 본문, 날짜, 이미지가 있으면 이미지 영역을 표시한다. + - 유료/잠금 상태 표현이 필요한 경우 Figma `Lock` 구조와 API `price` 값을 연결한다. + - 검증 기준: + - 공지 섹션은 공통 텍스트 카드가 아니라 공지 전용 layout으로 렌더링된다. + - 검증 기록: + - 2026-06-15: Figma `296:14915`를 확인해 공지 섹션이 `SectionTitle`, `ic_pin` Notice label, 프로필/작성자/날짜, 본문, 선택 썸네일을 가진 가로 feed card 구조임을 반영했다. 사용자 피드백에 따라 공지는 1개가 아니라 최대 3개까지 `HorizontalScrollView` row에 나열하고, 공지 item width는 디바이스 width 402dp 기준 최대 346dp이며 402dp 미만에서는 `346 * deviceWidth / 402` 비율로 축소하도록 구현했다. RED로 `CreatorChannelHomeActivitySourceTest`에 공지 전용 layout/row bind, 최대 3개 제한, 마지막 카드 trailing margin 제거, 이미지 null/blank 시 썸네일 숨김, radius clipping custom view, 346dp width 계산 계약을 추가했고 기존 구현이 row layout/custom thumbnail view 부재 및 374dp width 계산으로 실패함을 확인했다. 구현 후 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelHomeActivitySourceTest.공지 섹션은 최대 3개 Figma feed card를 가로 row로 렌더링한다"`, `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelHomeActivitySourceTest.공지 컴포넌트 width는 402dp 기준 최대 346dp이고 작은 화면에서는 비율 축소한다"`, `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*"`, `./gradlew :app:mergeDebugResources`, `./gradlew :app:compileDebugKotlin`, `./gradlew :app:ktlintCheck`, `git diff --check`가 PASS했다. `ktlintCheck`의 `.editorconfig disabled_rules` deprecation 경고와 Kotlin/Gradle deprecation warning은 기존 경고로 이번 변경과 무관하다. + +- [x] **Task 5R.5: 일정 섹션 재구성** + - 수정 예정: + - `CreatorChannelHomeSectionAdapter.kt` + - `item_creator_channel_home_schedule.xml` + - 필요 시 일정 row 전용 View/layout + - Figma 기준: + - `296:14895`의 list row 구조 + - 공통 제목은 `SectionTitle` + - 작업: + - `schedules`가 empty이면 섹션을 표시하지 않는다. + - 일정 타입은 `CreatorActivityType.labelResId`로 표시한다. + - 일정 제목과 일시를 Figma row 구조에 맞춘다. + - 검증 기준: + - 일정은 `addScheduleRow` 동적 생성 없이 전용 row bind로 렌더링된다. + - 검증 기록: + - 2026-06-15: Figma `296:14947`을 확인해 일정 섹션이 `SectionTitle`, 351dp feed card, 53dp calendar 영역, 타입 tag, 로컬 시간 텍스트를 가진 세로 3개 row 구조임을 반영했다. 사용자 추가 요구에 따라 `scheduledAtUtc`는 UTC로 파싱한 뒤 디바이스 Timezone 기준 날짜/요일/시간으로 표시한다. 스케줄은 `scheduledAtUtc`가 가장 가까운 순으로 정렬해 최대 3개만 매핑한다. 스케줄 item 클릭은 콘텐츠(`AUDIO`, `LIVE_REPLAY`)는 `AudioContentDetailActivity`로, 라이브(`LIVE`)는 예약 라이브를 고려해 `LiveRoomActivity` 직접 진입이 아니라 `LiveRoomDetailFragment` 표시로 연결했다. RED로 `CreatorChannelHomeMapperTest`와 `CreatorChannelHomeActivitySourceTest`에 정렬/최대 3개, 전용 layout/row bind, Timezone 변환, 상세 이동 계약을 추가했고, 기존 구현이 `formatCreatorChannelSchedule*` 미구현으로 실패함을 확인했다. 구현 후 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelHomeMapperTest.스케줄은 scheduledAtUtc가 가까운 순으로 최대 3개만 매핑한다"`와 일정 source/timezone/navigation 테스트 3건이 PASS했다. 최종 검증으로 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*"`, `./gradlew :app:mergeDebugResources`, `./gradlew :app:compileDebugKotlin`, `./gradlew :app:ktlintCheck`, `git diff --check`가 PASS했다. `ktlintCheck`의 `.editorconfig disabled_rules` deprecation 경고와 Kotlin/Gradle deprecation warning은 기존 경고로 이번 변경과 무관하다. + - 2026-06-15: 후속 확인에서 Figma `296:14953`의 왼쪽 timeline indicator가 누락되어 있음을 확인하고 추가 구현했다. `item_creator_channel_home_schedule.xml`에 `ll_schedule_timeline` column을 추가하고, `CreatorChannelHomeSectionAdapter`에서 실제 표시 스케줄 수만큼 dot을 만들며 dot 사이 line 개수는 `scheduleCount - 1`개로 계산한다. 첫 dot은 Figma처럼 `soda_400`, 나머지 dot과 line은 `gray_700`으로 표시한다. RED로 `CreatorChannelHomeActivitySourceTest`에 timeline dot/line 동적 생성 계약을 추가해 `calculateCreatorChannelScheduleTimelineLineCount` 미구현 실패를 확인했고, 구현 후 해당 테스트와 `./gradlew :app:mergeDebugResources`가 PASS했다. + +- [ ] **Task 5R.6: 오디오 컨텐츠 섹션 재구성** + - 수정 예정: + - `CreatorChannelHomeSectionAdapter.kt` + - `item_creator_channel_home_audio.xml` + - 필요 시 `Contents` audio variant 대응 View/layout + - Figma 기준: + - `296:14895`의 오디오 컨텐츠 섹션 + - Figma `Contents(type=audio, size=s)` 또는 해당 섹션의 88dp list row 구조 + - 작업: + - `audioContents`가 empty이면 섹션을 표시하지 않는다. + - 각 오디오 항목은 이미지, 제목, 시리즈명/시간, 유료/무료/포인트/first/original 상태를 Figma tag 정책에 맞춰 표시한다. + - 기존 `AudioContentCardView` 재사용 여부를 먼저 판정하고, 요구와 다르면 전용 Android View를 만든다. + - 검증 기준: + - 오디오 컨텐츠는 adapter 내부 `createContentTile`이 아니라 component/layout bind로 표시된다. + +- [ ] **Task 5R.7: 시리즈 섹션 재구성** + - 수정 예정: + - `CreatorChannelHomeSectionAdapter.kt` + - `item_creator_channel_home_series.xml` + - 필요 시 `Contents` series variant 대응 View/layout + - Figma 기준: + - `296:14895`의 시리즈 섹션 + - Figma `Contents(type=series, size=m)` + - 작업: + - `series`가 empty이면 섹션을 표시하지 않는다. + - 시리즈 썸네일은 163dp x 230dp 비율과 radius 14dp를 따른다. + - `isOriginal`, `isNew`, `isPopular`, `isComplete`, `numberOfContent`, `publishedDaysOfWeek`를 Figma tag/label 정책에 맞춰 표시한다. + - 기존 `SeriesContentCardView` 또는 시리즈 카드 layout을 재사용할 수 있는지 먼저 확인한다. + - 검증 기준: + - 시리즈 섹션은 Figma `Contents` 구조에 대응하는 View/layout으로 렌더링된다. + +- [ ] **Task 5R.8: 커뮤니티 섹션 재구성** + - 수정 예정: + - `CreatorChannelHomeSectionAdapter.kt` + - `item_creator_channel_home_community.xml` + - 필요 시 커뮤니티 feed 전용 View/layout + - Figma 기준: + - `296:14895`의 `Feed` 구조 + - 작업: + - `communities`가 empty이면 섹션을 표시하지 않는다. + - 프로필 42dp 원형 이미지, 작성자, 작성 시간, 본문, 이미지, 잠금 overlay, 좋아요/댓글 reaction을 표시한다. + - 기존 `FeedCommunityView` 또는 `FeedAdapter` 재사용 여부를 먼저 확인한다. + - Figma의 `전체보기` capsule 버튼을 표시하되, 이동 대상이 없는 경우 click listener는 후속 범위로 분리한다. + - 검증 기준: + - 커뮤니티는 단순 `addFeedCard`가 아니라 Figma `Feed` 구조를 가진 View/layout으로 렌더링된다. + +- [ ] **Task 5R.9: 팬Talk 섹션 재구성** + - 수정 예정: + - `CreatorChannelHomeSectionAdapter.kt` + - `item_creator_channel_home_fantalk.xml` + - 필요 시 `ListComment` 대응 View/layout + - Figma 기준: + - `296:14895`의 `ListComment` + - 작업: + - `fanTalk.latestFanTalk`가 null이고 `totalCount`도 0이면 섹션을 표시하지 않는다. + - `전체` label과 total count를 표시한다. + - 최신 팬Talk의 프로필 28dp 원형 이미지, 댓글 본문 2줄 말줄임, chevron-down 아이콘을 표시한다. + - 검증 기준: + - 팬Talk는 `addCommentCard`가 아니라 `ListComment` 대응 View/layout으로 렌더링된다. + +- [ ] **Task 5R.10: 소개 섹션 재구성** + - 수정 예정: + - `CreatorChannelHomeSectionAdapter.kt` + - `item_creator_channel_home_introduce.xml` + - Figma 기준: + - `296:14895`의 소개 본문 텍스트 영역 + - `SectionTitle(hasRightIcon=false)` + - 작업: + - `introduce`가 blank이면 섹션을 표시하지 않는다. + - 소개 본문은 카드 배경 없이 16sp regular, white, 362dp 폭 기준으로 표시한다. + - 검증 기준: + - 소개 섹션은 `addTextCard` 같은 어두운 카드 배경을 사용하지 않는다. + +- [ ] **Task 5R.11: 활동 섹션 재구성** + - 수정 예정: + - `CreatorChannelHomeSectionAdapter.kt` + - `item_creator_channel_home_activity.xml` + - Figma 기준: + - `296:14895`의 활동 label/value row 목록 + - `SectionTitle(hasRightIcon=false)` + - 작업: + - 배경 카드 없이 label/value row를 세로로 나열한다. + - 데뷔, 라이브 총 진행 수, 라이브 누적 진행 시간, 라이브 누적 참여자, 오디오, 시리즈를 표시한다. + - Figma에는 화보 row가 있으나 현재 API 응답에 화보 count가 없으므로 이번 범위에서는 표시하지 않는다. + - 검증 기준: + - 활동 row는 `bg_round_corner_16_7_222222` 같은 row 배경을 사용하지 않는다. + +- [ ] **Task 5R.12: SNS 섹션 재구성** + - 수정 예정: + - `CreatorChannelHomeSectionAdapter.kt` + - `item_creator_channel_home_sns.xml` + - 필요 시 `SNS` 대응 View/layout + - Figma 기준: + - `296:14895`의 `SNS` + - 작업: + - `sns` 매핑 결과가 empty이면 섹션을 표시하지 않는다. + - SNS 제목은 Figma처럼 18sp bold title 영역을 사용한다. + - 아이콘 순서는 Instagram, YouTube, X, Kakao Open Chat, Fancimm을 유지한다. + - 각 아이콘은 52dp 원형 이미지, 16dp gap을 기준으로 표시한다. + - URL은 기존 안전성 정책처럼 유효한 http/https URL만 사용하고, 열 수 있는 intent만 실행한다. + - 검증 기준: + - SNS는 adapter 내부 계산/조립이 아니라 `SNS` 대응 View/layout으로 렌더링된다. 단, 작은 화면 52dp 축소 정책은 기존 요구를 유지할 수 있다. + --- ### Phase 6: sticky tab-bar와 scroll 상태 구현 @@ -547,3 +896,39 @@ - 2026-06-13: 소비형 이벤트 수정 후 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelHomeViewModelTest"`, `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*"`, `./gradlew :app:compileDebugKotlin`, `./gradlew :app:ktlintCheck`를 재실행해 모두 `BUILD SUCCESSFUL`을 확인했다. - 2026-06-13: 추가 코드리뷰에서 팔로우/채팅방 생성 액션 실패도 `showUnknownError()`를 통해 홈 상태를 `Error`로 덮어 기존 Content가 사라질 수 있다는 P1 지적을 받았다. `팔로우 실패는 현재 content를 유지하고 unknown toast만 emit한다`, `채팅방 생성 실패는 현재 content를 유지하고 unknown toast만 emit한다` 테스트를 먼저 추가했고, 기존 구현에서 `ClassCastException`으로 실패하는 RED를 확인했다. - 2026-06-13: 홈 로드 실패는 기존처럼 `CreatorChannelHomeUiState.Error`를 유지하되, 팔로우/채팅방 생성 액션 실패는 `showUnknownErrorToast()`만 호출하도록 분리했다. 수정 후 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelHomeViewModelTest"`를 실행해 `BUILD SUCCESSFUL`을 확인했다. + +- 2026-06-13: Phase 5 사용자 추가 요구사항에 맞춰 `CreatorChannelTab`을 문자열 label 대신 `labelResId: Int`로 변경하고 `values`, `values-en`, `values-ja`에 7개 탭 및 Phase 5 버튼/섹션 문자열을 추가했다. Production 변경 전 RED로 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelHomeMapperTest"`를 실행해 `creator_channel_tab_*`/`labelResId` 미구현 컴파일 실패를 확인했다. +- 2026-06-13: Phase 5 구현으로 `activity_creator_channel_home.xml`, `CreatorChannelHomeActivity`, `CreatorChannelHomeSectionAdapter`, 12개 `item_creator_channel_home_*` layout, header gradient/button drawable, Manifest 등록, `CreatorChannelHomeActivitySourceTest`를 추가했다. `TextTabBarView`는 사용하지 않고 `HorizontalScrollView` + 동적 `TextView`로 7개 긴 탭을 가로 스크롤 가능하게 구성했다. Phase 6 sticky scroll/title black 전환과 Phase 7 `CreatorFollowNotifyFragment` bottom sheet는 구현하지 않았다. +- 2026-06-13: Phase 5 검증 중 병렬 Gradle 실행에서 KSP incremental cache 충돌(`kspCaches/debug/...`)이 발생했으나 순차 실행으로 전환해 `./gradlew :app:mergeDebugResources`, `./gradlew :app:compileDebugKotlin`, `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelHomeMapperTest"`, `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelHomeActivitySourceTest"` 모두 `BUILD SUCCESSFUL`을 확인했다. 이후 `./gradlew :app:ktlintCheck`는 `CreatorChannelHomeSectionAdapter.kt`의 130자 초과 한 줄로 실패했고, 줄바꿈 수정 후 `./gradlew :app:ktlintCheck`, `./gradlew :app:compileDebugKotlin`, `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelHomeMapperTest" --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelHomeActivitySourceTest"`가 모두 `BUILD SUCCESSFUL`로 통과했다. `.editorconfig disabled_rules` deprecation 경고는 기존 설정 경고로 이번 변경과 무관하다. +- 2026-06-13: Phase 5 수동 표면 검증으로 `./gradlew :app:assembleDebug` 후 연결 기기(`adb devices`)에 debug APK를 설치했다. `adb shell run-as kr.co.vividnext.sodalive.debug am start --user 0 -n kr.co.vividnext.sodalive.debug/kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelHomeActivity --el extra_creator_id 0` 및 `--el extra_creator_id 100` 실행을 시도했고 `AndroidRuntime:E` crash 로그는 없었다. 다만 Activity가 `exported=false`이고 shell/background start 제한이 있어 실제 전면 화면 상호작용은 제한적으로만 확인했다. +- 2026-06-13: Phase 5 자체 검토 중 `대화하기`가 숨겨지고 `DM 보내기`만 표시될 때 XML의 `layout_marginStart`가 남아 단독 버튼 중앙 정렬이 틀어질 수 있음을 확인했다. `CreatorChannelHomeActivitySourceTest`에 `updateActionButtonLayout`과 `marginStart = if (isChatVisible && isDmVisible)` 계약을 먼저 추가했고, `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelHomeActivitySourceTest"`가 해당 assertion에서 실패하는 RED를 확인했다. 이후 Activity에서 버튼 표시 조합별 margin을 조정하도록 수정하고 같은 명령을 재실행해 `BUILD SUCCESSFUL`을 확인했다. +- 2026-06-13: Phase 5 보강 후 `./gradlew :app:mergeDebugResources`, `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*"`, `./gradlew :app:compileDebugKotlin`, `./gradlew :app:ktlintCheck`를 실행해 모두 `BUILD SUCCESSFUL`을 확인했다. `ktlintCheck`의 `.editorconfig disabled_rules` deprecation 경고는 기존 설정 경고로 이번 변경과 무관하다. +- 2026-06-13: Phase 5 review-work gate에서 code quality 리뷰어가 `CreatorChannelHomeSectionAdapter`의 활동 요약 문자열(`Live`, `Audio`, `Series`) 하드코딩으로 다국어 일관성이 깨진다고 FAIL했고, context mining 리뷰어가 PRD/Figma에 명시된 `대화하기`/`DM 보내기` 버튼 아이콘(`ic_new_talk`, `ic_new_dm`) 누락으로 FAIL했다. +- 2026-06-13: 차단 이슈 수정 전 RED로 `CreatorChannelHomeActivitySourceTest`에 `android:drawableStart="@drawable/ic_new_talk"`, `android:drawableStart="@drawable/ic_new_dm"`, `creator_channel_activity_summary` resource format 사용, `"Live `, `"Audio `, `"Series ` 하드코딩 부재 assertion을 추가했고, `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelHomeActivitySourceTest"`가 2개 assertion 실패로 `BUILD FAILED`임을 확인했다. +- 2026-06-13: `ic_new_talk`, `ic_new_dm` vector drawable을 추가하고 버튼 XML에 `drawableStart`를 연결했다. 활동 요약은 `creator_channel_activity_summary`를 `values`, `values-en`, `values-ja`에 추가하고 `CreatorChannelHomeSectionAdapter`에서 `context.getString(...)`으로 표시하도록 수정했다. 이후 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelHomeActivitySourceTest"`, `./gradlew :app:mergeDebugResources`, `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*"`, `./gradlew :app:compileDebugKotlin`, `./gradlew :app:ktlintCheck`, `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.home.*"`, `git diff --check`를 실행해 모두 성공 또는 출력 없음(`git diff --check`)을 확인했다. +- 2026-06-13: Phase 5 코드 리뷰에서 확인된 `화보` 탭은 사용자 결정에 따라 이번 범위 제외로 확정했으므로 결함으로 보지 않았다. 나머지 3개 Finding에 대해 RED로 `CreatorChannelHomeActivitySourceTest`에 홈 API Error 상태의 Activity toast 중복 호출 금지, status bar 뒤 header 렌더링을 위한 `BaseActivity.shouldApplySystemBarTopInset` hook 및 화면 자체 title inset 처리, Figma 기준 tab selected indicator/16sp/110dp 폭 계약 assertion을 추가했다. 기존 구현에서 해당 테스트가 3개 assertion 실패로 `BUILD FAILED`임을 확인했다. +- 2026-06-13: `BaseActivity`에 `shouldApplySystemBarTopInset` hook을 추가하고 `CreatorChannelHomeActivity`에서 false로 override해 header는 status bar 뒤까지 그리고 title-bar만 system bar top inset을 반영하도록 수정했다. 홈 로드 Error 상태는 ViewModel의 unknown toast만 사용하도록 Activity의 `showToast(state.message.orEmpty())` 호출을 제거했다. tab은 110dp 폭 `LinearLayout` 안에 16sp `TextView`와 `soda_400` 3dp selected indicator를 구성하도록 변경했다. +- 2026-06-13: Phase 5 코드 리뷰 수정 검증으로 `./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`를 실행했다. 모두 `BUILD SUCCESSFUL` 또는 출력 없음(`git diff --check`)을 확인했다. `ktlintCheck`의 `.editorconfig disabled_rules` deprecation 경고는 기존 설정 경고로 이번 변경과 무관하다. +- 2026-06-13: Phase 5 추가 코드 리뷰 지적 3건(title-bar follow 상태 capsule 불일치, 홈 section item UI 공통 카드 축약, 활동 DTO 주요 필드 미노출)에 대해 Figma `296:14287`, `296:14288`, `296:14289`, `296:14890`을 재확인했다. RED로 `CreatorChannelHomeActivitySourceTest`에 title-bar capsule 구조와 section별 데이터 보존 assertion을 추가했고, 기존 구현에서 `title bar source는 Figma 상태별 capsule 구조를 사용한다`, `section adapter source는 Figma 섹션별 데이터를 공통 카드 하나로 축약하지 않는다` 2개 테스트가 실패해 `BUILD FAILED`임을 확인했다. +- 2026-06-13: title-bar는 `layout_follow_capsule` 안에 follow icon/text를 넣고, 팔로우 상태에서는 흰색 원형 capsule 배경과 icon-only 형태로 전환하도록 `bg_creator_channel_follow_capsule`, `bg_creator_channel_following_capsule`, `CreatorChannelHomeActivity.bindTitleBar()`를 수정했다. 홈 section adapter는 section별 `bind*` 함수로 분리하고 오디오/시리즈/커뮤니티/팬Talk/SNS list 데이터를 줄 단위로 보존했으며, 활동 section은 `debutDateUtc`, `liveCount`, `liveDurationHours`, `liveContributorCount`, `audioContentCount`, `seriesCount`를 모두 다국어 resource format으로 표시하도록 수정했다. +- 2026-06-13: Phase 5 추가 코드 리뷰 수정 검증으로 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelHomeActivitySourceTest"`를 재실행해 `BUILD SUCCESSFUL`을 확인했다. 첫 GREEN 시도는 120초 timeout으로 중단됐으나 컴파일 오류 없이 진행 중이었고, timeout을 300초로 늘린 재실행이 성공했다. 이어서 `./gradlew :app:mergeDebugResources`, `git diff --check`, `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*"`, `./gradlew :app:compileDebugKotlin`, `./gradlew :app:ktlintCheck`를 실행해 모두 `BUILD SUCCESSFUL` 또는 출력 없음(`git diff --check`)을 확인했다. `ktlintCheck`의 `.editorconfig disabled_rules` deprecation 경고는 기존 설정 경고로 이번 변경과 무관하다. +- 2026-06-13: 추가 reviewer gate에서 security/QA/code quality는 PASS했으나 goal/context 리뷰가 홈 section layout이 여전히 `72dp thumbnail + tv_primary/tv_secondary` 공통 카드에 가깝고, list 데이터를 한 `TextView`에 줄바꿈으로 합쳐 Figma `296:14890`의 반복 카드/활동 행/SNS 아이콘 구조를 충분히 만족하지 못한다고 FAIL했다. +- 2026-06-13: reviewer FAIL 수정으로 12개 `item_creator_channel_home_*` layout에 `ll_section_items` 동적 컨테이너를 추가하고, `CreatorChannelHomeSectionAdapter`가 기존 단일 공통 카드 영역을 숨긴 뒤 section별로 여러 child card/row를 생성하도록 변경했다. 오디오/시리즈/커뮤니티/후원/공지/일정/팬Talk는 항목마다 개별 card를 추가하고, SNS는 52dp 버튼 row를 추가하며, 활동은 `dDay`/데뷔일 및 라이브 총 진행 수/누적 시간/누적 참여자/오디오 수/시리즈 수를 행 단위로 표시한다. +- 2026-06-13: 동적 section row 보강 검증으로 `CreatorChannelHomeActivitySourceTest`에 `ll_section_items`, `sectionItems.addView`, `addActivityRow`, `createSnsButton`, 줄바꿈 `joinToString(separator = "\\n")` 금지 assertion을 추가했다. 첫 실행은 기존 활동 요약 source assertion이 새 행 단위 구조와 충돌해 `BUILD FAILED`였고, 테스트를 활동 지표 label resource 계약으로 갱신한 뒤 `./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`, `git diff --check`, `./gradlew :app:compileDebugKotlin`, `./gradlew :app:assembleDebug`, `./gradlew :app:ktlintCheck`가 모두 `BUILD SUCCESSFUL` 또는 출력 없음(`git diff --check`)임을 확인했다. `ktlintCheck`는 줄바꿈/indentation 2차례 실패 후 해당 라인만 수정해 최종 통과했다. +- 2026-06-13: 후속 reviewer gate에서 context/code quality는 PASS했으나 goal 리뷰가 `addCard()`가 대부분 섹션을 동일한 72dp 썸네일 가로 카드로 렌더링해 Figma `296:14890`의 섹션별 카드/피드/콘텐츠 그리드 구조와 아직 다르다고 FAIL했다. +- 2026-06-13: 두 번째 reviewer FAIL 수정으로 `CreatorChannelHomeSectionAdapter`의 공통 `addCard()`를 제거하고 섹션별 helper로 분리했다. 현재 라이브는 `addHeroCard`, 오디오/시리즈는 `createContentTile` 기반 가로 콘텐츠 타일, 커뮤니티는 `addFeedCard`, 일정은 `addScheduleRow`, 후원은 `addDonationCard`, 팬Talk는 `addCommentCard`, SNS는 `createSnsButton`, 활동은 `addActivityRow`를 사용해 섹션별 구조가 같은 72dp 카드 하나로 수렴하지 않도록 했다. `CreatorChannelHomeActivitySourceTest`도 `addHeroCard`, `createContentTile`, `addFeedCard`, `addScheduleRow`, `addDonationCard`, `addCommentCard` 존재와 `private fun addCard` 부재를 검증하도록 보강했다. +- 2026-06-13: 섹션별 helper 분리 후 `./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`, `git diff --check`, `./gradlew :app:compileDebugKotlin`, `./gradlew :app:assembleDebug`, `./gradlew :app:ktlintCheck`를 재실행했다. 모두 `BUILD SUCCESSFUL` 또는 출력 없음(`git diff --check`)을 확인했으며, `ktlintCheck`는 series tile 인자 indentation 실패를 수정한 뒤 최종 통과했다. +- 2026-06-13: 섹션별 helper 분리 후 code quality reviewer가 legacy 공통 카드 잔재(`tv_primary`, `tv_secondary`, `iv_thumbnail`, `legacyCard`, `getChildAt(2)`, `CreatorChannelHomeSection.imageUrl()`)를 차단 이슈로 지적해 FAIL했다. 12개 `item_creator_channel_home_*` layout에서 legacy 공통 카드 영역을 제거하고 `ll_section_items`만 남겼으며, adapter에서 legacy field/helper와 unused `imageUrl()` extension을 제거했다. Source test에는 `getChildAt`, `keepLegacyViewsReferenced`, `fun CreatorChannelHomeSection.imageUrl` 부재와 각 item layout의 legacy id 부재 assertion을 추가했다. 이후 `./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`, `git diff --check`, `./gradlew :app:compileDebugKotlin`, `./gradlew :app:ktlintCheck`, `./gradlew :app:assembleDebug`를 실행해 모두 `BUILD SUCCESSFUL` 또는 출력 없음(`git diff --check`)을 확인했다. +- 2026-06-13: Phase 5 코드 리뷰 Findings 4건(시리즈 가로 row clipping, SNS URL 미사용, schedule type 서버 code 노출, 어두운 header 위 status bar icon 가독성)에 대해 RED로 `CreatorChannelHomeActivitySourceTest`에 source 계약 assertion을 추가했다. 기존 구현에서 `section adapter source는 가로 시리즈와 SNS 링크와 일정 타입 label을 보존한다`, `creator channel home은 어두운 header 위 status bar icon을 밝게 표시한다` 2개 테스트가 실패해 `BUILD FAILED`임을 확인했다. +- 2026-06-13: Phase 5 코드 리뷰 Findings 수정으로 `CreatorChannelHomeActivity`에서 `WindowCompat.getInsetsController(window, binding.root).isAppearanceLightStatusBars = false`를 설정하고, `CreatorChannelHomeSectionAdapter`에서 시리즈 row를 `HorizontalScrollView`로 감싸며 SNS 버튼이 `Intent(Intent.ACTION_VIEW, Uri.parse(url))`을 실행하도록 변경했다. 일정 row는 `schedule.type.code` 대신 `schedule.type.labelResId`를 `getString()`으로 표시하도록 수정했다. +- 2026-06-13: Phase 5 코드 리뷰 Findings 수정 검증으로 `./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`, `git diff --check`, `./gradlew :app:compileDebugKotlin`, `./gradlew :app:ktlintCheck`를 실행해 모두 `BUILD SUCCESSFUL` 또는 출력 없음(`git diff --check`)을 확인했다. `ktlintCheck`는 `CreatorChannelHomeSectionAdapter.kt` indentation 1건으로 한 차례 실패했고 해당 라인만 수정한 뒤 재실행해 통과했다. `.editorconfig disabled_rules` deprecation 경고는 기존 설정 경고로 이번 변경과 무관하다. +- 2026-06-13: Phase 5 추가 리뷰 반영으로 SNS 버튼 크기를 고정 52dp가 아니라 `calculateCreatorChannelSnsButtonSizeDp(screenWidthDp)`로 계산하도록 변경했다. 402dp 이상은 52dp, 402dp 미만은 `52 * width / 402` 비율로 축소한다. `CreatorChannelHomeViewModel.toastLiveData`는 화면 재생성 시 중복 toast가 표시되지 않도록 `CreatorChannelEvent`로 변경했고 Activity에서 `event.consume()` 후 표시하도록 수정했다. RED로 `CreatorChannelHomeActivitySourceTest`와 `CreatorChannelHomeViewModelTest`를 실행해 새 계산 함수 및 toast event 소비 계약 미구현 컴파일 실패를 확인했고, 구현 후 두 테스트 모두 `BUILD SUCCESSFUL`을 확인했다. +- 2026-06-13: Phase 5 추가 리뷰 반영 최종 검증으로 `./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`)을 확인했다. `ktlintCheck`의 `.editorconfig disabled_rules` deprecation 경고는 기존 설정 경고로 이번 변경과 무관하다. +- 2026-06-13: Phase 5 코드 리뷰 Finding 1/2와 사용자 SNS 아이콘 정책 반영을 위해 RED로 `CreatorChannelHomeActivitySourceTest`에 활동 섹션 단위 format, 오디오 단일 가로 스크롤 row, `ic_sns_` drawable 기반 `ImageView` SNS 버튼 계약을 추가했다. 기존 구현에서 4개 assertion이 실패해 `BUILD FAILED`임을 확인했다. +- 2026-06-13: Phase 5 코드 리뷰 Finding 1/2와 SNS 아이콘 정책 수정으로 활동 섹션에 `데뷔` label 및 단위 포함 value format resource를 추가하고, 오디오 콘텐츠 섹션을 단일 `HorizontalScrollView` row로 변경했다. SNS는 `CreatorChannelSnsUiItem.iconResId`를 추가해 `ic_sns_instagram`, `ic_sns_youtube`, `ic_sns_x`, `ic_sns_kakao`, `ic_sns_fancimm` 아이콘을 `ImageView`로 표시하도록 변경했다. +- 2026-06-13: Phase 5 코드 리뷰 Finding 1/2와 SNS 아이콘 정책 수정 검증으로 `./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`를 실행했다. 모두 `BUILD SUCCESSFUL` 또는 출력 없음(`git diff --check`)을 확인했다. 첫 테스트 실행은 sandbox의 `~/.gradle` lock 파일 접근 제한으로 실패해 승인 후 재실행했다. `ktlintCheck`의 `.editorconfig disabled_rules` deprecation 경고는 기존 설정 경고로 이번 변경과 무관하다. +- 2026-06-14: Phase 5 SNS 후속 리뷰 반영을 위해 RED로 `CreatorChannelHomeMapperTest`에 Figma 순서(`Instagram`, `YouTube`, `X`, `Kakao Open Chat`, `Fancimm`)와 invalid URL 제외 assertion을 추가하고, `CreatorChannelHomeActivitySourceTest`에 SNS intent `resolveActivity()` 확인 및 마지막 아이콘 trailing `marginEnd` 제거 assertion을 추가했다. 기존 구현에서 `CreatorChannelHomeActivitySourceTest`는 URL 안전 실행/마지막 margin 2개 assertion 실패로 `BUILD FAILED`임을 확인했다. 매퍼 테스트는 Android 런타임 의존 없는 검증을 유지하기 위해 `java.net.URI` 기반 URL helper 계약으로 정리했다. +- 2026-06-14: Phase 5 SNS 후속 리뷰 수정으로 `CreatorChannelHomeMappers`에서 SNS 순서를 Figma 기준으로 변경하고, `isValidCreatorChannelSnsUrl()`로 `http`/`https` scheme과 host가 있는 URL만 UI item으로 매핑하도록 했다. `CreatorChannelHomeSectionAdapter`는 SNS 클릭 시 `Intent.ACTION_VIEW` intent를 만든 뒤 `resolveActivity(itemView.context.packageManager)`가 null이 아닐 때만 실행하고, `forEachIndexed`로 마지막 SNS 아이콘의 `marginEnd`를 0으로 조정했다. +- 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 경고는 기존 설정 경고로 이번 변경과 무관하다. diff --git a/docs/20260611_크리에이터_채널_홈_탭/prd.md b/docs/20260611_크리에이터_채널_홈_탭/prd.md index 25416a4c..dbe52007 100644 --- a/docs/20260611_크리에이터_채널_홈_탭/prd.md +++ b/docs/20260611_크리에이터_채널_홈_탭/prd.md @@ -334,6 +334,42 @@ tab-bar는 스크롤 중 title-bar 하단에 고정되는 sticky 영역으로 - list 필드가 빈 배열이면 섹션 자체를 숨길지 빈 상태를 표시할지는 기존 홈/크리에이터 화면 정책을 우선 따른다. - SNS URL 문자열이 빈 값이면 해당 SNS 진입 아이콘 또는 버튼은 비활성/숨김 처리한다. +### Home Tab Content Rebuild +탭 바 아래 `홈` 컨텐츠는 기존 `CreatorChannelHomeSectionAdapter` 내부 동적 View 조립 구현을 삭제하고, Figma `296:14895`에 배치된 컴포넌트 성격의 UI를 Android XML/ViewBinding 기반으로 다시 구성한다. + +#### Requirements +- 재구성 기준 Figma 노드는 `296:14895`이다. +- 기존 `item_creator_channel_home_*.xml` 12개가 동일한 섹션 컨테이너만 갖는 구조는 유지하지 않는다. +- 기존 `CreatorChannelHomeSectionAdapter` 내부에서 `addHeroCard`, `createContentTile`, `addFeedCard`, `addScheduleRow`, `addDonationCard`, `addCommentCard`, `addActivityRow`처럼 섹션별 UI를 직접 조립하던 구현은 제거 대상으로 본다. +- 각 홈 섹션은 하나의 Task로 분리해 문서화하고, 각 Task는 해당 섹션이 사용하는 Figma Component 또는 Figma에서 확인되는 반복 구조를 Android View로 옮기는 작업만 포함한다. +- 섹션 제목은 Figma `SectionTitle` 컴포넌트를 기준으로 구성한다. +- 컨텐츠 썸네일 카드 계열은 Figma `Contents` 컴포넌트를 기준으로 구성한다. +- 커뮤니티 게시글은 Figma `Feed` 구조를 기준으로 구성한다. +- 팬Talk 요약은 Figma `ListComment` 컴포넌트를 기준으로 구성한다. +- SNS 영역은 Figma `SNS` 컴포넌트를 기준으로 구성한다. +- 공통 컴포넌트는 재사용 가능한 Android View 또는 재사용 layout으로 먼저 정의하고, 섹션 adapter는 데이터 바인딩과 view type 선택만 담당한다. +- 기존에 만들어 둔 공용 Android View가 Figma 컴포넌트와 요구사항을 만족하면 우선 재사용한다. 바로 재사용할 수 없으면 어댑터 내부 조립 대신 해당 Figma 컴포넌트에 맞는 신규 View/layout을 만든다. +- Figma `296:14895`에 `화보` 섹션이 보이더라도 현재 홈 API 응답과 탭 범위에는 화보 데이터가 없으므로 이번 재구성 구현 범위에서는 제외한다. 추후 API 필드가 추가되면 별도 PRD/TASK로 다룬다. + +#### Section Requirements +- 현재 라이브 섹션은 `SectionTitle`과 Figma의 라이브 카드 구조를 기준으로 하며, `currentLive`가 null이면 표시하지 않는다. +- 최신 오디오 섹션은 Figma의 88dp 이미지 list row 구조를 기준으로 하며, `latestAudioContent`가 null이면 표시하지 않는다. +- 후원 섹션은 후원자 프로필, 닉네임, 후원 메시지, 후원 수량을 Figma list/comment 계열 스타일에 맞춰 표시한다. +- 공지 섹션은 공지 본문, 날짜, 이미지/잠금 상태가 있는 경우의 표시 정책을 Figma list/feed 계열 구조에 맞춰 정의한다. +- 일정 섹션은 일정 타입 label, 제목, 일시를 Figma list row 구조에 맞춰 표시한다. +- 오디오 컨텐츠 섹션은 Figma `Contents(type=audio, size=s)` 또는 88dp list row 중 Figma `296:14895`의 해당 섹션 구조를 따른다. +- 시리즈 섹션은 Figma `Contents(type=series, size=m)` 구조를 사용하고, `isOriginal`, `isNew`, `isPopular`, `isComplete` 상태를 tag/label 표시 정책에 연결한다. +- 커뮤니티 섹션은 Figma `Feed` 구조를 사용하고, 프로필, 작성자, 작성 시간, 본문, 이미지, 유료 잠금, 좋아요/댓글 reaction을 표시한다. +- 팬Talk 섹션은 Figma `ListComment` 구조를 사용하고, 전체 count와 최신 댓글 1개를 표시한다. +- 소개 섹션은 카드 배경 없이 Figma 본문 텍스트 영역처럼 표시한다. +- 활동 섹션은 Figma의 배경 없는 label/value row 목록을 기준으로 표시한다. +- SNS 섹션은 Figma `SNS` 순서와 52dp 원형 아이콘 규격을 따른다. + +#### Edge Cases +- API 필드가 null이거나 빈 list이면 해당 섹션은 기본적으로 숨긴다. Figma에 별도 empty UI가 확인되거나 사용자 요구가 추가되면 섹션별 Task에 명시한다. +- Figma component와 기존 Android 공용 View의 모델 타입이 다르면 adapter 내부에서 View를 직접 조립하지 말고 mapper 또는 section 전용 bind API를 둔다. +- 섹션별 Task는 다른 섹션의 리팩터링을 포함하지 않는다. + ### CreatorActivityType Commonization 홈 추천 API에서 사용 중인 `RecommendedActivityType`은 크리에이터 채널 홈 API의 `CreatorActivityType`과 동일한 의미를 가지므로 공용 타입으로 정리한다. @@ -399,6 +435,8 @@ tab-bar는 스크롤 중 title-bar 하단에 고정되는 sticky 영역으로 - title-bar와 tab-bar의 실제 거리 및 프로필 이미지가 절반 이상 사라진 상태를 기준으로 title-bar 배경색이 black으로 변경된다. - `RecommendedActivityType`은 공용 `CreatorActivityType`으로 변경되고, 홈 추천 API와 크리에이터 채널 홈 API가 같은 타입을 참조한다. - `라이브`, `오디오`, `시리즈`, `커뮤니티`, `팬Talk`, `후원` 탭 상세 화면은 이번 구현 범위로 사용되지 않는다. +- 탭 바 아래 홈 컨텐츠는 Figma `296:14895` 기준으로 기존 동적 조립 UI를 삭제하고 섹션별 Figma component 기반 UI로 재구성된다. +- 홈 컨텐츠 재구성에서 `화보` 섹션은 현재 API 응답에 데이터가 없으므로 구현 범위에서 제외한다. --- @@ -411,6 +449,7 @@ tab-bar는 스크롤 중 title-bar 하단에 고정되는 sticky 영역으로 ## 12. References - 전체 페이지 Figma: https://www.figma.com/design/HmN1yNdJ3EIpqknFL0Hkab/-%EA%B3%B5%EC%9C%A0%EC%9A%A9-%EB%B3%B4%EC%9D%B4%EC%8A%A4%EC%98%A8-UI-UX-%EA%B8%B0%ED%9A%8D%EB%AC%B8%EC%84%9C?node-id=296-14890&m=dev +- 홈 탭 컨텐츠 Figma: https://www.figma.com/design/HmN1yNdJ3EIpqknFL0Hkab/-%EA%B3%B5%EC%9C%A0%EC%9A%A9-%EB%B3%B4%EC%9D%B4%EC%8A%A4%EC%98%A8-UI-UX-%EA%B8%B0%ED%9A%8D%EB%AC%B8%EC%84%9C?node-id=296-14895&m=dev - 팔로우 상태가 아닐 때 Figma: https://www.figma.com/design/HmN1yNdJ3EIpqknFL0Hkab/-%EA%B3%B5%EC%9C%A0%EC%9A%A9-%EB%B3%B4%EC%9D%B4%EC%8A%A4%EC%98%A8-UI-UX-%EA%B8%B0%ED%9A%8D%EB%AC%B8%EC%84%9C?node-id=296-14287&m=dev - 팔로우 중 + 알림 받기 중 Figma: https://www.figma.com/design/HmN1yNdJ3EIpqknFL0Hkab/-%EA%B3%B5%EC%9C%A0%EC%9A%A9-%EB%B3%B4%EC%9D%B4%EC%8A%A4%EC%98%A8-UI-UX-%EA%B8%B0%ED%9A%8D%EB%AC%B8%EC%84%9C?node-id=296-14288&m=dev - 팔로우 중 + 알림 받기 중이 아닐 때 Figma: https://www.figma.com/design/HmN1yNdJ3EIpqknFL0Hkab/-%EA%B3%B5%EC%9C%A0%EC%9A%A9-%EB%B3%B4%EC%9D%B4%EC%8A%A4%EC%98%A8-UI-UX-%EA%B8%B0%ED%9A%8D%EB%AC%B8%EC%84%9C?node-id=296-14289&m=dev @@ -437,3 +476,4 @@ tab-bar는 스크롤 중 title-bar 하단에 고정되는 sticky 영역으로 - 2026-06-13: 백엔드 `CreatorActivityType` 원본 enum이 `LIVE`, `AUDIO`, `COMMUNITY`, `LIVE_REPLAY` 대문자 상수와 동일한 `code`를 사용함을 확인해 Android Gson enum 파싱용 별도 TypeAdapter는 추가하지 않기로 판단했다. - 2026-06-13: 사용자 추가 요청에 따라 신규 크리에이터 채널 홈 패키지를 `kr.co.vividnext.sodalive.v2.creatorchannel`에서 `kr.co.vividnext.sodalive.v2.creator.channel`로 변경했다. - 2026-06-13: 사용자 확인에 따라 백엔드 `CreatorActivityType` 원본 enum과 동일한 대문자 code 계약을 API 계약/기술 제약에 명시했다. 이후 코드리뷰에서는 별도 서버 계약 변경 근거가 없는 한 크리에이터 채널 홈 DTO의 `CreatorActivityType` 직접 사용과 Gson enum TypeAdapter 부재를 대소문자 대응 문제로 제기하지 않는다. 이번 단계는 문서 수정만 수행했으며 빌드/테스트는 실행하지 않았다. +- 2026-06-15: 사용자 요청에 따라 탭 바 아래 홈 컨텐츠를 기존 동적 조립 UI에서 Figma `296:14895`의 `SectionTitle`, `Contents`, `Feed`, `ListComment`, `SNS` 컴포넌트 기반 UI로 전면 재구성하는 요구사항을 추가했다. 이번 단계는 문서 수정만 수행했으며 구현/빌드/테스트는 실행하지 않았다.