diff --git a/docs/20260611_크리에이터_채널_홈_탭/plan-task.md b/docs/20260611_크리에이터_채널_홈_탭/plan-task.md index 0dbf16a9..036bede2 100644 --- a/docs/20260611_크리에이터_채널_홈_탭/plan-task.md +++ b/docs/20260611_크리에이터_채널_홈_탭/plan-task.md @@ -1458,6 +1458,115 @@ --- +### Phase 16: 작성/생성 결과 처리와 현재 라이브 시간 표시 버그 수정 + +- [x] **Task 16.1: 라이브 생성 완료 후 라이브 페이지 이동** + - 수정: + - `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivity.kt` + - `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivitySourceTest.kt` + - 작업: + - `LiveRoomCreateActivity`를 단순 `startActivity`가 아니라 `ActivityResultContracts.StartActivityForResult()` launcher로 실행한다. + - `RESULT_OK`에서 `Constants.EXTRA_ROOM_ID`를 읽고, 유효한 roomId이면 `LiveRoomActivity`에 `Constants.EXTRA_ROOM_ID`를 전달해 진입한다. + - 검증 기록: + - 2026-06-16: RED로 owner FAB 라이브 생성 결과 처리 source 계약을 추가했고, `formatCreatorChannelLiveDateTime` 미구현 컴파일 실패와 함께 production 변경 전 실패를 확인했다. 구현은 기존 `LiveRoomCreateActivity`의 `setResult(RESULT_OK, EXTRA_ROOM_ID)` 계약을 재사용했다. + - 2026-06-16: 구현 후 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelActivitySourceTest.owner FAB 라이브 생성 결과는 roomId로 라이브 상세를 연다"`를 포함한 신규 focused 테스트 묶음이 PASS했다. `./gradlew :app:compileDebugKotlin`, `./gradlew :app:mergeDebugResources`, `./gradlew :app:assembleDebug`, `git diff --check`도 PASS했다. + +- [x] **Task 16.2: 커뮤니티 게시글 업로드 후 홈 새로고침** + - 수정: + - `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivity.kt` + - `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelHomeFragment.kt` + - `app/src/main/java/kr/co/vividnext/sodalive/explorer/profile/creator_community/write/CreatorCommunityWriteActivity.kt` + - `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivitySourceTest.kt` + - 작업: + - 커뮤니티 작성 화면 업로드 성공 시 `setResult(RESULT_OK)` 후 종료한다. + - 채널 Activity는 커뮤니티 작성 결과가 `RESULT_OK`이면 HomeFragment delegate의 `refreshHome()`을 호출한다. + - HomeFragment는 `creatorId > 0L`일 때 `viewModel.loadHome(creatorId)`를 재호출한다. + - 검증 기록: + - 2026-06-16: RED로 커뮤니티 작성 완료 결과와 홈 새로고침 source 계약을 추가했다. 구현은 기존 HomeFragment의 최초 로딩 경로인 `viewModel.loadHome(creatorId)`를 그대로 재사용했다. + - 2026-06-16: 구현 후 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelActivitySourceTest.커뮤니티 작성 완료 결과는 홈 Fragment를 새로고침한다"`를 포함한 신규 focused 테스트 묶음이 PASS했다. `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*"`는 기존 후원 섹션 source 계약 1건(`CreatorChannelActivitySourceTest.kt:638`, `item_creator_channel_home_donation.xml`의 `196dp` 기대)으로 실패했으며 이번 변경과 무관하다. + +- [x] **Task 16.3: 현재 라이브 UTC 시간 로컬 절대 시간 표시** + - 수정: + - `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/ui/CreatorChannelHomeSectionAdapter.kt` + - `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivitySourceTest.kt` + - 작업: + - 현재 진행 중인 라이브의 `beginDateTimeUtc` 원문 표시를 중단한다. + - UTC 문자열을 디바이스 타임존 기준 `yyyy.MM.dd HH:mm:ss` 형식으로 변환해 표시한다. + - 검증 기록: + - 2026-06-16: RED로 `Asia/Seoul` 기준 `2026-06-29T15:00:01Z`가 `2026.06.30 00:00:01`로 변환되는 테스트를 추가했다. 기존 schedule formatter와 같은 UTC parser를 재사용해 구현했다. + - 2026-06-16: 구현 후 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelActivitySourceTest.현재 진행 중인 라이브 시간은 디바이스 timezone 기준 초 단위 날짜 시간으로 표시한다"`를 포함한 신규 focused 테스트 묶음이 PASS했다. `./gradlew :app:ktlintCheck`는 기존 `creator_community` 패키지명 underscore 위반 1건만 남아 실패했고, 이번 변경으로 발생한 포맷/문법 오류는 수정 후 `./gradlew :app:compileDebugKotlin` PASS로 확인했다. + +- [x] **Task 16.4: 라이브 생성 결과와 현재 라이브 카드의 정상 입장 플로우 보강** + - 수정: + - `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivity.kt` + - `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelHomeFragment.kt` + - `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/ui/CreatorChannelHomeSectionAdapter.kt` + - `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivitySourceTest.kt` + - 작업: + - 라이브 생성 완료 결과는 `LiveRoomActivity` 직접 이동 대신 `LiveFragment.enterLiveRoom()`과 같은 `getRoomDetail()`/`enterRoom()` 입장 플로우를 탄다. + - 본인 방은 즉시 `enterRoom()` 후 입장한다. + - 다른 크리에이터의 무료/이미 결제된 공개 방은 `enterRoom()` 후 입장한다. + - 다른 크리에이터의 비공개 방은 비밀번호 다이얼로그를 거쳐 `enterRoom()` 후 입장한다. + - 다른 크리에이터의 유료 공개 방은 결제 확인 다이얼로그를 거쳐 `enterRoom()` 후 입장한다. + - 크리에이터 채널 홈 최상단 현재 라이브 카드는 같은 `enterLiveRoom(live.liveId)` 경로로 입장한다. + - 검증 기록: + - 2026-06-16: RED로 `owner FAB 라이브 생성 결과는 기존 enterLiveRoom 플로우로 입장한다`, `현재 라이브 카드는 동일한 enterLiveRoom 플로우로 입장한다` source 계약을 추가했고 기존 구현에서 2개 테스트 실패를 확인했다. + - 2026-06-16: 구현 후 두 focused 테스트를 재실행해 PASS했다. + +- [x] **Task 16.5: 라이브 생성 후 홈 새로고침과 입장 진행/오류 피드백 표시** + - 수정: + - `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivity.kt` + - `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivitySourceTest.kt` + - 작업: + - 라이브 생성 완료 결과가 `RESULT_OK`이면 커뮤니티 게시글 업로드와 동일하게 홈 탭을 새로고침한다. + - 현재 라이브 카드 터치 후 `getRoomDetail()`/`enterRoom()` API 호출 중에는 `LoadingDialog`를 표시한다. + - 현재 라이브 입장 API 실패/오류 시 `LiveViewModel.toastLiveData`를 관찰해 사용자에게 toast를 표시한다. + - 검증 기록: + - 2026-06-16: RED로 `현재 라이브 입장 API 진행과 오류는 LoadingDialog와 toast로 표시한다` source 계약을 추가했고 기존 구현에서 실패를 확인했다. + - 2026-06-16: 구현 후 `owner FAB 라이브 생성 결과는 기존 enterLiveRoom 플로우로 입장한다`, `현재 라이브 입장 API 진행과 오류는 LoadingDialog와 toast로 표시한다`, `현재 라이브 카드는 동일한 enterLiveRoom 플로우로 입장한다` focused 테스트를 재실행해 PASS했다. `./gradlew :app:compileDebugKotlin`, `./gradlew :app:mergeDebugResources`, `git diff --check`도 PASS했다. 병렬 Gradle 실행 중 `compileDebugKotlin` 산출물 `NoSuchFileException`이 한 번 발생했으나 순차 재실행에서 성공했다. + - 2026-06-16: `LiveFragment`의 생성 결과 처리와 동일하게 `Constants.EXTRA_ROOM_CHANNEL_NAME`이 null이 아닐 때만 `enterLiveRoom()`을 호출하도록 보정했다. source test에 `EXTRA_ROOM_CHANNEL_NAME` 확인과 `channelName != null` 계약을 추가했고, focused source test, `./gradlew :app:compileDebugKotlin`, `git diff --check` 순차 재검증이 PASS했다. + +--- + +### Phase 17: 크리에이터 채널 Live 생성 안내와 예약 상세 액션 분리 + +- [x] **Task 17.1: 크리에이터 채널 Live 로직 coordinator 분리** + - 수정: + - `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivity.kt` + - 생성: + - `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelLiveCoordinator.kt` + - 작업: + - `CreatorChannelActivity`의 Live 입장, 상세, 결제/비밀번호, 예약/수정/시작/취소 관련 로직을 `CreatorChannelLiveCoordinator`로 이동한다. + - Activity는 Live 생성 결과, 현재 라이브 클릭, 일정 라이브 클릭에서 coordinator 호출만 담당한다. + - 검증 기록: + - 2026-06-17: `CreatorChannelLiveCoordinator`를 추가하고 `CreatorChannelActivity`의 Live 입장, Live 상세, 결제/비밀번호 다이얼로그, LiveRoom 이동 로직을 coordinator로 이동했다. Activity는 `liveCoordinator.enterLiveRoom()`과 `liveCoordinator.showLiveRoomDetail()` 호출만 담당하도록 축소했다. + +- [x] **Task 17.2: 예약 라이브 생성 완료 안내 표시** + - 수정: + - `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivity.kt` + - `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivitySourceTest.kt` + - 작업: + - 크리에이터 채널에서 예약 라이브 생성 완료 시 `라이브가 생성되었습니다.` 안내 메시지를 표시한다. + - `LiveRoomCreateActivity`의 결과에서 `Constants.EXTRA_ROOM_CHANNEL_NAME`이 없는 생성 성공을 예약 라이브 생성으로 판단한다. + - 검증 기록: + - 2026-06-17: `LiveRoomCreateActivity` 결과에서 `Constants.EXTRA_ROOM_CHANNEL_NAME`이 없는 `RESULT_OK`를 예약 라이브 생성 완료로 판단해 `라이브가 생성되었습니다.` toast를 표시하도록 구현했다. 즉시 라이브 생성은 기존처럼 `channelName != null`일 때만 `liveCoordinator.enterLiveRoom()`으로 입장한다. + - 2026-06-17: 리뷰에서 사용자 노출 문구 하드코딩 지적이 있어 `creator_channel_live_created_message` string resource로 분리하고 `values`, `values-en`, `values-ja`에 추가했다. + +- [x] **Task 17.3: 일정 섹션 예약 라이브 상세 액션 연결** + - 수정: + - `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelLiveCoordinator.kt` + - `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivitySourceTest.kt` + - 작업: + - 일정 섹션에서 예약 라이브 상세를 열 때 `LiveFragment`와 동일하게 예약, 수정, 시작, 취소 액션을 연결한다. + - 예약은 유료/비공개 분기를 거쳐 예약 완료 화면으로 이동한다. + - 수정은 `LiveRoomEditActivity`, 시작은 `startLive()` 후 LiveRoom 입장, 취소는 취소 다이얼로그 후 홈 새로고침으로 연결한다. + - 검증 기록: + - 2026-06-17: `LiveRoomDetailFragment` 콜백에 `reservationRoom`, `modifyLive`, `startLive`, `cancelLive`를 연결했다. 예약은 유료/비공개 분기 후 `LiveReservationCompleteActivity`로 이동하고, 수정은 `LiveRoomEditActivity`, 시작은 `startLive()` 후 LiveRoom 입장, 취소는 `LiveCancelDialog` 후 홈 새로고침으로 연결했다. + - 2026-06-17: source 계약 테스트 3건(`owner FAB 라이브 생성 결과는 기존 enterLiveRoom 플로우로 입장한다`, `크리에이터 채널 라이브 로직은 coordinator로 분리한다`, `일정 라이브 상세는 예약 수정 시작 취소 액션을 연결한다`)이 PASS했다. 첫 focused 테스트 실행 중 Kotlin incremental 상태에서 extension import 미해결 컴파일 오류가 한 번 발생했으나, 순차 `./gradlew :app:compileDebugKotlin` 재실행과 focused test 재실행이 모두 PASS했다. `./gradlew :app:ktlintCheck`, `git diff --check`도 PASS했다. + - 2026-06-17: 컨텍스트 마이닝 리뷰에서 현재 라이브 카드 입장 전 로그인/성인 인증 게이트가 누락되었다는 FAIL을 받아, `LiveFragment`/`LiveNowAllActivity`와 동일하게 `ensureLoginAndAdultAuth(live.isAdult)`를 거친 뒤 `liveCoordinator.enterLiveRoom()`을 호출하도록 보정했다. + +--- + ## Verification Log - 2026-06-12: `docs/20260611_크리에이터_채널_홈_탭/prd.md`, `docs/agent-guides/work-plan-docs.md`, `docs/agent-guides/build-test-style.md`, `docs/agent-guides/code-style.md`를 확인해 계획 문서 작성 규칙과 검증 명령 규칙을 확인했다. - 2026-06-12: 기존 `HomeRecommendationApi`, `HomeRecommendationModels`, `HomeRecommendationRepository`, `HomeRecommendationViewModel`, `RecommendedActivityType`, `HomeRecommendationMappers`, `HomeRecommendationUiModels`, `AppDI`, `ChatRoomActivity`, `DmChatRoomActivity`를 확인해 신규 크리에이터 채널 홈 구현 계획의 파일 경계와 재사용 지점을 정리했다.