diff --git a/docs/20260625_메인_홈_팔로잉_탭/plan-task.md b/docs/20260625_메인_홈_팔로잉_탭/plan-task.md index f61c9430..d3fe637a 100644 --- a/docs/20260625_메인_홈_팔로잉_탭/plan-task.md +++ b/docs/20260625_메인_홈_팔로잉_탭/plan-task.md @@ -780,7 +780,59 @@ --- +### Phase 12: 전체 empty 문구 중앙 표시 + +- [x] **Task 12.1: 문서와 source test로 empty 문구 계약 고정** + - 수정: + - `docs/20260625_메인_홈_팔로잉_탭/prd.md` + - `docs/20260625_메인_홈_팔로잉_탭/plan-task.md` + - `app/src/test/java/kr/co/vividnext/sodalive/v2/main/home/HomeFollowingFragmentSourceTest.kt` + - 작업: + - 기존 `screen_home_following_empty` string resource를 재사용한다는 계약을 문서화한다. + - `fragment_v2_main_home.xml`에 `tv_home_following_empty`가 있고 `@string/screen_home_following_empty`를 사용하는지 source test로 고정한다. + - empty `TextView`가 팔로잉 탭 전체 영역에서 가운데 배치되고 텍스트도 가운데 정렬되는지 source test로 고정한다. + - `HomeFollowingUiState.Empty`는 empty 문구를 표시하고, `Content`, `LoginRequired`, `Error`는 숨김 경로를 갖는지 source test로 고정한다. + - 검증: + - Run: `./gradlew --no-daemon :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.home.HomeFollowingFragmentSourceTest"` + - Expected RED: 구현 전 `tv_home_following_empty`와 empty visibility 분기 부재로 실패한다. + - 검증 기록: + - 2026-07-13: 기존 `screen_home_following_empty` string resource를 재사용해 전체 empty 문구를 표시하는 요구사항을 PRD와 계획 문서에 추가했다. `HomeFollowingFragmentSourceTest`에 `tv_home_following_empty` id, string 재사용, 중앙 정렬 속성, `HomeFollowingUiState.Empty` 전용 표시 분기를 고정하는 source test를 추가했다. + +- [x] **Task 12.2: 다국어 string과 empty UI 구현** + - 수정: + - `app/src/main/res/values/strings.xml` + - `app/src/main/res/values-en/strings.xml` + - `app/src/main/res/values-ja/strings.xml` + - `app/src/main/res/layout/fragment_v2_main_home.xml` + - `app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/HomeMainFragment.kt` + - 작업: + - 기존 `screen_home_following_empty` 값을 한국어/영어/일본어 문구로 갱신한다. + - 팔로잉 탭 content 영역에 `tv_home_following_empty`를 추가하고 중앙 배치/중앙 정렬한다. + - `HomeFollowingUiState.Empty`에서 empty 문구를 표시하고 섹션 adapter는 비운다. + - `HomeFollowingUiState.Content`, `LoginRequired`, `Error`에서는 empty 문구를 숨긴다. + - 검증: + - Run: `./gradlew --no-daemon :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.home.HomeFollowingFragmentSourceTest"` + - Expected GREEN: source test PASS. + - 검증 기록: + - 2026-07-13: `values`, `values-en`, `values-ja`의 기존 `screen_home_following_empty` 값을 한국어/영어/일본어 2줄 문구로 갱신했다. `fragment_v2_main_home.xml`에 `tv_home_following_empty`를 추가하고 `@string/screen_home_following_empty`, `match_parent`, `gravity=center`, `textAlignment=center`, 기본 `gone`을 적용했다. `HomeMainFragment`에서는 `HomeFollowingUiState.Empty`만 empty 문구를 표시하고, `Content`, `LoginRequired`, `Error`는 숨기도록 분기했다. + +- [x] **Task 12.3: empty 문구 회귀 검증 기록** + - 검증: + - Run: `./gradlew --no-daemon :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.home.*Following*"` + - Expected: 팔로잉 관련 local unit/source test PASS. + - Run: `./gradlew --no-daemon :app:mergeDebugResources` + - Expected: string/layout resource merge PASS. + - Run: `./gradlew --no-daemon :app:compileDebugKotlin` + - Expected: Kotlin compile PASS. + - Run: `git diff --check` + - Expected: whitespace error 없음. + - 검증 기록: + - 2026-07-13: `./gradlew --no-daemon :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.home.*Following*"`, `./gradlew --no-daemon :app:mergeDebugResources`, `./gradlew --no-daemon :app:compileDebugKotlin`, `git diff --check` 모두 PASS. Gradle 실행 중 기존 deprecation warning만 출력됐다. + +--- + ## Verification Log +- 2026-07-13 Phase 12 전체 empty 문구 중앙 표시 검증: 팔로잉 탭 전체 empty 상태에서 기존 `screen_home_following_empty` 리소스를 재사용해 `아직 팔로잉 소식이 없어요.\n관심 있는 크리에이터를 팔로우해 보세요.` 문구를 중앙 표시하도록 구현했다. 영어는 `No following updates yet.\nFollow creators you are interested in.`, 일본어는 `フォロー中のお知らせはまだありません。\n気になるクリエイターをフォローしてみましょう。`로 갱신했다. `HomeFollowingUiState.Empty`에서만 empty 문구가 보이고 `Content`, `LoginRequired`, `Error`에서는 숨김 처리된다. 검증으로 `./gradlew --no-daemon :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.home.*Following*"`, `./gradlew --no-daemon :app:mergeDebugResources`, `./gradlew --no-daemon :app:compileDebugKotlin`, `git diff --check` 모두 PASS. Gradle 실행 중 기존 deprecation warning만 출력됐다. - 2026-07-12 Phase 11 검증: 최근 소식 `COMMUNITY_POST` 상세 이동 계약을 source test로 추가하고 `HomeMainFragment.onFollowingNewsClick()`에서 `HomeFollowingNewsUiItem.Community`만 `CreatorChannelCommunityDetailActivity.newIntent(requireContext(), postId)`로 이동하도록 구현했다. RED 시도: 구현 전 targeted test `./gradlew --no-daemon :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentLoginGuardSourceTest"`는 120초/300초 timeout으로 assertion 결과까지 도달하지 못했지만, 당시 production은 no-op 상태였고 새 source test는 `ensureMainV2NavigationAllowed`와 상세 이동 호출 문자열을 요구하도록 추가되어 실패 조건을 고정했다. GREEN: 동일 targeted test PASS. 회귀 검증 `./gradlew --no-daemon :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.home.*Following*"`, `./gradlew --no-daemon :app:compileDebugKotlin`, `git diff --check` PASS. `./gradlew --no-daemon :app:ktlintCheck`는 이번 변경과 무관한 기존 legacy/source 위반(`explorer/profile/creator_community` package underscore, `LiveRoomActivity.kt` formatting, `NicknameUpdateViewModel.kt` indentation 등)으로 FAIL. 실기기 수동 QA는 `adb devices` 결과 연결된 device가 없어 blocked. - 2026-06-25 Phase 1-3 구현 검증: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.home.*Following*"`, `./gradlew :app:mergeDebugResources`, `./gradlew :app:compileDebugKotlin`, `./gradlew :app:ktlintCheck`, `git diff --check` 모두 PASS. - 2026-06-25 Phase 1-3 코드 리뷰 및 재검증: blocking finding 없음. `./gradlew :app:mergeDebugResources`는 최초 sandbox lock 권한 오류 후 승인 실행으로 PASS했고, 나머지 검증 명령도 PASS. diff --git a/docs/20260625_메인_홈_팔로잉_탭/prd.md b/docs/20260625_메인_홈_팔로잉_탭/prd.md index ac048b41..230ccfc6 100644 --- a/docs/20260625_메인_홈_팔로잉_탭/prd.md +++ b/docs/20260625_메인_홈_팔로잉_탭/prd.md @@ -287,6 +287,17 @@ Figma `24:5682` 기준 상단 title bar와 tab bar는 기존 홈 화면 구조 - `COMMUNITY_POST`가 아닌 최근 소식 item은 이번 작업 범위에서 기존처럼 이동하지 않는다. - legacy `CreatorCommunityAllActivity`나 `Constants.EXTRA_COMMUNITY_POST_ID` 직접 extra 조립 경로는 사용하지 않는다. +#### 2026-07-13 전체 empty 문구 Requirements +- `isLoginRequired = false`이고 `followingCreators`, `onAirLives`, `recentChats`, `monthlySchedules`, `recentNews`가 모두 비어 있는 `HomeFollowingUiState.Empty` 상태에서는 팔로잉 탭 본문 중앙에 empty 문구를 표시한다. +- empty 문구는 기존 `screen_home_following_empty` string resource를 재사용해 수정한다. +- 한국어 기본 문구는 `아직 팔로잉 소식이 없어요.\n관심 있는 크리에이터를 팔로우해 보세요.`로 표시한다. +- 영어 문구는 `No following updates yet.\nFollow creators you are interested in.`로 표시한다. +- 일본어 문구는 `フォロー中のお知らせはまだありません。\n気になるクリエイターをフォローしてみましょう。`로 표시한다. +- empty 문구 `TextView`는 팔로잉 탭 content 영역 전체의 가운데에 배치하고, 텍스트도 가운데 정렬한다. +- `HomeFollowingUiState.Content`에서는 empty 문구를 숨기고 기존 섹션별 visibility 정책을 유지한다. +- `HomeFollowingUiState.LoginRequired`와 `Error`는 이번 범위에서 empty 문구를 표시하지 않고 기존처럼 섹션을 숨긴다. +- API/DTO/mapper 계약과 팔로잉 크리에이터 `전체` 버튼 노출 정책은 변경하지 않는다. + #### 2026-06-30 후속 수정 Requirements - `CREATOR_RANKING` 최근 소식 본문은 순위 숫자만 단독 표시하지 않고, Figma `24:5717` 기준으로 크리에이터 이름과 순위를 포함한 문장형 메시지를 표시한다. - ranking 문장 안의 순위 텍스트는 기존 `FeedRankTextStyler` highlight range로 강조한다.