From 40337c959050abd0fa99022251a9b8cba16c4d03 Mon Sep 17 00:00:00 2001 From: klaus Date: Fri, 10 Jul 2026 07:35:19 +0900 Subject: [PATCH] =?UTF-8?q?docs(content):=20=EC=A0=84=EC=B2=B4=20=ED=83=AD?= =?UTF-8?q?=20=ED=9B=84=EC=86=8D=20=EC=9A=94=EA=B5=AC=EB=A5=BC=20=EA=B8=B0?= =?UTF-8?q?=EB=A1=9D=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plan-task.md | 88 +++++++++++++++++++ .../prd.md | 12 ++- 2 files changed, 97 insertions(+), 3 deletions(-) diff --git a/docs/20260625_메인_콘텐츠_탭_내부_전체_탭/plan-task.md b/docs/20260625_메인_콘텐츠_탭_내부_전체_탭/plan-task.md index 65b3f101..c44e6ccf 100644 --- a/docs/20260625_메인_콘텐츠_탭_내부_전체_탭/plan-task.md +++ b/docs/20260625_메인_콘텐츠_탭_내부_전체_탭/plan-task.md @@ -478,9 +478,97 @@ - 2026-06-25: PASS. sort popup이 기존 `CreatorChannelSortPopup` 형태로 열리고 `ContentSort` 옵션 `최신순`, `인기순`, `소장순`, `높은 가격순`, `낮은 가격순`이 표시됨을 캡처 `sodalive_phase6_sort_popup.png`와 hierarchy로 확인했다. - 2026-06-25: BLOCKED. `GET /api/v2/audio/contents`가 수동 검증 환경에서 `HTTP 404`를 반환해 실제 오디오/시리즈 카드 3열 grid 데이터 표시, 하단 스크롤 append, 시리즈 성인 배지의 실데이터 표시는 확인하지 못했다. 해당 항목은 단위 테스트와 source/layout 검증으로 대체 확인했다. +### Phase 7: 전체 탭 sort-bar와 정렬 조건 후속 수정 + +- [x] **Task 7.1: sort-bar 전체 개수 표시 제거** + - 수정: + - `app/src/main/res/layout/fragment_v2_main_content.xml` + - `app/src/main/java/kr/co/vividnext/sodalive/v2/main/content/ContentMainFragment.kt` + - `app/src/test/java/kr/co/vividnext/sodalive/v2/main/content/ContentMainFragmentSourceTest.kt` + - 작업: + - sort-bar 좌측에는 `전체` 라벨만 표시하고 `totalCount` TextView와 binding 업데이트를 제거한다. + - `MainContentAllTabUiState.totalCount`는 Empty 판단과 상태 보존을 위해 유지하되 화면에는 표시하지 않는다. + - 검증: + - Run: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.content.ContentMainFragmentSourceTest"` + - Expected: 전체 탭 layout/source에서 total count 표시 계약이 제거된다. + - 검증 기록: + - 2026-07-10: PASS. `tv_content_all_total_count` layout 제거, `binding.tvContentAllTotalCount.text` source 제거를 반영했고, `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.content.*"`에서 `ContentMainFragmentSourceTest` 포함 전체 탭 패키지 테스트 성공. + +- [x] **Task 7.2: 전체 탭 정렬 옵션 노출 정책 적용** + - 수정: + - `app/src/main/java/kr/co/vividnext/sodalive/v2/main/content/model/MainContentAllTabUiModels.kt` + - `app/src/main/java/kr/co/vividnext/sodalive/v2/main/content/ContentAllTabViewModel.kt` + - `app/src/main/java/kr/co/vividnext/sodalive/v2/main/content/ContentMainFragment.kt` + - `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/ui/CreatorChannelSortPopup.kt` + - `app/src/test/java/kr/co/vividnext/sodalive/v2/main/content/ContentAllTabViewModelTest.kt` + - `app/src/test/java/kr/co/vividnext/sodalive/v2/main/content/ContentMainFragmentSourceTest.kt` + - 작업: + - 전체 탭 정렬 옵션에서 `ContentSort.OWNED`를 제외한다. + - `MainContentAllType.FREE` 선택 시 `ContentSort.PRICE_HIGH`, `ContentSort.PRICE_LOW`를 제외한다. + - 무료 타입에서 가격 정렬이 외부 선택 또는 이전 상태로 유입되면 `LATEST`로 보정해 표시/요청 조건이 일치하게 한다. + - 기존 `CreatorChannelSortPopup` 사용처 영향 방지를 위해 옵션 목록은 기본값을 유지하고 전체 탭에서만 필터 목록을 전달한다. + - 검증: + - Run: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.content.*"` + - Expected: 전체 탭 정렬 option/source/ViewModel 테스트가 PASS한다. + - 검증 기록: + - 2026-07-10: PASS. `MainContentAllType.contentAllSortOptions()`와 `normalizeContentAllSort()`를 추가해 전체 탭 정렬에서 `OWNED`를 제외하고, `FREE` 타입에서는 `PRICE_HIGH`, `PRICE_LOW`를 제외했다. + - 2026-07-10: PASS. `ContentAllTabViewModelTest`에 외부 FREE 가격 정렬 보정, 무료 타입 변경 시 이전 가격 정렬 보정, 소장순 보정 테스트를 추가했다. + - 2026-07-10: PASS. `MainContentAllTabMapperTest`에 전체 탭 정렬 옵션의 소장순 제외와 무료 타입 가격순 제외 테스트를 추가했다. + - 2026-07-10: PASS. `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.content.*"` 성공. + +- [x] **Task 7.3: 후속 수정 통합 검증** + - 실행: + - `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.content.*"` + - `./gradlew :app:mergeDebugResources` + - `./gradlew :app:compileDebugKotlin` + - `./gradlew :app:ktlintCheck` + - `git diff --check` + - 기대 결과: + - 전체 탭 후속 수정 관련 테스트, 리소스 merge, Kotlin compile, ktlint, whitespace 검증이 모두 성공한다. + - 검증 기록: + - 2026-07-10: PASS. `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.content.*"` 성공. + - 2026-07-10: PASS. `./gradlew :app:mergeDebugResources` 성공. 최초 일반 실행은 Gradle wrapper lock 파일 접근이 샌드박스에서 차단되어 실패했고, 권한 상승 실행으로 재검증했다. + - 2026-07-10: PASS. `./gradlew :app:compileDebugKotlin` 성공. + - 2026-07-10: PASS. `./gradlew :app:ktlintCheck` 성공. `.editorconfig disabled_rules` deprecation warning은 기존 설정 경고로 남아 있다. + - 2026-07-10: PASS. `git diff --check` 성공. + +- [x] **Task 7.4: sort-bar 좌측 전체 라벨 제거와 정렬 위치 유지** + - 수정: + - `app/src/main/res/layout/fragment_v2_main_content.xml` + - `app/src/test/java/kr/co/vividnext/sodalive/v2/main/content/ContentMainFragmentSourceTest.kt` + - 작업: + - `tv_content_all_total_label`을 제거한다. + - 정렬 버튼은 기존처럼 sort-bar 우측에 위치하도록 spacer를 유지한다. + - 검증: + - Run: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.content.ContentMainFragmentSourceTest"` + - Expected: 전체 탭 sort-bar에 좌측 `전체` 라벨 id/text가 없고, 정렬 버튼 우측 배치 구조가 유지된다. + - 검증 기록: + - 2026-07-10: PASS. `tv_content_all_total_label`을 제거하고 같은 위치 유지용 `Space`를 추가했다. + - 2026-07-10: PASS. `ContentMainFragmentSourceTest`에 label id/text 제거와 spacer/정렬 버튼 구조 유지 계약을 반영했다. + - 2026-07-10: PASS. `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.content.ContentMainFragmentSourceTest"` 성공. + - 2026-07-10: PASS. `./gradlew :app:ktlintCheck` 성공. `.editorconfig disabled_rules` deprecation warning은 기존 설정 경고로 남아 있다. + - 2026-07-10: PASS. `git diff --check` 성공. + --- ## Verification Log +- 2026-07-10 Phase 7 전체 탭 sort-bar/정렬 조건 후속 수정 검증: + - 수정 완료: sort-bar의 `tv_content_all_total_count`와 `ContentMainFragment`의 total count binding 업데이트를 제거해 화면에 콘텐츠 전체 개수가 표시되지 않도록 했다. + - 수정 완료: 전체 탭 전용 정렬 옵션에서 `ContentSort.OWNED`를 제외하고, `FREE` 타입에서는 `ContentSort.PRICE_HIGH`, `ContentSort.PRICE_LOW`도 제외했다. + - 수정 완료: 외부 선택 또는 이전 타입 상태에서 금지 정렬이 유입되면 `ContentSort.LATEST`로 보정하도록 `ContentAllTabViewModel`에 적용했다. + - PASS: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.content.*"` + - PASS: `./gradlew :app:mergeDebugResources` + - PASS: `./gradlew :app:compileDebugKotlin` + - PASS: `./gradlew :app:ktlintCheck` + - PASS: `git diff --check` + - 참고: `./gradlew :app:mergeDebugResources`는 최초 일반 실행에서 Gradle wrapper lock 파일 접근이 샌드박스에서 차단되어 실패했고, 권한 상승 실행으로 재검증해 성공했다. + - 참고: `ktlintCheck`의 `.editorconfig disabled_rules` deprecation warning과 Gradle deprecation warning은 기존 경고로 이번 변경과 무관하다. +- 2026-07-10 Phase 7 sort-bar 좌측 전체 라벨 추가 제거 검증: + - 수정 완료: `fragment_v2_main_content.xml`에서 `tv_content_all_total_label`을 제거하고, `Space`에 `layout_weight="1"`을 적용해 정렬 버튼의 우측 위치를 유지했다. + - PASS: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.content.ContentMainFragmentSourceTest"` + - PASS: `./gradlew :app:ktlintCheck` + - PASS: `git diff --check` + - 참고: `ktlintCheck`의 `.editorconfig disabled_rules` deprecation warning은 기존 경고로 이번 변경과 무관하다. - 문서 작성 시점에는 구현 전이므로 실행한 빌드/테스트가 없다. - 2026-06-25 Phase 1~3 구현 검증: - PASS: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.content.MainContentAllDayOfWeekMapperTest"` diff --git a/docs/20260625_메인_콘텐츠_탭_내부_전체_탭/prd.md b/docs/20260625_메인_콘텐츠_탭_내부_전체_탭/prd.md index f3c4bcac..987ecfdc 100644 --- a/docs/20260625_메인_콘텐츠_탭_내부_전체_탭/prd.md +++ b/docs/20260625_메인_콘텐츠_탭_내부_전체_탭/prd.md @@ -22,6 +22,10 @@ - 이번 범위의 `ORIGINAL`은 오리지널 시리즈 목록만 의미한다. - `SERIES` 타입에서만 요일 UI를 노출하고 `dayOfWeek` query parameter를 함께 전송한다. - Figma 디자인의 오디오, 시리즈, 오리지널 상태를 기준으로 기존 V2 위젯 재사용 후보를 우선 검토한다. +- 2026-07-10 후속 변경: 전체 탭 sort-bar에는 콘텐츠 전체 개수를 표시하지 않는다. +- 2026-07-10 후속 변경: 전체 탭 sort-bar에는 좌측 `전체` 라벨도 표시하지 않는다. +- 2026-07-10 후속 변경: 전체 탭 정렬 조건에서 `소장순`을 제거한다. +- 2026-07-10 후속 변경: `무료` 타입 선택 시 정렬 조건에서 `높은 가격순`, `낮은 가격순`을 표시하지 않는다. --- @@ -178,14 +182,16 @@ data class MainContentSeriesResponse( - 첫 페이지 로딩, 추가 페이지 로딩, 빈 목록, 에러 상태를 구분한다. - `hasNext = true`이고 사용자가 목록 하단에 접근하면 다음 `page`를 요청한다. - 추가 페이지 응답은 기존 목록 뒤에 append한다. -- `totalCount`는 Figma의 `전체 23` 영역처럼 전체 개수 표시가 필요한 경우 사용한다. +- `totalCount`는 상태 판단과 내부 모델 보존에는 사용할 수 있으나 sort-bar에 표시하지 않는다. +- sort-bar 좌측의 `전체` 라벨은 표시하지 않고, 정렬 버튼 위치는 기존 우측 위치를 유지한다. - 정렬 기본값은 `ContentSort.LATEST`이며 화면에는 기존 최신순 문자열을 사용한다. -- 정렬 옵션은 기존 `ContentSort` 값을 모두 사용한다. +- 정렬 옵션은 전체 탭 전용 노출 정책을 따른다. - `LATEST` - `POPULAR` - - `OWNED` - `PRICE_HIGH` - `PRICE_LOW` +- `OWNED`는 전체 탭 정렬 옵션에 노출하지 않는다. +- `FREE` 타입 선택 시에는 `PRICE_HIGH`, `PRICE_LOW`도 정렬 옵션에 노출하지 않는다. - 정렬 UI는 기존 `ContentSort` 사용 화면과 동일한 팝업/선택 UI 패턴을 따른다. - 기존 후보: `CreatorChannelSortPopup`, `ContentSort.toLabelResId()` - 정렬 변경 시 `page = 0`부터 현재 선택된 `type`, `dayOfWeek` 조건으로 다시 조회한다.