From cb5d4f954d6c16706ab4a06c9a48478f304e3b42 Mon Sep 17 00:00:00 2001 From: klaus Date: Mon, 22 Jun 2026 01:44:34 +0900 Subject: [PATCH] =?UTF-8?q?docs(creator):=20=EC=BB=A4=EB=AE=A4=EB=8B=88?= =?UTF-8?q?=ED=8B=B0=20=ED=83=AD=20Phase=205=20=EA=B2=80=EC=A6=9D=EC=9D=84?= =?UTF-8?q?=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 | 69 +++++++++++++++++-- 1 file changed, 65 insertions(+), 4 deletions(-) diff --git a/docs/20260621_크리에이터_채널_커뮤니티_탭/plan-task.md b/docs/20260621_크리에이터_채널_커뮤니티_탭/plan-task.md index 0cfd7e2b..1e7be743 100644 --- a/docs/20260621_크리에이터_채널_커뮤니티_탭/plan-task.md +++ b/docs/20260621_크리에이터_채널_커뮤니티_탭/plan-task.md @@ -418,7 +418,7 @@ ### Phase 5: Activity/Pager/Owner CTA/Pagination 연결 -- [ ] **Task 5.1: PagerAdapter에서 Community Fragment 연결** +- [x] **Task 5.1: PagerAdapter에서 Community Fragment 연결** - 수정: - `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` @@ -429,8 +429,11 @@ - `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelPagerAdapterTest"` - 기대 결과: - Community 탭이 신규 Fragment로 연결됨이 검증된다. + - 검증 기록: + - 2026-06-22: RED로 `CreatorChannelPagerAdapterTest`에 Community 실제 Fragment 기대값을 먼저 추가했고, production 변경 전 `CreatorChannelPagerAdapterTest > createFragment는 Home Live Audio Series Community를 실제 Fragment로 생성하고 나머지는 placeholder를 유지한다`가 `CreatorChannelPagerAdapterTest.kt:31` assertion으로 실패함을 확인했다. + - 2026-06-22: `CreatorChannelPagerAdapter.createFragment()`에 `CreatorChannelTab.Community -> CreatorChannelCommunityFragment.newInstance(creatorId)` 분기를 추가하고 placeholder 기대에서 Community를 제외했다. `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelPagerAdapterTest"` PASS로 Community 탭 Fragment 연결을 확인했다. -- [ ] **Task 5.2: `CreatorChannelActivity` Host 연결** +- [x] **Task 5.2: `CreatorChannelActivity` Host 연결** - 수정: - `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` @@ -445,8 +448,11 @@ - `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelActivitySourceTest"` - 기대 결과: - Community 탭 선택/스크롤/높이 갱신 source 검증이 PASS한다. + - 검증 기록: + - 2026-06-22: RED로 `CreatorChannelActivitySourceTest`에 Community Host/pagination/owner CTA source 계약을 먼저 추가했고, production 변경 전 `CreatorChannelActivitySourceTest > Community tab source는 Fragment Host pagination owner CTA를 Activity에 연결한다`가 `CreatorChannelActivitySourceTest.kt:455` assertion으로 실패함을 확인했다. + - 2026-06-22: `CreatorChannelActivity`가 `CreatorChannelCommunityFragment.Host`를 구현하도록 연결하고, `findCommunityFragment()`, 탭 선택/header 변경 시 `onCreatorChannelCommunityTabSelected()`, 하단 스크롤 시 `onCreatorChannelCommunityScrolledToBottom()`, load-more 대상 포함, `onCreatorChannelCommunityContentChanged()`의 높이 갱신/추가 load-more 재평가를 추가했다. `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelActivitySourceTest.Community tab source는 Fragment Host pagination owner CTA를 Activity에 연결한다"` PASS로 source 계약을 확인했다. -- [ ] **Task 5.3: Owner CTA Community 연결** +- [x] **Task 5.3: Owner CTA Community 연결** - 수정: - `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivity.kt` - 작업: @@ -459,8 +465,11 @@ - `./gradlew :app:mergeDebugResources` - 기대 결과: - 본인 채널 Community 탭 하단 CTA 연결이 source/resource 검증으로 확인된다. + - 검증 기록: + - 2026-06-22: `currentOwnerCtaTab()`에 Community를 포함하고, Community 탭 CTA는 `ic_new_upload_community_post`/`creator_channel_owner_fab_community`를 bind하며 클릭 시 기존 `onOwnerFabCommunityClicked()`를 호출하도록 연결했다. `findCommunityFragment()?.onCreatorChannelCommunityOwnerCtaVisibilityChanged(ownerCtaTab == CreatorChannelTab.Community)` 경로도 추가해 Fragment padding 반영을 호출한다. + - 2026-06-22: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelActivitySourceTest.Community tab source는 Fragment Host pagination owner CTA를 Activity에 연결한다"` PASS, `./gradlew :app:mergeDebugResources` PASS로 source/resource 검증을 확인했다. -- [ ] **Task 5.4: media player 생명주기와 adapter 갱신 연결** +- [x] **Task 5.4: media player 생명주기와 adapter 갱신 연결** - 수정: - `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/community/CreatorChannelCommunityFragment.kt` - `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/community/ui/CreatorChannelCommunityListAdapter.kt` @@ -473,6 +482,29 @@ - `./gradlew :app:compileDebugKotlin` - 기대 결과: - 기존 media player manager import와 호출이 컴파일된다. + - 검증 기록: + - 2026-06-22: Phase 4에서 이미 구현된 `CreatorChannelCommunityFragment`의 `CreatorCommunityMediaPlayerManager(requireContext()) { listAdapter.notifyDataSetChanged() }`, `CreatorCommunityContentItem(item.postId, audioUrl)` 기반 `toggleContent()`, adapter `isPlayingContent(postId)` icon bind, `onPause()`/`onDestroyView()` 정리 경로를 Phase 5 source test로 재확인했다. 신규 production 변경은 Activity/Pager 연결에 한정했다. + - 2026-06-22: `./gradlew :app:compileDebugKotlin` PASS로 기존 media player manager import와 호출 컴파일을 확인했다. + +- [x] **Task 5.5: reviewer gate 후속 no-op Host API 제거** + - 수정: + - `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/community/CreatorChannelCommunityFragment.kt` + - `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` + - 작업: + - `CreatorChannelCommunityFragment.Host`에서 실제 호출되지 않는 `postId` 기반 owner more fallback API를 제거한다. + - `CreatorChannelActivity`의 `onCreatorChannelCommunityOwnerMoreClicked(postId: Long) = Unit` no-op 구현을 제거한다. + - 검증 명령: + - `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelActivitySourceTest.Community tab source는 Fragment Host pagination owner CTA를 Activity에 연결한다"` + - `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*Community*"` + - `./gradlew :app:compileDebugKotlin` + - 기대 결과: + - owner more Host API가 item 기반 콜백으로 단일화되고 no-op 구현 없이 컴파일된다. + - 검증 기록: + - 2026-06-22: RED로 `CreatorChannelActivitySourceTest`에 `onCreatorChannelCommunityOwnerMoreClicked(postId: Long)` 및 `onCreatorChannelCommunityOwnerMoreClicked(item.postId)` fallback 부재 검증을 추가했고, production 보정 전 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelActivitySourceTest.Community tab source는 Fragment Host pagination owner CTA를 Activity에 연결한다"`가 `CreatorChannelActivitySourceTest.kt:481` assertion으로 실패함을 확인했다. + - 2026-06-22: `CreatorChannelCommunityFragment.Host`를 item 기반 `onCreatorChannelCommunityOwnerMoreClicked(item)` 단일 API로 정리하고, `CreatorChannelActivity`의 `onCreatorChannelCommunityOwnerMoreClicked(postId: Long) = Unit` no-op override를 제거했다. + - 2026-06-22: 단일 GREEN으로 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelActivitySourceTest.Community tab source는 Fragment Host pagination owner CTA를 Activity에 연결한다"` PASS를 확인했다. 회귀로 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*Community*"`, `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*"`, `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.community.*"` PASS를 확인했다. + - 2026-06-22: `./gradlew :app:mergeDebugResources`, `./gradlew :app:compileDebugKotlin`, `./gradlew :app:ktlintCheck`, `git diff --check` PASS를 확인했다. 최초 Gradle 실행은 sandbox의 `~/.gradle` lock 파일 접근 제한으로 실패했으며, 사용자 승인 후 동일 명령을 재실행했다. --- @@ -576,3 +608,32 @@ - 리소스/컴파일/린트: `./gradlew :app:mergeDebugResources`, `./gradlew :app:compileDebugKotlin`, `./gradlew :app:ktlintCheck` PASS. - 공백 검증: `git diff --check` PASS. - 참고: Gradle 실행 중 기존 `WeekCalendarAdapter.kt` Kotlin annotation target 경고, 기존 테스트 deprecation 경고, 기존 `.editorconfig`의 `disabled_rules` deprecation 경고가 출력됐으나 이번 Phase 4 변경 파일의 실패는 없었다. + +- 2026-06-22 Phase 5 검증: + - RED: `CreatorChannelPagerAdapterTest`는 production 연결 전 Community가 placeholder라 `CreatorChannelPagerAdapterTest.kt:31` assertion으로 실패했고, `CreatorChannelActivitySourceTest > Community tab source는 Fragment Host pagination owner CTA를 Activity에 연결한다`는 production 연결 전 `CreatorChannelActivitySourceTest.kt:455` assertion으로 실패함을 확인했다. + - Production: `CreatorChannelPagerAdapter`에서 `CreatorChannelTab.Community`를 `CreatorChannelCommunityFragment.newInstance(creatorId)`로 연결했다. `CreatorChannelActivity`에는 `CreatorChannelCommunityFragment.Host`, `findCommunityFragment()`, 탭 선택/header 변경 최초 로드, nested scroll pagination, content changed 높이 갱신/추가 load-more 재평가, Community owner CTA icon/text/click/padding callback 연결을 추가했다. + - GREEN: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelPagerAdapterTest"` PASS, `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelActivitySourceTest.Community tab source는 Fragment Host pagination owner CTA를 Activity에 연결한다"` PASS. + - 회귀: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*Community*"` PASS, `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*"` PASS. 기존 `tab source는 기존 custom tab no op 정책을 제거한다`의 Community 부재 assertion은 Phase 5 목표와 충돌해 제거했다. + - 리소스/컴파일/린트: `./gradlew :app:mergeDebugResources`, `./gradlew :app:compileDebugKotlin`, `./gradlew :app:ktlintCheck`, `git diff --check` PASS. `ktlintCheck`는 신규 source test의 긴 assertion formatting-only 수정 후 PASS했다. + - 참고: 초반 병렬 Gradle 실행으로 `app/build/kspCaches/debugUnitTest` KSP cache corruption과 Kotlin daemon 충돌이 발생했다. 생성 캐시 `app/build/kspCaches/debugUnitTest`를 제거하고 `./gradlew --stop` 후 순차 재실행해 동일 테스트가 PASS함을 확인했다. + +- 2026-06-22 Phase 5 reviewer gate 수정 및 재검증: + - 초기 결과: reviewer gate가 `CreatorChannelActivity.onCreatorChannelCommunityOwnerMoreClicked(item)`의 `onClickPin`/`onClickModify`/`onClickDelete` no-op 콜백을 차단 이슈로 FAIL했다. 이는 기존 `CreatorCommunityPostMenuBottomSheetDialog` 수정/삭제/고정/고정 해제 정책을 따른다는 Phase 1.3/Phase 5 요구사항과 충돌하는 것으로 확인했다. + - RED: `CreatorChannelActivitySourceTest`에 owner more callback no-op 방지 검증을 추가했고, production 보정 전 `CreatorChannelActivitySourceTest.kt:473` assertion으로 실패함을 확인했다. + - 수정 기록: `CreatorChannelActivity`에 기존 `CreatorCommunityAllViewModel`을 주입해 `updateCommunityPostFixed(item.postId, !item.isPinned)`, `CreatorCommunityModifyActivity` 결과 launcher, delete 확인 `SodaDialog`와 `deleteCommunityPostList(postId = item.postId)`를 연결했다. write/modify/pin/delete 성공 후 현재 Community Fragment가 `onCreatorChannelCommunityRefreshRequested()`로 첫 페이지를 재조회하도록 `CreatorChannelCommunityFragment`/`CreatorChannelCommunityViewModel` refresh entry를 추가했다. + - 후속 reviewer 결과: pin/delete 성공 후 refresh가 기존 `CreatorCommunityAllViewModel.communityPostListLiveData` emit에 의존하면 빈 목록 성공 시 최신 화면 갱신이 누락될 수 있다는 차단 이슈를 확인했다. 또한 레거시 코드는 수정하지 않는다는 작업 원칙에 따라 `CreatorCommunityAllViewModel` 변경을 제거했다. + - 최종 수정 기록: `CreatorChannelActivity`에서 기존 레거시 ViewModel을 수정/주입하지 않고 `CreatorCommunityRepository`를 직접 호출해 고정/고정 해제와 삭제 요청을 수행한다. 성공 응답에서는 즉시 `findCommunityFragment()?.onCreatorChannelCommunityRefreshRequested()`를 호출해 마지막 게시글 삭제처럼 빈 목록이 되는 경우에도 Community 탭이 자체 first page refresh를 수행하도록 보정했다. 수정 진입은 기존 `CreatorCommunityModifyActivity`를 호출만 하며, 결과 성공 시 동일 refresh entry를 호출한다. + - GREEN: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelActivitySourceTest.Community tab source는 Fragment Host pagination owner CTA를 Activity에 연결한다"` PASS. + - 회귀: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*Community*"` PASS, `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*"` PASS. + - 리소스/컴파일/whitespace: `./gradlew :app:mergeDebugResources` PASS, `./gradlew :app:compileDebugKotlin` PASS, `git diff --check` PASS. + - 린트 참고: `./gradlew :app:ktlintCheck`는 현재 diff가 없는 레거시 `CreatorCommunityAllViewModel.kt`의 기존 package underscore/indentation 위반으로 FAIL했다. 사용자 지침에 따라 레거시 파일은 수정하지 않았고, `GIT_MASTER=1 git diff -- app/src/main/java/kr/co/vividnext/sodalive/explorer/profile/creator_community/all/CreatorCommunityAllViewModel.kt` 결과 변경 없음으로 확인했다. + - 최종 reviewer gate: Phase 5 변경, owner more callback, pin/delete 성공 refresh, 레거시 `CreatorCommunityAllViewModel.kt` 미수정 상태, 레거시 ktlint 실패 범위 문서화를 재검토했고 PASS를 확인했다. + +- 2026-06-22 Phase 5 후속 no-op Host API 제거 및 최종 검증: + - 코드 리뷰: `CreatorChannelCommunityFragment.Host`에 실제 호출 경로가 item 기반으로 전환된 뒤에도 `postId` fallback API가 남아 있고, `CreatorChannelActivity`가 이를 no-op으로 구현하는 불필요한 확장 지점을 확인했다. owner more는 `CreatorChannelCommunityPostUiModel`의 `isPinned` 등 item 상태가 필요하므로 item 기반 콜백 하나로 단일화하는 것이 Phase 5 요구사항에 더 맞다고 판단했다. + - RED: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelActivitySourceTest.Community tab source는 Fragment Host pagination owner CTA를 Activity에 연결한다"`는 production 보정 전 `CreatorChannelActivitySourceTest.kt:481` assertion으로 실패함을 확인했다. + - 수정 기록: `CreatorChannelCommunityFragment.Host`의 `onCreatorChannelCommunityOwnerMoreClicked(postId: Long)` fallback API와 `CreatorChannelActivity`의 no-op override를 제거했고, source test에 no-op/fallback 부재 검증을 추가했다. + - GREEN: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelActivitySourceTest.Community tab source는 Fragment Host pagination owner CTA를 Activity에 연결한다"` PASS. + - 회귀: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*Community*"`, `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.*"`, `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.community.*"` PASS. + - 리소스/컴파일/린트/공백: `./gradlew :app:mergeDebugResources`, `./gradlew :app:compileDebugKotlin`, `./gradlew :app:ktlintCheck`, `git diff --check` PASS. + - 참고: 첫 Gradle 실행은 sandbox의 `~/.gradle` lock 파일 접근 제한으로 실패했고, 사용자 승인 후 같은 테스트를 재실행해 RED/GREEN을 확인했다. 이번 최종 `ktlintCheck`는 PASS했으며 `.editorconfig disabled_rules` deprecation 경고만 출력됐다.