docs(creator): 라이브 탭 문서를 갱신한다
This commit is contained in:
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
**Goal:** `GET /api/v2/creator-channels/{creatorId}/live` 응답을 기반으로 크리에이터 채널의 `라이브` 탭에 현재 라이브, 라이브 다시듣기 목록, 정렬, pagination, 본인 채널 전용 하단 `라이브 시작하기` CTA를 표시한다.
|
**Goal:** `GET /api/v2/creator-channels/{creatorId}/live` 응답을 기반으로 크리에이터 채널의 `라이브` 탭에 현재 라이브, 라이브 다시듣기 목록, 정렬, pagination, 본인 채널 전용 하단 `라이브 시작하기` CTA를 표시한다.
|
||||||
|
|
||||||
**Architecture:** 기존 `CreatorChannelActivity`의 `ViewPager2`/`CreatorChannelPagerAdapter` 구조를 유지하고, `CreatorChannelTab.Live`의 placeholder를 신규 `CreatorChannelLiveFragment`로 교체한다. API/Repository/ViewModel/mapper/UI model은 기존 `kr.co.vividnext.sodalive.v2.creator.channel` 패키지 하위에 최소 추가하고, 홈 탭에서 이미 쓰는 `CreatorChannelLiveResponse`, `CreatorChannelAudioContentResponse`, 본인 판정, 라이브 시작 진입 흐름은 가능한 한 재사용한다.
|
**Architecture:** 기존 `CreatorChannelActivity`의 `ViewPager2`/`CreatorChannelPagerAdapter` 구조를 유지하고, `CreatorChannelTab.Live`의 placeholder를 신규 `CreatorChannelLiveFragment`로 교체한다. 라이브 탭 전용 Fragment/ViewModel/mapper/UI model/adapter/popup은 `kr.co.vividnext.sodalive.v2.creator.channel.live` 하위에 둔다. API/Repository는 홈 탭과 라이브 탭이 함께 쓰는 채널 공통 계층으로 보고 기존 `CreatorChannelHomeApi`/`CreatorChannelHomeRepository`를 `CreatorChannelApi`/`CreatorChannelRepository`로 rename한다. 홈 탭에서 이미 쓰는 `CreatorChannelLiveResponse`, `CreatorChannelAudioContentResponse`, 본인 판정, 라이브 시작 진입 흐름은 가능한 한 재사용한다.
|
||||||
|
|
||||||
**Tech Stack:** Kotlin, Android XML Views, ViewBinding, RecyclerView, Retrofit, Gson, RxJava3, Koin, JUnit4/Robolectric local unit test.
|
**Tech Stack:** Kotlin, Android XML Views, ViewBinding, RecyclerView, Retrofit, Gson, RxJava3, Koin, JUnit4/Robolectric local unit test.
|
||||||
|
|
||||||
@@ -14,10 +14,11 @@
|
|||||||
- PRD: `docs/20260617_크리에이터_채널_라이브_탭/prd.md`
|
- PRD: `docs/20260617_크리에이터_채널_라이브_탭/prd.md`
|
||||||
- 기존 채널 컨테이너: `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivity.kt`
|
- 기존 채널 컨테이너: `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivity.kt`
|
||||||
- 기존 탭 adapter: `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelPagerAdapter.kt`
|
- 기존 탭 adapter: `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelPagerAdapter.kt`
|
||||||
- 기존 홈 API/DTO/Repository:
|
- 기존 채널 API/DTO/Repository:
|
||||||
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/data/CreatorChannelHomeApi.kt`
|
- rename 대상: `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/data/CreatorChannelHomeApi.kt` -> `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/data/CreatorChannelApi.kt`
|
||||||
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/data/CreatorChannelHomeModels.kt`
|
- rename 대상: `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/data/CreatorChannelHomeRepository.kt` -> `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/data/CreatorChannelRepository.kt`
|
||||||
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/data/CreatorChannelHomeRepository.kt`
|
- 유지/확장: `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/data/CreatorChannelHomeModels.kt`
|
||||||
|
- 별도 `CreatorChannelLiveApi`, `CreatorChannelLiveRepository`는 생성하지 않는다.
|
||||||
- Figma:
|
- Figma:
|
||||||
- 전체: `290:8945`
|
- 전체: `290:8945`
|
||||||
- Sort-bar: `290:8949`
|
- Sort-bar: `290:8949`
|
||||||
@@ -38,6 +39,7 @@
|
|||||||
- `ic_new_create_live`
|
- `ic_new_create_live`
|
||||||
- 구현 완료 후 최소 다음 명령을 실행한다.
|
- 구현 완료 후 최소 다음 명령을 실행한다.
|
||||||
- `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*Live*"`
|
- `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*Live*"`
|
||||||
|
- `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.live.*"`
|
||||||
- `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*"`
|
- `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*"`
|
||||||
- `./gradlew :app:mergeDebugResources`
|
- `./gradlew :app:mergeDebugResources`
|
||||||
- `./gradlew :app:compileDebugKotlin`
|
- `./gradlew :app:compileDebugKotlin`
|
||||||
@@ -68,23 +70,23 @@
|
|||||||
## 파일 구조
|
## 파일 구조
|
||||||
- 수정: `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelPagerAdapter.kt`
|
- 수정: `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelPagerAdapter.kt`
|
||||||
- `CreatorChannelTab.Live`를 신규 `CreatorChannelLiveFragment`로 연결한다.
|
- `CreatorChannelTab.Live`를 신규 `CreatorChannelLiveFragment`로 연결한다.
|
||||||
- 생성: `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelLiveFragment.kt`
|
- 생성: `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/live/CreatorChannelLiveFragment.kt`
|
||||||
- 라이브 탭 UI, adapter, sort menu, pagination, CTA click 연결을 담당한다.
|
- 라이브 탭 UI, adapter, sort menu, pagination, CTA click 연결을 담당한다.
|
||||||
- 생성 후보: `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelLiveViewModel.kt`
|
- 생성 후보: `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/live/CreatorChannelLiveViewModel.kt`
|
||||||
- 라이브 탭 API 호출, 정렬 변경, pagination 상태, loading/error/content 상태를 관리한다.
|
- 라이브 탭 API 호출, 정렬 변경, pagination 상태, loading/error/content 상태를 관리한다.
|
||||||
- 수정: `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/data/CreatorChannelHomeApi.kt`
|
- rename: `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/data/CreatorChannelHomeApi.kt` -> `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/data/CreatorChannelApi.kt`
|
||||||
- `GET /api/v2/creator-channels/{creatorId}/live` endpoint를 추가하거나, 필요 시 파일명을 공용 API 역할에 맞춰 최소 변경한다.
|
- 홈 API와 라이브 API endpoint를 함께 가진 채널 공통 API로 변경한다.
|
||||||
- 수정: `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/data/CreatorChannelHomeRepository.kt`
|
- rename: `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/data/CreatorChannelHomeRepository.kt` -> `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/data/CreatorChannelRepository.kt`
|
||||||
- 라이브 탭 API 호출 method를 추가하거나, 필요 시 공용 Repository 역할에 맞춰 최소 변경한다.
|
- 홈 API, 라이브 API, 팔로우, 대화, 후원, 신고 등 채널 공통 동작을 제공한다.
|
||||||
- 수정: `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/data/CreatorChannelHomeModels.kt`
|
- 수정: `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/data/CreatorChannelHomeModels.kt`
|
||||||
- `CreatorChannelLiveTabResponse`, `ContentSort`를 추가하고 `CreatorChannelAudioContentResponse`에 라이브 탭 전용 필드 `isAdult`, `isOwned`, `isRented`를 서버 계약에 맞춰 추가한다.
|
- `CreatorChannelLiveTabResponse`, `ContentSort`를 추가하고 `CreatorChannelAudioContentResponse`에 라이브 탭 전용 필드 `isAdult`, `isOwned`, `isRented`를 서버 계약에 맞춰 추가한다.
|
||||||
- 생성 후보: `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/model/CreatorChannelLiveUiModels.kt`
|
- 생성 후보: `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/live/model/CreatorChannelLiveUiModels.kt`
|
||||||
- sort option, replay item status, pagination 상태, CTA 노출 여부를 순수 UI model로 정의한다.
|
- sort option, replay item status, pagination 상태, CTA 노출 여부를 순수 UI model로 정의한다.
|
||||||
- 생성 후보: `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/model/CreatorChannelLiveMappers.kt`
|
- 생성 후보: `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/live/model/CreatorChannelLiveMappers.kt`
|
||||||
- DTO를 UI model로 변환하고 소장/대여/무료/가격/포인트/19금 상태를 결정한다.
|
- DTO를 UI model로 변환하고 소장/대여/무료/가격/포인트/19금 상태를 결정한다.
|
||||||
- 생성: `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/ui/CreatorChannelLiveReplayAdapter.kt`
|
- 생성: `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/live/ui/CreatorChannelLiveReplayAdapter.kt`
|
||||||
- 라이브 다시듣기 목록 RecyclerView adapter를 담당한다.
|
- 라이브 다시듣기 목록 RecyclerView adapter를 담당한다.
|
||||||
- 생성 후보: `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/ui/CreatorChannelLiveSortPopup.kt`
|
- 생성 후보: `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/live/ui/CreatorChannelLiveSortPopup.kt`
|
||||||
- Sort-bar anchor 기준 컨텍스트 메뉴 표시를 담당한다.
|
- Sort-bar anchor 기준 컨텍스트 메뉴 표시를 담당한다.
|
||||||
- 생성: `app/src/main/res/layout/fragment_creator_channel_live.xml`
|
- 생성: `app/src/main/res/layout/fragment_creator_channel_live.xml`
|
||||||
- sort-bar, current live card container, replay RecyclerView, owner CTA를 포함한다.
|
- sort-bar, current live card container, replay RecyclerView, owner CTA를 포함한다.
|
||||||
@@ -99,10 +101,10 @@
|
|||||||
- 수정: `app/src/main/java/kr/co/vividnext/sodalive/di/AppDI.kt`
|
- 수정: `app/src/main/java/kr/co/vividnext/sodalive/di/AppDI.kt`
|
||||||
- 신규 ViewModel/API/Repository binding이 필요하면 추가한다.
|
- 신규 ViewModel/API/Repository binding이 필요하면 추가한다.
|
||||||
- 테스트 생성:
|
- 테스트 생성:
|
||||||
- `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelLiveMapperTest.kt`
|
- `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/live/CreatorChannelLiveMapperTest.kt`
|
||||||
- `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelLivePaginationTest.kt`
|
- `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/live/CreatorChannelLivePaginationTest.kt`
|
||||||
- `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelLiveViewModelTest.kt`
|
- `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/live/CreatorChannelLiveViewModelTest.kt`
|
||||||
- `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelLiveFragmentLayoutTest.kt`
|
- `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/live/CreatorChannelLiveFragmentLayoutTest.kt`
|
||||||
- `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelPagerAdapterTest.kt`
|
- `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelPagerAdapterTest.kt`
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -138,6 +140,25 @@
|
|||||||
- 검증:
|
- 검증:
|
||||||
- 위 4개 drawable 리소스가 존재함을 확인한다.
|
- 위 4개 drawable 리소스가 존재함을 확인한다.
|
||||||
|
|
||||||
|
- [ ] **Task 1.3: 채널 공통 API/Repository rename**
|
||||||
|
- rename:
|
||||||
|
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/data/CreatorChannelHomeApi.kt` -> `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/data/CreatorChannelApi.kt`
|
||||||
|
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/data/CreatorChannelHomeRepository.kt` -> `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/data/CreatorChannelRepository.kt`
|
||||||
|
- 수정:
|
||||||
|
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelHomeViewModel.kt`
|
||||||
|
- `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelHomeViewModelTest.kt`
|
||||||
|
- `app/src/main/java/kr/co/vividnext/sodalive/di/AppDI.kt`
|
||||||
|
- 기타 `CreatorChannelHomeApi`, `CreatorChannelHomeRepository` import 참조 파일
|
||||||
|
- 작업:
|
||||||
|
- class/interface 이름을 `CreatorChannelApi`, `CreatorChannelRepository`로 변경한다.
|
||||||
|
- 기존 홈 탭 동작은 변경하지 않는다.
|
||||||
|
- 별도 `CreatorChannelLiveApi`, `CreatorChannelLiveRepository`는 만들지 않는다.
|
||||||
|
- 검증 명령:
|
||||||
|
- `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelHomeViewModelTest"`
|
||||||
|
- `./gradlew :app:compileDebugKotlin`
|
||||||
|
- 기대 결과:
|
||||||
|
- rename 후 기존 홈 탭 ViewModel 테스트와 컴파일이 PASS한다.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### Phase 2: API/DTO/Repository/ViewModel 계약 추가
|
### Phase 2: API/DTO/Repository/ViewModel 계약 추가
|
||||||
@@ -157,8 +178,8 @@
|
|||||||
|
|
||||||
- [ ] **Task 2.2: 라이브 탭 endpoint와 Repository method 추가**
|
- [ ] **Task 2.2: 라이브 탭 endpoint와 Repository method 추가**
|
||||||
- 수정:
|
- 수정:
|
||||||
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/data/CreatorChannelHomeApi.kt`
|
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/data/CreatorChannelApi.kt`
|
||||||
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/data/CreatorChannelHomeRepository.kt`
|
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/data/CreatorChannelRepository.kt`
|
||||||
- 작업:
|
- 작업:
|
||||||
- `@GET("/api/v2/creator-channels/{creatorId}/live")` endpoint를 추가한다.
|
- `@GET("/api/v2/creator-channels/{creatorId}/live")` endpoint를 추가한다.
|
||||||
- query parameter `page`, `size`, `sort`를 전달한다.
|
- query parameter `page`, `size`, `sort`를 전달한다.
|
||||||
@@ -170,8 +191,8 @@
|
|||||||
|
|
||||||
- [ ] **Task 2.3: ViewModel RED 테스트 작성**
|
- [ ] **Task 2.3: ViewModel RED 테스트 작성**
|
||||||
- 생성:
|
- 생성:
|
||||||
- `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelLiveViewModelTest.kt`
|
- `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/live/CreatorChannelLiveViewModelTest.kt`
|
||||||
- `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelLivePaginationTest.kt`
|
- `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/live/CreatorChannelLivePaginationTest.kt`
|
||||||
- 작업:
|
- 작업:
|
||||||
- 최초 로딩이 `page=0`, `sort=LATEST`로 호출되는지 검증한다.
|
- 최초 로딩이 `page=0`, `sort=LATEST`로 호출되는지 검증한다.
|
||||||
- `hasNext == true`일 때 `page + 1`로 다음 페이지를 요청하는지 검증한다.
|
- `hasNext == true`일 때 `page + 1`로 다음 페이지를 요청하는지 검증한다.
|
||||||
@@ -179,14 +200,14 @@
|
|||||||
- 정렬 변경 시 목록과 page가 초기화되는지 검증한다.
|
- 정렬 변경 시 목록과 page가 초기화되는지 검증한다.
|
||||||
- 선택 중인 정렬을 다시 선택하면 API를 재호출하지 않는지 검증한다.
|
- 선택 중인 정렬을 다시 선택하면 API를 재호출하지 않는지 검증한다.
|
||||||
- 검증 명령:
|
- 검증 명령:
|
||||||
- `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelLiveViewModelTest"`
|
- `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.live.CreatorChannelLiveViewModelTest"`
|
||||||
- `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelLivePaginationTest"`
|
- `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.live.CreatorChannelLivePaginationTest"`
|
||||||
- 기대 결과:
|
- 기대 결과:
|
||||||
- ViewModel 미구현 상태에서 RED 실패한다.
|
- ViewModel 미구현 상태에서 RED 실패한다.
|
||||||
|
|
||||||
- [ ] **Task 2.4: `CreatorChannelLiveViewModel` 구현**
|
- [ ] **Task 2.4: `CreatorChannelLiveViewModel` 구현**
|
||||||
- 생성:
|
- 생성:
|
||||||
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelLiveViewModel.kt`
|
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/live/CreatorChannelLiveViewModel.kt`
|
||||||
- 수정:
|
- 수정:
|
||||||
- `app/src/main/java/kr/co/vividnext/sodalive/di/AppDI.kt`
|
- `app/src/main/java/kr/co/vividnext/sodalive/di/AppDI.kt`
|
||||||
- 작업:
|
- 작업:
|
||||||
@@ -194,8 +215,8 @@
|
|||||||
- `page=0`, `size` 기본값, `sort=LATEST` 초기값을 적용한다.
|
- `page=0`, `size` 기본값, `sort=LATEST` 초기값을 적용한다.
|
||||||
- 정렬 변경과 pagination 요청 중복 방지 로직을 구현한다.
|
- 정렬 변경과 pagination 요청 중복 방지 로직을 구현한다.
|
||||||
- 검증 명령:
|
- 검증 명령:
|
||||||
- `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelLiveViewModelTest"`
|
- `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.live.CreatorChannelLiveViewModelTest"`
|
||||||
- `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelLivePaginationTest"`
|
- `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.live.CreatorChannelLivePaginationTest"`
|
||||||
- 기대 결과:
|
- 기대 결과:
|
||||||
- ViewModel/pagination 테스트가 PASS한다.
|
- ViewModel/pagination 테스트가 PASS한다.
|
||||||
|
|
||||||
@@ -205,7 +226,7 @@
|
|||||||
|
|
||||||
- [ ] **Task 3.1: 라이브 다시듣기 표시 정책 RED 테스트 작성**
|
- [ ] **Task 3.1: 라이브 다시듣기 표시 정책 RED 테스트 작성**
|
||||||
- 생성:
|
- 생성:
|
||||||
- `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelLiveMapperTest.kt`
|
- `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/live/CreatorChannelLiveMapperTest.kt`
|
||||||
- 작업:
|
- 작업:
|
||||||
- `isOwned && isRented` 동시 true면 `소장중` 상태가 선택되는지 검증한다.
|
- `isOwned && isRented` 동시 true면 `소장중` 상태가 선택되는지 검증한다.
|
||||||
- `price == 0`이면 무료 tag와 play CTA 상태가 선택되는지 검증한다.
|
- `price == 0`이면 무료 tag와 play CTA 상태가 선택되는지 검증한다.
|
||||||
@@ -214,20 +235,20 @@
|
|||||||
- `seriesName`은 secondary text에 포함되지 않는지 검증한다.
|
- `seriesName`은 secondary text에 포함되지 않는지 검증한다.
|
||||||
- `isFirstContent`, `isOriginalSeries`는 기존 오디오 item 정책과 동일한 tag 상태로 매핑되는지 검증한다.
|
- `isFirstContent`, `isOriginalSeries`는 기존 오디오 item 정책과 동일한 tag 상태로 매핑되는지 검증한다.
|
||||||
- 검증 명령:
|
- 검증 명령:
|
||||||
- `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelLiveMapperTest"`
|
- `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.live.CreatorChannelLiveMapperTest"`
|
||||||
- 기대 결과:
|
- 기대 결과:
|
||||||
- mapper 미구현 상태에서 RED 실패한다.
|
- mapper 미구현 상태에서 RED 실패한다.
|
||||||
|
|
||||||
- [ ] **Task 3.2: UI model/mapper 구현**
|
- [ ] **Task 3.2: UI model/mapper 구현**
|
||||||
- 생성 후보:
|
- 생성 후보:
|
||||||
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/model/CreatorChannelLiveUiModels.kt`
|
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/live/model/CreatorChannelLiveUiModels.kt`
|
||||||
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/model/CreatorChannelLiveMappers.kt`
|
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/live/model/CreatorChannelLiveMappers.kt`
|
||||||
- 작업:
|
- 작업:
|
||||||
- sort label resource, replay item CTA/status, tag 상태, current live 상태를 UI model로 분리한다.
|
- sort label resource, replay item CTA/status, tag 상태, current live 상태를 UI model로 분리한다.
|
||||||
- 가격/포인트/소장중/대여중/play button 상태 우선순위를 순수 함수로 고정한다.
|
- 가격/포인트/소장중/대여중/play button 상태 우선순위를 순수 함수로 고정한다.
|
||||||
- `ContentSort`와 문자열 리소스 매핑을 구현한다.
|
- `ContentSort`와 문자열 리소스 매핑을 구현한다.
|
||||||
- 검증 명령:
|
- 검증 명령:
|
||||||
- `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelLiveMapperTest"`
|
- `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.live.CreatorChannelLiveMapperTest"`
|
||||||
- 기대 결과:
|
- 기대 결과:
|
||||||
- mapper 테스트가 PASS한다.
|
- mapper 테스트가 PASS한다.
|
||||||
|
|
||||||
@@ -254,8 +275,8 @@
|
|||||||
|
|
||||||
- [ ] **Task 4.2: Adapter와 Fragment 구현**
|
- [ ] **Task 4.2: Adapter와 Fragment 구현**
|
||||||
- 생성:
|
- 생성:
|
||||||
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelLiveFragment.kt`
|
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/live/CreatorChannelLiveFragment.kt`
|
||||||
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/ui/CreatorChannelLiveReplayAdapter.kt`
|
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/live/ui/CreatorChannelLiveReplayAdapter.kt`
|
||||||
- 작업:
|
- 작업:
|
||||||
- ViewModel 상태를 관찰해 sort-bar, current live card, replay list, loading/empty/error를 갱신한다.
|
- ViewModel 상태를 관찰해 sort-bar, current live card, replay list, loading/empty/error를 갱신한다.
|
||||||
- replay item click은 기존 오디오 컨텐츠 상세/재생 진입 정책을 확인해 연결한다.
|
- replay item click은 기존 오디오 컨텐츠 상세/재생 진입 정책을 확인해 연결한다.
|
||||||
@@ -268,13 +289,13 @@
|
|||||||
|
|
||||||
- [ ] **Task 4.3: Fragment layout 테스트 추가**
|
- [ ] **Task 4.3: Fragment layout 테스트 추가**
|
||||||
- 생성:
|
- 생성:
|
||||||
- `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelLiveFragmentLayoutTest.kt`
|
- `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/live/CreatorChannelLiveFragmentLayoutTest.kt`
|
||||||
- 작업:
|
- 작업:
|
||||||
- `fragment_creator_channel_live.xml`에 sort-bar, RecyclerView, owner CTA가 존재하는지 검증한다.
|
- `fragment_creator_channel_live.xml`에 sort-bar, RecyclerView, owner CTA가 존재하는지 검증한다.
|
||||||
- `item_creator_channel_live_replay.xml`에 19금 badge, point/free tag container, price/play/status 영역이 존재하는지 검증한다.
|
- `item_creator_channel_live_replay.xml`에 19금 badge, point/free tag container, price/play/status 영역이 존재하는지 검증한다.
|
||||||
- `ic_new_*` 리소스 참조가 layout 또는 코드 상수로 연결되는지 검증한다.
|
- `ic_new_*` 리소스 참조가 layout 또는 코드 상수로 연결되는지 검증한다.
|
||||||
- 검증 명령:
|
- 검증 명령:
|
||||||
- `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelLiveFragmentLayoutTest"`
|
- `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.live.CreatorChannelLiveFragmentLayoutTest"`
|
||||||
- 기대 결과:
|
- 기대 결과:
|
||||||
- layout 테스트가 PASS한다.
|
- layout 테스트가 PASS한다.
|
||||||
|
|
||||||
@@ -284,10 +305,10 @@
|
|||||||
|
|
||||||
- [ ] **Task 5.1: Sort popup 구현**
|
- [ ] **Task 5.1: Sort popup 구현**
|
||||||
- 생성 후보:
|
- 생성 후보:
|
||||||
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/ui/CreatorChannelLiveSortPopup.kt`
|
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/live/ui/CreatorChannelLiveSortPopup.kt`
|
||||||
- `app/src/main/res/layout/view_creator_channel_live_sort_menu.xml`
|
- `app/src/main/res/layout/view_creator_channel_live_sort_menu.xml`
|
||||||
- 수정:
|
- 수정:
|
||||||
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelLiveFragment.kt`
|
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/live/CreatorChannelLiveFragment.kt`
|
||||||
- 작업:
|
- 작업:
|
||||||
- Sort-bar 정렬 영역 아래에 Figma `290:9041` 형태의 컨텍스트 메뉴를 표시한다.
|
- Sort-bar 정렬 영역 아래에 Figma `290:9041` 형태의 컨텍스트 메뉴를 표시한다.
|
||||||
- 현재 선택 항목은 focused 배경으로 표시한다.
|
- 현재 선택 항목은 focused 배경으로 표시한다.
|
||||||
@@ -298,14 +319,14 @@
|
|||||||
|
|
||||||
- [ ] **Task 5.2: Sort 동작 테스트 보강**
|
- [ ] **Task 5.2: Sort 동작 테스트 보강**
|
||||||
- 수정:
|
- 수정:
|
||||||
- `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelLiveViewModelTest.kt`
|
- `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/live/CreatorChannelLiveViewModelTest.kt`
|
||||||
- `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelLiveMapperTest.kt`
|
- `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/live/CreatorChannelLiveMapperTest.kt`
|
||||||
- 작업:
|
- 작업:
|
||||||
- `ContentSort`별 label resource 매핑을 검증한다.
|
- `ContentSort`별 label resource 매핑을 검증한다.
|
||||||
- 정렬 변경 시 첫 페이지가 다시 로딩되는지 검증한다.
|
- 정렬 변경 시 첫 페이지가 다시 로딩되는지 검증한다.
|
||||||
- 같은 정렬 재선택은 API 재호출을 하지 않는지 검증한다.
|
- 같은 정렬 재선택은 API 재호출을 하지 않는지 검증한다.
|
||||||
- 검증 명령:
|
- 검증 명령:
|
||||||
- `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*Live*"`
|
- `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.live.*"`
|
||||||
- 기대 결과:
|
- 기대 결과:
|
||||||
- sort 관련 테스트가 PASS한다.
|
- sort 관련 테스트가 PASS한다.
|
||||||
|
|
||||||
@@ -315,7 +336,7 @@
|
|||||||
|
|
||||||
- [ ] **Task 6.1: 본인 CTA 노출과 inset 처리 구현**
|
- [ ] **Task 6.1: 본인 CTA 노출과 inset 처리 구현**
|
||||||
- 수정:
|
- 수정:
|
||||||
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelLiveFragment.kt`
|
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/live/CreatorChannelLiveFragment.kt`
|
||||||
- `app/src/main/res/layout/fragment_creator_channel_live.xml`
|
- `app/src/main/res/layout/fragment_creator_channel_live.xml`
|
||||||
- 작업:
|
- 작업:
|
||||||
- 본인 채널일 때만 하단 CTA를 표시한다.
|
- 본인 채널일 때만 하단 CTA를 표시한다.
|
||||||
@@ -334,7 +355,7 @@
|
|||||||
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivity.kt`
|
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivity.kt`
|
||||||
- `app/src/main/java/kr/co/vividnext/sodalive/live/room/create/LiveRoomCreateActivity.kt`
|
- `app/src/main/java/kr/co/vividnext/sodalive/live/room/create/LiveRoomCreateActivity.kt`
|
||||||
- 수정:
|
- 수정:
|
||||||
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelLiveFragment.kt`
|
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/live/CreatorChannelLiveFragment.kt`
|
||||||
- 필요 시 `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivity.kt`
|
- 필요 시 `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivity.kt`
|
||||||
- 작업:
|
- 작업:
|
||||||
- `CreatorChannelActivity`의 기존 owner FAB live action과 같은 진입 경로를 재사용한다.
|
- `CreatorChannelActivity`의 기존 owner FAB live action과 같은 진입 경로를 재사용한다.
|
||||||
@@ -363,13 +384,13 @@
|
|||||||
- [ ] **Task 7.2: DI와 lifecycle 통합**
|
- [ ] **Task 7.2: DI와 lifecycle 통합**
|
||||||
- 수정:
|
- 수정:
|
||||||
- `app/src/main/java/kr/co/vividnext/sodalive/di/AppDI.kt`
|
- `app/src/main/java/kr/co/vividnext/sodalive/di/AppDI.kt`
|
||||||
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelLiveFragment.kt`
|
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/live/CreatorChannelLiveFragment.kt`
|
||||||
- 작업:
|
- 작업:
|
||||||
- 신규 ViewModel/API/Repository injection이 기존 홈 탭과 충돌하지 않는지 확인한다.
|
- 신규 ViewModel/API/Repository injection이 기존 홈 탭과 충돌하지 않는지 확인한다.
|
||||||
- Fragment 재생성 후 정렬, page, 목록 상태가 ViewModel에 유지되는지 확인한다.
|
- Fragment 재생성 후 정렬, page, 목록 상태가 ViewModel에 유지되는지 확인한다.
|
||||||
- 탭 전환 시 중복 최초 API 호출이 발생하지 않도록 초기 로딩 조건을 정리한다.
|
- 탭 전환 시 중복 최초 API 호출이 발생하지 않도록 초기 로딩 조건을 정리한다.
|
||||||
- 검증 명령:
|
- 검증 명령:
|
||||||
- `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*Live*"`
|
- `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.live.*"`
|
||||||
- `./gradlew :app:compileDebugKotlin`
|
- `./gradlew :app:compileDebugKotlin`
|
||||||
- 기대 결과:
|
- 기대 결과:
|
||||||
- Live 탭 관련 테스트와 컴파일이 PASS한다.
|
- Live 탭 관련 테스트와 컴파일이 PASS한다.
|
||||||
@@ -380,6 +401,7 @@
|
|||||||
|
|
||||||
- [ ] **Task 8.1: 자동 검증 실행**
|
- [ ] **Task 8.1: 자동 검증 실행**
|
||||||
- 실행 명령:
|
- 실행 명령:
|
||||||
|
- `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.live.*"`
|
||||||
- `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*Live*"`
|
- `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*Live*"`
|
||||||
- `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*"`
|
- `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*"`
|
||||||
- `./gradlew :app:mergeDebugResources`
|
- `./gradlew :app:mergeDebugResources`
|
||||||
|
|||||||
@@ -245,6 +245,9 @@ Sort-bar는 라이브 다시듣기 총 개수와 현재 정렬 상태를 표시
|
|||||||
## 9. Technical Constraints
|
## 9. Technical Constraints
|
||||||
- Android Gradle 단일 `:app` 모듈에서 구현한다.
|
- Android Gradle 단일 `:app` 모듈에서 구현한다.
|
||||||
- 신규 `Fragment`, `ViewModel`, adapter, DTO, Repository 등은 `kr.co.vividnext.sodalive.v2` 하위에 작성한다.
|
- 신규 `Fragment`, `ViewModel`, adapter, DTO, Repository 등은 `kr.co.vividnext.sodalive.v2` 하위에 작성한다.
|
||||||
|
- 라이브 탭 전용 `Fragment`, `ViewModel`, UI model, mapper, adapter, popup/helper는 `kr.co.vividnext.sodalive.v2.creator.channel.live` 하위에 작성한다.
|
||||||
|
- 크리에이터 채널 API와 Repository는 홈 탭과 라이브 탭이 함께 사용하는 공통 계층으로 보고, 기존 `CreatorChannelHomeApi`/`CreatorChannelHomeRepository`는 `CreatorChannelApi`/`CreatorChannelRepository`로 rename한다.
|
||||||
|
- 라이브 탭용 별도 `CreatorChannelLiveApi`/`CreatorChannelLiveRepository`는 만들지 않는다. 기존 Repository가 홈 API 외 팔로우, 대화, 후원, 신고 등 채널 공통 액션을 이미 담당하므로 공통 채널 Repository로 명명하는 편이 역할에 맞다.
|
||||||
- 크리에이터 채널 홈 탭에서 이미 정의된 공통 모델/컴포넌트가 있으면 우선 재사용한다.
|
- 크리에이터 채널 홈 탭에서 이미 정의된 공통 모델/컴포넌트가 있으면 우선 재사용한다.
|
||||||
- API DTO는 서버 계약과 동일한 필드명을 사용한다.
|
- API DTO는 서버 계약과 동일한 필드명을 사용한다.
|
||||||
- `ContentSort`는 API 전송 값과 UI label을 분리하고, UI label은 문자열 리소스로 관리한다.
|
- `ContentSort`는 API 전송 값과 UI label을 분리하고, UI label은 문자열 리소스로 관리한다.
|
||||||
@@ -279,6 +282,8 @@ Sort-bar는 라이브 다시듣기 총 개수와 현재 정렬 상태를 표시
|
|||||||
- `seriesName`은 라이브 다시듣기 item에 표시하지 않는다.
|
- `seriesName`은 라이브 다시듣기 item에 표시하지 않는다.
|
||||||
- `isFirstContent`, `isOriginalSeries`는 기존 오디오 item 정책과 동일하게 매핑한다.
|
- `isFirstContent`, `isOriginalSeries`는 기존 오디오 item 정책과 동일하게 매핑한다.
|
||||||
- `라이브 시작하기` 버튼 icon drawable 리소스명은 `ic_new_create_live`이다.
|
- `라이브 시작하기` 버튼 icon drawable 리소스명은 `ic_new_create_live`이다.
|
||||||
|
- 라이브 탭 전용 코드는 `kr.co.vividnext.sodalive.v2.creator.channel.live` 하위에 둔다.
|
||||||
|
- 채널 API/Repository는 `CreatorChannelApi`/`CreatorChannelRepository`로 rename해 홈 탭과 라이브 탭이 함께 사용한다.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user