diff --git a/docs/20260620_크리에이터_채널_시리즈_탭/plan-task.md b/docs/20260620_크리에이터_채널_시리즈_탭/plan-task.md index 0460c172..20aaac89 100644 --- a/docs/20260620_크리에이터_채널_시리즈_탭/plan-task.md +++ b/docs/20260620_크리에이터_채널_시리즈_탭/plan-task.md @@ -310,12 +310,15 @@ - 검증 기록: - 2026-06-20 구현: `CreatorChannelSeriesItemUiModel`, `CreatorChannelSeriesProgressUiModel`, `toSeriesItemUiModels(isOwner)` mapper를 추가했다. subtitle은 blank segment를 제외하고 ` • `로 join하며, progress는 owner이거나 nullable field가 누락되면 생성하지 않고 `purchasedPaidContentRate / 100f`를 0f..1f로 clamp한다. - 2026-06-20 검증: `./gradlew --no-daemon :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.series.*"` PASS. + - 2026-06-20 후속 수정: mapper가 subtitle을 한국어 문자열(`총 n화`, `연재`, `완결`)로 직접 조합하던 문제를 수정했다. `CreatorChannelSeriesSubtitleUiModel`에 `publishedDaysOfWeek`, `contentCount`, `isProceeding` 조각 데이터를 유지하고, Adapter bind 시점에 다국어 string resource로 subtitle을 조합하도록 변경했다. + - 2026-06-20 후속 RED 확인: mapper/layout 테스트 기대값을 subtitle 조각 모델과 resource 기반 bind 계약으로 변경한 뒤 production 수정 전 `item.subtitle`이 `String`이라 `isProceeding`, `contentCount`, `publishedDaysOfWeek` 접근 컴파일 오류가 발생함을 확인했다. + - 2026-06-20 후속 검증: `./gradlew --no-daemon :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.series.CreatorChannelSeriesMapperTest" --tests "kr.co.vividnext.sodalive.v2.creator.channel.series.CreatorChannelSeriesFragmentLayoutTest"` PASS. --- ### Phase 4: Fragment, Adapter, XML UI 구현 -- [ ] **Task 4.1: Fragment/Layout RED 테스트 작성** +- [x] **Task 4.1: Fragment/Layout RED 테스트 작성** - 생성: - `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/series/CreatorChannelSeriesFragmentLayoutTest.kt` - 테스트 케이스: @@ -330,9 +333,10 @@ - 기대 결과: - layout/string 미구현으로 RED 실패한다. - 검증 기록: - - 구현 시 기록한다. + - 2026-06-20 RED 확인: `CreatorChannelSeriesFragmentLayoutTest`를 추가하고 실행했을 때 `CreatorChannelSeriesFragment`, `fragment_creator_channel_series`, `item_creator_channel_series` 및 관련 view id 미구현으로 `compileDebugUnitTestKotlin`이 실패했다. + - 2026-06-20 GREEN 확인: layout/string/Fragment/Adapter 구현 후 `./gradlew --no-daemon :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.series.CreatorChannelSeriesFragmentLayoutTest"` PASS. -- [ ] **Task 4.2: 문자열 리소스 추가** +- [x] **Task 4.2: 문자열 리소스 추가** - 수정: - `app/src/main/res/values/strings.xml` - `app/src/main/res/values-en/strings.xml` @@ -346,9 +350,10 @@ - 기대 결과: - 신규 문자열 리소스 병합이 PASS한다. - 검증 기록: - - 구현 시 기록한다. + - 2026-06-20 구현: `creator_channel_series_empty_message`, error/retry/status/total/progress 문자열을 한국어/영어/일본어 리소스에 추가했다. + - 2026-06-20 검증: `./gradlew --no-daemon :app:mergeDebugResources` PASS. -- [ ] **Task 4.3: 시리즈 탭 fragment layout 작성** +- [x] **Task 4.3: 시리즈 탭 fragment layout 작성** - 생성: - `app/src/main/res/layout/fragment_creator_channel_series.xml` - 작업: @@ -363,9 +368,10 @@ - 기대 결과: - ViewBinding `FragmentCreatorChannelSeriesBinding`이 생성된다. - 검증 기록: - - 구현 시 기록한다. + - 2026-06-20 구현: `fragment_creator_channel_series.xml`에 sort bar, total count, sort label/icon, RecyclerView, empty/error/retry 영역을 추가했다. + - 2026-06-20 검증: `./gradlew --no-daemon :app:mergeDebugResources` PASS, `FragmentCreatorChannelSeriesBinding` 생성 후 `./gradlew --no-daemon :app:compileDebugKotlin` PASS. -- [ ] **Task 4.4: 시리즈 item layout 작성** +- [x] **Task 4.4: 시리즈 item layout 작성** - 생성: - `app/src/main/res/layout/item_creator_channel_series.xml` - 작업: @@ -382,9 +388,10 @@ - 기대 결과: - ViewBinding `ItemCreatorChannelSeriesBinding`이 생성된다. - 검증 기록: - - 구현 시 기록한다. + - 2026-06-20 구현: `item_creator_channel_series.xml`에 122dp x 172dp thumbnail, wrap-content original tag, adult badge, title/subtitle, progress count/percent/fill을 추가하고 우측 `전체소장`/play button 영역은 제외했다. + - 2026-06-20 검증: 최초 `./gradlew --no-daemon :app:compileDebugKotlin`은 존재하지 않는 `@dimen/spacing_2` 참조로 실패했고, `2dp`로 수정 후 PASS. -- [ ] **Task 4.5: Adapter 구현** +- [x] **Task 4.5: Adapter 구현** - 생성: - `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/series/ui/CreatorChannelSeriesAdapter.kt` - 작업: @@ -399,9 +406,10 @@ - 기대 결과: - Adapter 컴파일이 PASS한다. - 검증 기록: - - 구현 시 기록한다. + - 2026-06-20 구현: `CreatorChannelSeriesAdapter`를 추가하고 `submitItems`, item click, title/subtitle/image/original/adult/progress binding, thumbnail radius outline 처리를 구현했다. + - 2026-06-20 검증: `./gradlew --no-daemon :app:compileDebugKotlin` PASS. -- [ ] **Task 4.6: Fragment 구현** +- [x] **Task 4.6: Fragment 구현** - 생성: - `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/series/CreatorChannelSeriesFragment.kt` - 작업: @@ -421,13 +429,14 @@ - 기대 결과: - Fragment layout 테스트와 Kotlin 컴파일이 PASS한다. - 검증 기록: - - 구현 시 기록한다. + - 2026-06-20 구현: `CreatorChannelSeriesFragment`를 추가하고 `newInstance(creatorId)`, `Host`, sort popup, `loadSeries`, `loadMore`, retry, state별 visibility, pagination error toast/consume, content layout key 변경 감지를 구현했다. + - 2026-06-20 검증: `./gradlew --no-daemon :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.series.CreatorChannelSeriesFragmentLayoutTest"` PASS, `./gradlew --no-daemon :app:compileDebugKotlin` PASS. --- ### Phase 5: 채널 탭 연결과 Activity 통합 -- [ ] **Task 5.1: PagerAdapter RED 테스트 수정** +- [x] **Task 5.1: PagerAdapter RED 테스트 수정** - 수정: - `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelPagerAdapterTest.kt` - 작업: @@ -438,9 +447,10 @@ - 기대 결과: - production 연결 전 RED 실패한다. - 검증 기록: - - 구현 시 기록한다. + - 2026-06-20 RED 확인: `CreatorChannelPagerAdapterTest`에 Series 탭이 `CreatorChannelSeriesFragment`를 생성해야 한다는 기대를 추가했고, production 연결 전 `CreatorChannelSeriesFragment` 미구현으로 컴파일 실패했다. + - 2026-06-20 GREEN 확인: PagerAdapter 연결 후 `./gradlew --no-daemon :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelPagerAdapterTest"` PASS. -- [ ] **Task 5.2: PagerAdapter Series 연결** +- [x] **Task 5.2: PagerAdapter Series 연결** - 수정: - `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelPagerAdapter.kt` - 작업: @@ -450,9 +460,10 @@ - 기대 결과: - PagerAdapter 테스트가 GREEN이다. - 검증 기록: - - 구현 시 기록한다. + - 2026-06-20 구현: `CreatorChannelPagerAdapter.createFragment()`에 `CreatorChannelTab.Series -> CreatorChannelSeriesFragment.newInstance(creatorId)` 분기를 추가했다. + - 2026-06-20 검증: `./gradlew --no-daemon :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelPagerAdapterTest"` PASS. -- [ ] **Task 5.3: Activity source RED 테스트 수정** +- [x] **Task 5.3: Activity source RED 테스트 수정** - 수정: - `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivitySourceTest.kt` - 작업: @@ -466,9 +477,10 @@ - 기대 결과: - production 연결 전 RED 실패한다. - 검증 기록: - - 구현 시 기록한다. + - 2026-06-20 RED 확인: `CreatorChannelActivitySourceTest`에 Series Host, tab selected load, load-more, viewport, content changed, detail navigation 계약을 추가했고, production 연결 전 관련 source 문자열 미구현으로 실패하도록 고정했다. + - 2026-06-20 GREEN 확인: Activity 연결 후 `./gradlew --no-daemon :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelActivitySourceTest"` PASS. -- [ ] **Task 5.4: Activity Series 통합** +- [x] **Task 5.4: Activity Series 통합** - 수정: - `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivity.kt` - 작업: @@ -488,7 +500,8 @@ - 기대 결과: - Activity source 테스트와 Kotlin 컴파일이 PASS한다. - 검증 기록: - - 구현 시 기록한다. + - 2026-06-20 구현: `CreatorChannelActivity`가 `CreatorChannelSeriesFragment.Host`를 구현하도록 연결하고, `findSeriesFragment()`, tab selected/header changed load, load-more 분기, viewport callback, content changed callback, `SeriesDetailActivity` 이동을 추가했다. + - 2026-06-20 검증: `./gradlew --no-daemon :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelActivitySourceTest"` PASS, `./gradlew --no-daemon :app:compileDebugKotlin` PASS. --- @@ -548,3 +561,19 @@ - 2026-06-20 검증: `./gradlew --no-daemon :app:compileDebugKotlin` PASS. - 2026-06-20 검증: `./gradlew --no-daemon :app:ktlintCheck` PASS. - 2026-06-20 검증: `git diff --check` PASS. +- 2026-06-20 Phase 4/5 RED: 신규 `CreatorChannelSeriesFragmentLayoutTest`, `CreatorChannelPagerAdapterTest`, `CreatorChannelActivitySourceTest` 기대값 추가 후 production 미구현 상태에서 `CreatorChannelSeriesFragment`, 신규 layout/id 미존재로 테스트 컴파일 실패를 확인했다. 병렬 Gradle 실행 중 Kotlin cache lock/EOF 오류가 함께 발생해 이후 검증은 순차 실행으로 진행했다. +- 2026-06-20 Phase 4/5 구현: `CreatorChannelSeriesFragment`, `CreatorChannelSeriesAdapter`, fragment/item XML, 다국어 문자열, PagerAdapter Series 분기, Activity Series Host/load-more/viewport/navigation 연결을 추가했다. +- 2026-06-20 Phase 4/5 검증: `./gradlew --no-daemon :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.series.CreatorChannelSeriesFragmentLayoutTest"` PASS. +- 2026-06-20 Phase 4/5 검증: `./gradlew --no-daemon :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelPagerAdapterTest"` PASS. +- 2026-06-20 Phase 4/5 검증: `./gradlew --no-daemon :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelActivitySourceTest"` PASS. +- 2026-06-20 Phase 4/5 검증: `./gradlew --no-daemon :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.series.*"` PASS. +- 2026-06-20 Phase 4/5 검증: `./gradlew --no-daemon :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*Series*"` PASS. +- 2026-06-20 Phase 4/5 검증: `./gradlew --no-daemon :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*"` PASS. +- 2026-06-20 Phase 4/5 검증: `./gradlew --no-daemon :app:mergeDebugResources` PASS, `./gradlew --no-daemon :app:compileDebugKotlin` PASS, `./gradlew --no-daemon :app:ktlintCheck` PASS, `git diff --check` PASS. +- 2026-06-20 후속 수정 검증: Series item subtitle의 locale 고정 문제를 해결하기 위해 mapper는 subtitle 조각 데이터만 생성하고 Adapter가 `creator_channel_series_subtitle_content_count`, `creator_channel_series_status_proceeding`, `creator_channel_series_status_completed` resource로 subtitle을 조합하도록 변경했다. +- 2026-06-20 후속 수정 검증: `./gradlew --no-daemon :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.series.*"` PASS. +- 2026-06-20 후속 수정 검증: `./gradlew --no-daemon :app:mergeDebugResources` PASS, `./gradlew --no-daemon :app:compileDebugKotlin` PASS, `./gradlew --no-daemon :app:ktlintCheck` PASS, `git diff --check` PASS. +- 2026-06-20 Phase 4/5 코드 리뷰: `CreatorChannelSeriesFragment`, `CreatorChannelSeriesAdapter`, fragment/item XML, PagerAdapter/Activity 연결부를 검토했다. 발견 사항: `CreatorChannelSeriesMappers.kt`에서 subtitle의 `총 n화`, `연재`, `완결` 문구가 Kotlin 상수/문자열로 고정되어 있어 Phase 4에서 추가한 영어/일본어 상태 문자열이 사용되지 않는다. +- 2026-06-20 Phase 4/5 재검증: sandbox 실행은 `~/.gradle` lock 접근 제한으로 실패했고, escalated 순차 실행으로 `./gradlew --no-daemon :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.series.*"`, `./gradlew --no-daemon :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*Series*"`, `./gradlew --no-daemon :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*"`, `./gradlew --no-daemon :app:mergeDebugResources`, `./gradlew --no-daemon :app:compileDebugKotlin`, `./gradlew --no-daemon :app:ktlintCheck`, `git diff --check` 모두 PASS. +- 2026-06-20 Phase 4/5 코드 리뷰 및 검증: Figma `290:9031`, `290:9036`, `290:9038`와 `CreatorChannelSeriesFragment`, `CreatorChannelSeriesAdapter`, fragment/item XML, PagerAdapter/Activity 연결부를 재검토했다. PRD에서 제거하기로 한 우측 `전체소장`/play 영역 제외는 의도된 차이로 확인했고, 즉시 수정이 필요한 결함은 발견하지 못했다. +- 2026-06-20 Phase 4/5 코드 리뷰 및 검증: 최초 `./gradlew --no-daemon :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.series.*"` sandbox 실행은 `~/.gradle` lock 접근 제한으로 실패했다. escalated 순차 실행으로 `./gradlew --no-daemon :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.series.*"`, `./gradlew --no-daemon :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*Series*"`, `./gradlew --no-daemon :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*"`, `./gradlew --no-daemon :app:mergeDebugResources`, `./gradlew --no-daemon :app:compileDebugKotlin`, `./gradlew --no-daemon :app:ktlintCheck`, `git diff --check` 모두 PASS.