From 5b9b7eafa721db11561b9baf96c45c812d891d6e Mon Sep 17 00:00:00 2001 From: klaus Date: Mon, 6 Jul 2026 02:35:04 +0900 Subject: [PATCH] =?UTF-8?q?docs(home):=20=EB=A9=94=EC=9D=B8=20=ED=99=88=20?= =?UTF-8?q?=EC=B6=94=EC=B2=9C=20=ED=83=AD=20=EC=A7=80=EA=B8=88=20=EB=9D=BC?= =?UTF-8?q?=EC=9D=B4=EB=B8=8C=20=EC=A4=91=20=EC=9E=85=EC=9E=A5=20=EC=9E=91?= =?UTF-8?q?=EC=97=85=EC=9D=84=20=EA=B8=B0=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 | 37 +++++++++++++++++++ .../prd.md | 9 +++++ 2 files changed, 46 insertions(+) diff --git a/docs/20260626_현재_진행_중인_라이브_리스트_페이지/plan-task.md b/docs/20260626_현재_진행_중인_라이브_리스트_페이지/plan-task.md index 361458ff..18af82c2 100644 --- a/docs/20260626_현재_진행_중인_라이브_리스트_페이지/plan-task.md +++ b/docs/20260626_현재_진행_중인_라이브_리스트_페이지/plan-task.md @@ -302,3 +302,40 @@ - 2026-06-27 Phase 3 리뷰 반영: `HomeOnAirLiveActivity`에 기존 라이브 입장 정책과 동일하게 로그인 확인, `getRoomDetail(roomId)` 응답의 `isAdult` 기준 성인 인증/성인 콘텐츠 설정 가드, `LiveViewModel.isLoading/toastLiveData` 관찰을 추가했다. 이후 `./gradlew :app:mergeDebugResources --no-daemon`, `./gradlew :app:compileDebugKotlin --no-daemon`, `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.live.onair.*" --no-daemon`, `./gradlew :app:ktlintCheck --no-daemon`, `git diff --check` 모두 통과했다. - 2026-06-27 Phase 3 코드 리뷰 및 재검증: `HomeOnAirLiveActivity`에 `LiveViewModel` loading/toast 관찰과 `GetRoomDetailResponse.isAdult` 기준 성인 인증/성인 콘텐츠 설정 가드를 추가한 뒤 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.live.onair.*" --no-daemon`, `./gradlew :app:mergeDebugResources --no-daemon`, `./gradlew :app:compileDebugKotlin --no-daemon`, `./gradlew :app:ktlintCheck --no-daemon`, `git diff --check`를 순차 실행해 모두 통과했다. - 2026-06-27 Phase 4 최종 검증: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.live.onair.*" --no-daemon`, `./gradlew :app:mergeDebugResources --no-daemon`, `./gradlew :app:compileDebugKotlin --no-daemon`, `./gradlew :app:ktlintCheck --no-daemon` 모두 BUILD SUCCESSFUL을 확인했다. `git diff --check`는 출력이 없어 whitespace error가 없음을 확인했다. + +--- + +### Phase 5: 홈 추천 라이브 아이템 직접 입장 보완 + +- [x] **Task 5.1: HomeMainFragment 라이브 아이템 입장 source test 추가** + - 수정: + - `app/src/test/java/kr/co/vividnext/sodalive/v2/main/home/HomeMainFragmentLoginGuardSourceTest.kt` + - 작업: + - `onLiveClick()`이 `Unit` placeholder가 아니고 login guard, `getRoomDetail(roomId)`, `roomDetail.isAdult` guard, 기존 v2 `CreatorChannelLiveCoordinator` 입장 위임 순서를 갖는지 검증한다. + - 검증: + - Run: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentLoginGuardSourceTest" --no-daemon` + - Expected RED: 기존 `onLiveClick()` 미구현으로 신규 assertion 실패. + - RED Result: 신규 테스트 추가 후 기존 `onLiveClick = Unit` 상태에서 `HomeMainFragment 추천 라이브 아이템은 로그인과 성인 가드 후 기존 입장 흐름을 실행한다`가 실패함을 확인했다. + +- [x] **Task 5.2: HomeMainFragment 라이브 입장 흐름 구현** + - 수정: + - `app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/HomeMainFragment.kt` + - 작업: + - `LiveViewModel`을 주입하고 추천 라이브 클릭에서 `ensureMainV2NavigationAllowed`를 먼저 호출한다. + - 상세 조회 후 `roomDetail.isAdult` 기준으로 성인 guard를 수행하고, 기존 v2 `CreatorChannelLiveCoordinator`의 라이브 입장 분기를 재사용한다. + - 입장 전 오디오 재생 서비스를 중지한다. + - 검증: + - Run: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentLoginGuardSourceTest" --no-daemon` + - Expected GREEN: 신규 source test 포함 전체 통과. + - GREEN Result: `HomeMainFragment`가 `LiveViewModel.getRoomDetail(item.roomId)` 후 `requiresAdultContentAccess = roomDetail.isAdult` guard를 거쳐 `CreatorChannelLiveCoordinator.enterLiveRoom(item.roomId, roomDetail)`를 호출하도록 변경했고, 단일 source test가 BUILD SUCCESSFUL로 통과했다. + +- [x] **Task 5.3: 컴파일 및 회귀 검증** + - 검증: + - Run: `./gradlew :app:compileDebugKotlin --no-daemon` + - Expected: BUILD SUCCESSFUL. + - Run: `git diff --check` + - Expected: whitespace error 없음. + - Result: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.live.onair.HomeOnAirLiveEntryPolicyTest" --no-daemon`, `./gradlew :app:compileDebugKotlin --no-daemon`, `git diff --check` 모두 통과했다. 최초 병렬 Gradle 실행은 Kotlin incremental cache 충돌로 실패했으나, `./gradlew --stop` 후 순차 재실행에서 BUILD SUCCESSFUL을 확인했다. + +- 2026-07-06 Phase 5 검증: 홈 추천 라이브 클릭 source test를 RED 상태로 먼저 확인한 뒤, `HomeMainFragment`에서 로그인 guard, 상세 조회, `roomDetail.isAdult` 기반 성인 guard, 기존 v2 `CreatorChannelLiveCoordinator` 입장 위임을 연결했다. 이후 `HomeMainFragmentLoginGuardSourceTest`, `HomeOnAirLiveEntryPolicyTest`, `compileDebugKotlin`, `git diff --check`가 모두 통과했다. +- 2026-07-06 Phase 5 리뷰 반영: 코드 품질 리뷰에서 `getRoomDetail` 콜백 lifecycle guard 부재와 여러 ViewModel의 `LoadingDialog` 직접 제어 race가 지적되어, 콜백 초입에 `if (!isAdded || view == null) return@getRoomDetail`를 추가하고 recommendation/ranking/following/live entry loading state를 `updateLoadingDialog()`로 통합했다. 이후 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentLoginGuardSourceTest" --no-daemon`, `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.live.onair.HomeOnAirLiveEntryPolicyTest" --no-daemon`, `./gradlew :app:compileDebugKotlin --no-daemon`, `git diff --check`가 모두 통과했다. diff --git a/docs/20260626_현재_진행_중인_라이브_리스트_페이지/prd.md b/docs/20260626_현재_진행_중인_라이브_리스트_페이지/prd.md index 72d75e00..2443a196 100644 --- a/docs/20260626_현재_진행_중인_라이브_리스트_페이지/prd.md +++ b/docs/20260626_현재_진행_중인_라이브_리스트_페이지/prd.md @@ -147,3 +147,12 @@ data class HomeOnAirLiveResponse( ## 11. Open Questions - 없음. `LIVE ${라이브 시작시간}`은 `beginDateTimeUtc`를 디바이스 Timezone으로 변환한 `HH:mm` 표시로 확정한다. + +--- + +## 12. Follow-up: 홈 추천 라이브 아이템 직접 입장 +- 홈 추천 탭 최상단 `지금 라이브 중` 아이템 터치 시 기존 미구현 콜백을 보완한다. +- 터치 직후 `ensureMainV2NavigationAllowed`로 로그인 guard를 먼저 통과한다. +- 로그인 통과 후 `LiveViewModel.getRoomDetail(roomId)`를 호출하고, 상세 응답의 `isAdult == true`이면 `requiresAdultContentAccess = true`로 성인 인증/성인 콘텐츠 설정 guard를 한 번 더 통과한 뒤 입장한다. +- 실제 입장 분기는 기존 `LiveFragment.enterLiveRoom`과 동일한 `manager.id`, `price`, `isPaid`, `isPrivateRoom`, `beginDateTimeUtc` 기준을 따른다. +- 기존 레거시 `LiveFragment`, `LiveViewModel`, `LiveRepository`는 직접 수정하지 않는다.