diff --git a/docs/20260625_메인_콘텐츠_탭_내부_전체_탭/plan-task.md b/docs/20260625_메인_콘텐츠_탭_내부_전체_탭/plan-task.md index 3604c0a4..56c0c385 100644 --- a/docs/20260625_메인_콘텐츠_탭_내부_전체_탭/plan-task.md +++ b/docs/20260625_메인_콘텐츠_탭_내부_전체_탭/plan-task.md @@ -107,7 +107,7 @@ ### Phase 1: 기존 구조 확인과 작업 경계 고정 -- [ ] **Task 1.1: 기존 콘텐츠 탭 구조와 전체 탭 삽입 지점 확인** +- [x] **Task 1.1: 기존 콘텐츠 탭 구조와 전체 탭 삽입 지점 확인** - 확인: - `app/src/main/java/kr/co/vividnext/sodalive/v2/main/content/ContentMainFragment.kt` - `app/src/main/res/layout/fragment_v2_main_content.xml` @@ -120,8 +120,9 @@ - 검증: - Run: `rg -n "CONTENT_TAB_ALL|hideContentSurfaces|showRecommendationContent|showRankingContent|textTabBarContent" app/src/main/java/kr/co/vividnext/sodalive/v2/main/content app/src/main/res/layout/fragment_v2_main_content.xml` - Expected: Text Tab 전환과 기존 surface visibility 지점이 확인된다. + - 2026-06-25: PASS. `ContentMainFragment.kt`에서 `CONTENT_TAB_ALL` 분기와 `hideContentSurfaces()`, 추천/랭킹 surface visibility 제어 지점을 확인했다. -- [ ] **Task 1.2: 재사용 위젯과 신규 adapter 경계 확정** +- [x] **Task 1.2: 재사용 위젯과 신규 adapter 경계 확정** - 확인: - `app/src/main/java/kr/co/vividnext/sodalive/v2/widget/AudioContentCardView.kt` - `app/src/main/java/kr/co/vividnext/sodalive/v2/widget/SeriesContentCardView.kt` @@ -135,8 +136,9 @@ - 검증: - Run: `rg -n "class CapsuleTabBarView|class CreatorChannelSortPopup|fun ContentSort.toLabelResId|class AudioContentCardView|class SeriesContentCardView" app/src/main/java/kr/co/vividnext/sodalive/v2` - Expected: 재사용 후보 클래스와 함수가 확인된다. + - 2026-06-25: PASS. `CapsuleTabBarView`, `CreatorChannelSortPopup`, `ContentSort.toLabelResId()`, `AudioContentCardView`, `SeriesContentCardView` 위치를 확인했다. -- [ ] **Task 1.3: 제외 범위 확인** +- [x] **Task 1.3: 제외 범위 확인** - 확인: - `docs/20260625_메인_콘텐츠_탭_내부_전체_탭/prd.md` - 제외: @@ -148,12 +150,13 @@ - 검증: - Run: `rg -n '전체|연재|Non-Goals|오리지널 오디오|레거시|Open Questions' docs/20260625_메인_콘텐츠_탭_내부_전체_탭/prd.md` - Expected: 제외 범위와 Open Questions 없음 상태가 확인된다. + - 2026-06-25: PASS. PRD에서 레거시 직접 수정 제외, 오리지널 오디오 제외, Figma `전체`/`연재` 칩 제외, Open Questions 섹션을 확인했다. --- ### Phase 2: API, DTO, Repository, enum/요일 mapping 추가 -- [ ] **Task 2.1: API/DTO/Repository 계약 추가** +- [x] **Task 2.1: API/DTO/Repository 계약 추가** - 생성: - `app/src/main/java/kr/co/vividnext/sodalive/v2/main/content/data/MainContentAllTabApi.kt` - `app/src/main/java/kr/co/vividnext/sodalive/v2/main/content/data/MainContentAllTabModels.kt` @@ -171,8 +174,9 @@ - 검증: - Run: `./gradlew :app:compileDebugKotlin` - Expected: 신규 data layer와 DI 등록이 컴파일된다. + - 2026-06-25: PASS. `MainContentAllTabApi`, DTO, Repository, `AppDI.kt` API/Repository 등록 후 `./gradlew :app:compileDebugKotlin` 성공. -- [ ] **Task 2.2: 타입 라벨과 요일 라벨 리소스 추가** +- [x] **Task 2.2: 타입 라벨과 요일 라벨 리소스 추가** - 수정: - `app/src/main/res/values/strings.xml` - `app/src/main/res/values-en/strings.xml` @@ -196,8 +200,9 @@ - 검증: - Run: `./gradlew :app:mergeDebugResources` - Expected: 3개 locale string resource가 중복 없이 merge된다. + - 2026-06-25: PASS. `values`, `values-en`, `values-ja`에 전체 탭 type/day/empty/pagination 문자열 추가 후 `./gradlew :app:mergeDebugResources` 성공. -- [ ] **Task 2.3: 요일 mapping 테스트 작성** +- [x] **Task 2.3: 요일 mapping 테스트 작성** - 생성: - `app/src/test/java/kr/co/vividnext/sodalive/v2/main/content/MainContentAllDayOfWeekMapperTest.kt` - 테스트 케이스: @@ -212,8 +217,9 @@ - 검증: - Run: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.content.MainContentAllDayOfWeekMapperTest"` - Expected: mapper 구현 전 RED 실패. + - 2026-06-25: RED 확인. mapper 구현 전 테스트를 먼저 추가하고 실행했다. 병렬 Gradle 실행 중 incremental resource merge cache 오류로 실패가 발생해 이후 검증은 순차 실행으로 전환했다. -- [ ] **Task 2.4: 요일 mapping 구현** +- [x] **Task 2.4: 요일 mapping 구현** - 생성: - `app/src/main/java/kr/co/vividnext/sodalive/v2/main/content/model/MainContentAllDayOfWeekMapper.kt` - 작업: @@ -224,12 +230,13 @@ - 검증: - Run: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.content.MainContentAllDayOfWeekMapperTest"` - Expected: PASS. + - 2026-06-25: PASS. `currentDeviceDayOfWeek()`, `toContentAllDayLabelResId()`, `contentAllDayOfWeekOptions` 구현 후 대상 테스트 성공. --- ### Phase 3: UI model, mapper, SeriesContentCardView 성인 배지 -- [ ] **Task 3.1: 전체 탭 mapper RED 테스트 작성** +- [x] **Task 3.1: 전체 탭 mapper RED 테스트 작성** - 생성: - `app/src/test/java/kr/co/vividnext/sodalive/v2/main/content/MainContentAllTabMapperTest.kt` - 테스트 케이스: @@ -245,8 +252,9 @@ - 검증: - Run: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.content.MainContentAllTabMapperTest"` - Expected: UI model/mapper 구현 전 RED 실패. + - 2026-06-25: RED 확인. UI model/mapper 구현 전 테스트를 먼저 추가하고 실행했다. 병렬 Gradle 실행 중 일부 명령이 compile 단계에서 timeout/cache 오류로 실패해 이후 검증은 순차 실행으로 전환했다. -- [ ] **Task 3.2: 전체 탭 UI model과 mapper 구현** +- [x] **Task 3.2: 전체 탭 UI model과 mapper 구현** - 생성: - `app/src/main/java/kr/co/vividnext/sodalive/v2/main/content/model/MainContentAllTabUiState.kt` - `app/src/main/java/kr/co/vividnext/sodalive/v2/main/content/model/MainContentAllTabUiModels.kt` @@ -260,8 +268,9 @@ - 검증: - Run: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.content.MainContentAllTabMapperTest"` - Expected: PASS. + - 2026-06-25: PASS. 전체 탭 UI state/model/mapper 구현 후 타입별 audios/series 선택, tag/adult/original/paging metadata 대상 테스트 성공. -- [ ] **Task 3.3: SeriesContentCardView 성인 배지 테스트 작성** +- [x] **Task 3.3: SeriesContentCardView 성인 배지 테스트 작성** - 생성: - `app/src/test/java/kr/co/vividnext/sodalive/v2/widget/SeriesContentCardViewTest.kt` - 테스트 케이스: @@ -274,8 +283,9 @@ - 검증: - Run: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.widget.SeriesContentCardViewTest"` - Expected: adult badge 미구현으로 RED 실패. + - 2026-06-25: RED 확인. adult badge 구현 전 테스트를 먼저 추가하고 실행했다. 병렬 Gradle 실행 중 incremental resource merge cache 오류로 실패가 발생해 이후 검증은 순차 실행으로 전환했다. -- [ ] **Task 3.4: SeriesContentCardView 성인 배지 구현** +- [x] **Task 3.4: SeriesContentCardView 성인 배지 구현** - 수정: - `app/src/main/res/layout/view_series_content_card.xml` - `app/src/main/java/kr/co/vividnext/sodalive/v2/widget/SeriesContentCardView.kt` @@ -291,6 +301,7 @@ - 검증: - Run: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.widget.SeriesContentCardViewTest"` - Expected: PASS. + - 2026-06-25: PASS. `view_series_content_card.xml`에 adult badge 추가 및 `SeriesContentCardView.setAdultVisible()`/size별 icon-layout 갱신 구현 후 대상 테스트 성공. --- @@ -454,3 +465,22 @@ ## Verification Log - 문서 작성 시점에는 구현 전이므로 실행한 빌드/테스트가 없다. +- 2026-06-25 Phase 1~3 구현 검증: + - PASS: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.content.MainContentAllDayOfWeekMapperTest"` + - PASS: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.content.MainContentAllTabMapperTest"` + - PASS: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.widget.SeriesContentCardViewTest"` + - PASS: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.content.*"` + - PASS: `./gradlew :app:mergeDebugResources` + - PASS: `./gradlew :app:compileDebugKotlin` + - PASS: `./gradlew :app:ktlintCheck` (`disabled_rules` deprecation warning만 출력) + - PASS: `git diff --check` + - 참고: Kotlin LSP는 로컬에 `kotlin-lsp`가 설치되어 있지 않아 `lsp_diagnostics`를 사용할 수 없었고, `compileDebugKotlin`으로 대체 검증했다. +- 2026-06-25 Phase 1~3 코드 리뷰 및 재검증: + - PASS: Phase 1~3 변경 범위를 PRD와 계획/TASK 문서 기준으로 검토했고, 차단 이슈는 발견하지 않았다. + - PASS: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.content.*"` + - PASS: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.widget.SeriesContentCardViewTest"` + - PASS: `./gradlew :app:mergeDebugResources` + - PASS: `./gradlew :app:compileDebugKotlin` + - PASS: `./gradlew :app:ktlintCheck` + - PASS: `git diff --check` + - 참고: `./gradlew :app:mergeDebugResources`는 최초 실행 시 Gradle wrapper lock 파일 접근이 샌드박스에서 차단되어 실패했고, 승인 실행으로 재검증해 성공했다.