From b04c01c930bfe100797f639902ccd30ef8f7b9a8 Mon Sep 17 00:00:00 2001 From: klaus Date: Mon, 22 Jun 2026 17:46:41 +0900 Subject: [PATCH] =?UTF-8?q?docs(creator):=20FanTalk=20=ED=83=AD=20Phase=20?= =?UTF-8?q?4=EC=99=80=205=20=EA=B2=80=EC=A6=9D=EC=9D=84=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 --- docs/20260622_FanTalk_탭/plan-task.md | 37 +++++++++++++++++++++------ 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/docs/20260622_FanTalk_탭/plan-task.md b/docs/20260622_FanTalk_탭/plan-task.md index 3b592c8a..e6b8d360 100644 --- a/docs/20260622_FanTalk_탭/plan-task.md +++ b/docs/20260622_FanTalk_탭/plan-task.md @@ -365,7 +365,7 @@ ### Phase 4: FanTalk 목록 UI와 popup 구현 -- [ ] **Task 4.1: Fragment layout과 문자열 추가** +- [x] **Task 4.1: Fragment layout과 문자열 추가** - 생성: - `app/src/main/res/layout/fragment_creator_channel_fantalk.xml` - 수정: @@ -384,8 +384,11 @@ - 기대 결과: - 신규 layout/string resource merge가 PASS한다. - 검증 기록: + - 2026-06-22: `fragment_creator_channel_fantalk.xml`을 추가하고 content 상태 count bar, RecyclerView, error/retry, empty container, floating write button을 배치했다. sort label/icon/popup 진입 영역은 추가하지 않았다. + - 2026-06-22: `creator_channel_fantalk_empty_message`, `creator_channel_fantalk_error_message`, `creator_channel_fantalk_retry`, `creator_channel_fantalk_all_label`, `creator_channel_fantalk_report`, `creator_channel_fantalk_edit`, `creator_channel_fantalk_delete` 문자열을 한국어/영어/일본어 리소스에 추가했다. + - 2026-06-22: `./gradlew :app:mergeDebugResources` 실행 결과 PASS. -- [ ] **Task 4.2: FanTalk item layout과 adapter 추가** +- [x] **Task 4.2: FanTalk item layout과 adapter 추가** - 생성: - `app/src/main/res/layout/item_creator_channel_fantalk.xml` - `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/fantalk/ui/CreatorChannelFanTalkAdapter.kt` @@ -405,8 +408,11 @@ - 기대 결과: - item layout과 adapter 추가 후 resource merge와 Kotlin compile이 PASS한다. - 검증 기록: + - 2026-06-22: `item_creator_channel_fantalk.xml`과 `CreatorChannelFanTalkAdapter.kt`를 추가했다. 원글/답글 프로필, 닉네임, 시간, 본문, 권한별 `신고`/`ic_new_more`, reply card와 connector visibility를 UI model 기준으로 바인딩한다. + - 2026-06-22: profile image는 `loadUrl`과 `CircleCropTransformation`, `ic_placeholder_profile` placeholder/error를 사용하도록 구현했다. + - 2026-06-22: `./gradlew :app:mergeDebugResources`, `./gradlew :app:compileDebugKotlin` 실행 결과 PASS. -- [ ] **Task 4.3: 더보기 popup 추가** +- [x] **Task 4.3: 더보기 popup 추가** - 생성: - `app/src/main/res/layout/view_creator_channel_fantalk_more_popup.xml` - `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/fantalk/ui/CreatorChannelFanTalkMorePopup.kt` @@ -421,8 +427,10 @@ - 기대 결과: - popup class 추가 후 컴파일이 PASS한다. - 검증 기록: + - 2026-06-22: `view_creator_channel_fantalk_more_popup.xml`과 `CreatorChannelFanTalkMorePopup.kt`를 추가했다. `showEdit`, `showDelete`에 따라 `수정하기`, `삭제하기`를 표시하고 수정은 dismiss만, 삭제는 dismiss 후 callback으로 `fanTalkId`를 전달한다. + - 2026-06-22: `./gradlew :app:compileDebugKotlin` 실행 결과 PASS. -- [ ] **Task 4.4: Fragment layout source 테스트 추가** +- [x] **Task 4.4: Fragment layout source 테스트 추가** - 생성: - `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/fantalk/CreatorChannelFanTalkFragmentLayoutTest.kt` - 테스트 케이스: @@ -438,12 +446,14 @@ - 기대 결과: - Layout source 테스트가 GREEN이다. - 검증 기록: + - 2026-06-22: `CreatorChannelFanTalkFragmentLayoutTest.kt`를 추가했다. fragment layout의 sort UI 부재, count/empty/floating write button, item action/reply container, popup 수정/삭제 TextView, adapter/popup source 계약을 검증한다. + - 2026-06-22: RED 확인으로 신규 layout/resource 구현 전 테스트가 layout/id 부재로 실패함을 확인했고, 구현 후 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.fantalk.CreatorChannelFanTalkFragmentLayoutTest"` 실행 결과 PASS. --- ### Phase 5: Fragment 동작, 신고/삭제, empty 상태 연결 -- [ ] **Task 5.1: `CreatorChannelFanTalkFragment` 구현** +- [x] **Task 5.1: `CreatorChannelFanTalkFragment` 구현** - 생성: - `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/fantalk/CreatorChannelFanTalkFragment.kt` - 작업: @@ -464,8 +474,11 @@ - 기대 결과: - Fragment 추가 후 컴파일이 PASS한다. - 검증 기록: + - 2026-06-22: TDD RED로 `CreatorChannelPagerAdapterTest`, `CreatorChannelActivitySourceTest`, `CreatorChannelFanTalkFragmentLayoutTest`에 FanTalk Fragment/Host/source 계약 기대값을 먼저 추가했다. production 변경 전 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelPagerAdapterTest" --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelActivitySourceTest"` 실행 시 `CreatorChannelFanTalkFragment` unresolved reference로 실패해 신규 Fragment와 wiring 누락을 확인했다. + - 2026-06-22: `CreatorChannelFanTalkFragment.kt`를 추가하고 Koin `by viewModel()`, `LinearLayoutManager`, `CreatorChannelFanTalkAdapter`, Loading/Error/Empty/Content visibility, no-op write buttons, report dialog, owner more popup, delete confirmed entry, pagination/action toast consume, Host callback을 구현했다. + - 2026-06-22: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.fantalk.CreatorChannelFanTalkFragmentLayoutTest"` 실행 결과 PASS. -- [ ] **Task 5.2: `CreatorChannelActivity`에 FanTalk Host 연결** +- [x] **Task 5.2: `CreatorChannelActivity`에 FanTalk Host 연결** - 수정: - `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivity.kt` - 작업: @@ -482,8 +495,10 @@ - 기대 결과: - Activity Host 연결 후 컴파일이 PASS한다. - 검증 기록: + - 2026-06-22: `CreatorChannelActivity`가 `CreatorChannelFanTalkFragment.Host`를 구현하도록 추가하고 `findFanTalkFragment()`, 탭 선택/header 변경 dispatch, bottom scroll dispatch, load-more tab 포함, content changed 높이 갱신, 삭제 확인 `SodaDialog` 및 confirm 시 Fragment 삭제 entry 호출을 연결했다. + - 2026-06-22: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelActivitySourceTest"` 실행 결과 PASS. -- [ ] **Task 5.3: `CreatorChannelPagerAdapter`에 FanTalk 탭 연결** +- [x] **Task 5.3: `CreatorChannelPagerAdapter`에 FanTalk 탭 연결** - 수정: - `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelPagerAdapter.kt` - `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelPagerAdapterTest.kt` @@ -496,8 +511,10 @@ - 기대 결과: - PagerAdapter 테스트가 GREEN이다. - 검증 기록: + - 2026-06-22: `CreatorChannelTab.FanTalk -> CreatorChannelFanTalkFragment.newInstance(creatorId)` 분기를 추가하고 `CreatorChannelPagerAdapterTest`에서 FanTalk 실제 Fragment 생성 및 placeholder 제외 기대값을 갱신했다. + - 2026-06-22: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelPagerAdapterTest"` 실행 결과 PASS. -- [ ] **Task 5.4: Activity source 테스트 갱신** +- [x] **Task 5.4: Activity source 테스트 갱신** - 수정: - `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivitySourceTest.kt` - 작업: @@ -512,6 +529,8 @@ - 기대 결과: - Activity source 테스트가 GREEN이다. - 검증 기록: + - 2026-06-22: `CreatorChannelActivitySourceTest`의 FanTalk 분기 부재 기대값을 제거하고 Pager/Activity/Fragment source 계약 검증으로 교체했다. Host 구현, `findFanTalkFragment()`, 탭 선택/header selected dispatch, scrolled bottom, load more tab 포함, content changed callback, delete clicked dialog, delete confirmed callback을 검증한다. + - 2026-06-22: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelActivitySourceTest"` 실행 결과 PASS. --- @@ -566,3 +585,5 @@ - 문서 작성 시점에는 구현을 수행하지 않았으므로 빌드/테스트 검증 기록이 없다. - 2026-06-22: Phase 2, 3 코드 리뷰를 수행했다. API/DTO/Repository/ViewModel/mapper/action model/test 변경이 PRD와 계획 문서의 계약 범위 안에 있으며, 레거시 파일 직접 수정 없이 기존 repository/dialog 계약을 호출하는 구조임을 확인했다. blocking finding은 발견하지 못했다. - 2026-06-22: Phase 2, 3 검증으로 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.fantalk.*"`, `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*FanTalk*"`, `./gradlew :app:compileDebugKotlin`, `./gradlew :app:ktlintCheck`, `git diff --check`, `git diff --cached --check`를 실행했고 모두 PASS했다. +- 2026-06-22: Phase 4, 5 코드 리뷰를 수행했다. Figma `290:9139`, `290:9000` 기준으로 count bar, sort UI 부재, 원글/답글 item, 권한별 action, more popup, floating/empty write button, empty 문구를 구현과 대조했고 blocking finding은 발견하지 못했다. +- 2026-06-22: Phase 4, 5 재검증으로 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.fantalk.CreatorChannelFanTalkFragmentLayoutTest"`, `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelActivitySourceTest" --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelPagerAdapterTest"`, `./gradlew :app:mergeDebugResources`, `./gradlew :app:compileDebugKotlin`, `./gradlew :app:ktlintCheck`, `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.fantalk.*"`, `git diff --check`를 실행했고 모두 PASS했다. 최초 `mergeDebugResources`는 Gradle wrapper lock 파일 샌드박스 접근 제한으로 실패했으며, 동일 명령을 승인 실행해 PASS를 확인했다.