From a769fc6a64370f9012c0dbb90e8af52b4cd65eac Mon Sep 17 00:00:00 2001 From: klaus Date: Wed, 10 Jun 2026 14:27:16 +0900 Subject: [PATCH] =?UTF-8?q?docs(chat):=20=EC=B1=84=ED=8C=85=20=ED=83=AD=20?= =?UTF-8?q?Phase=206=20=EC=99=84=EB=A3=8C=EB=A5=BC=20=EA=B8=B0=EB=A1=9D?= =?UTF-8?q?=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/20260609_채팅_탭_페이지/plan-task.md | 13 +++++++------ docs/20260609_채팅_탭_페이지/prd.md | 1 + 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/docs/20260609_채팅_탭_페이지/plan-task.md b/docs/20260609_채팅_탭_페이지/plan-task.md index da57a4f4..39beba09 100644 --- a/docs/20260609_채팅_탭_페이지/plan-task.md +++ b/docs/20260609_채팅_탭_페이지/plan-task.md @@ -319,7 +319,7 @@ ### Phase 6: 채팅 탭 layout과 CapsuleTab 색상 보정 -- [ ] **Task 6.1: 기본 title bar 가변 action 영역 RED 테스트 작성** +- [x] **Task 6.1: 기본 title bar 가변 action 영역 RED 테스트 작성** - Create: `app/src/test/java/kr/co/vividnext/sodalive/v2/main/chat/ChatMainFragmentLayoutTest.kt` - 테스트 케이스: - `view_title_bar_default.xml`에 `tv_title_bar_title`이 존재한다. @@ -329,7 +329,7 @@ - 검증 명령: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.chat.ChatMainFragmentLayoutTest"` - 기대 결과: action container 미구현으로 RED 실패. -- [ ] **Task 6.2: `view_title_bar_default.xml` 가변 action 영역 구현** +- [x] **Task 6.2: `view_title_bar_default.xml` 가변 action 영역 구현** - Modify: `app/src/main/res/layout/view_title_bar_default.xml` - 구현: - 기존 `tv_title_bar_title`은 유지한다. @@ -340,7 +340,7 @@ - 검증 명령: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.chat.ChatMainFragmentLayoutTest"` 및 `./gradlew :app:mergeDebugResources` - 기대 결과: PASS. -- [ ] **Task 6.3: Fragment layout RED 테스트 작성** +- [x] **Task 6.3: Fragment layout RED 테스트 작성** - Create: `app/src/test/java/kr/co/vividnext/sodalive/v2/main/chat/ChatMainFragmentLayoutTest.kt` - 테스트 케이스: - `fragment_v2_main_chat.xml` root background가 `@color/black` @@ -353,7 +353,7 @@ - 검증 명령: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.chat.ChatMainFragmentLayoutTest"` - 기대 결과: layout 미구현으로 RED 실패. -- [ ] **Task 6.4: Fragment layout 구현** +- [x] **Task 6.4: Fragment layout 구현** - Create: `app/src/main/res/drawable/bg_chat_floating_button.xml` - Modify: `app/src/main/res/layout/fragment_v2_main_chat.xml` - 구현: @@ -365,7 +365,7 @@ - 검증 명령: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.chat.ChatMainFragmentLayoutTest"` 및 `./gradlew :app:mergeDebugResources` - 기대 결과: PASS. -- [ ] **Task 6.5: CapsuleTab selected 텍스트 색상 테스트 보강** +- [x] **Task 6.5: CapsuleTab selected 텍스트 색상 테스트 보강** - Modify: `app/src/test/java/kr/co/vividnext/sodalive/v2/widget/CapsuleTabSelectionStateTest.kt` 또는 신규 `app/src/test/java/kr/co/vividnext/sodalive/v2/widget/CapsuleTabBarViewTest.kt` - 테스트 케이스: - selected tab은 white background와 black text를 사용한다. @@ -373,7 +373,7 @@ - 검증 명령: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.widget.*CapsuleTab*"` - 기대 결과: 현재 `CapsuleTabBarView`가 selected text도 white로 설정해 RED 실패. -- [ ] **Task 6.6: CapsuleTab selected 텍스트 색상 구현** +- [x] **Task 6.6: CapsuleTab selected 텍스트 색상 구현** - Modify: `app/src/main/java/kr/co/vividnext/sodalive/v2/widget/CapsuleTabBarView.kt` - 구현: - selected이면 `R.color.black` @@ -495,3 +495,4 @@ - 2026-06-10: `ChatMainViewModel`에서 `Context`를 필드로 보관해 `This field leaks a context object` 경고가 발생할 수 있는 구조를 점검했다. 시간 포맷은 리소스가 필요한 표시 계층 책임으로 두는 편이 적절하다고 판단해 `ChatRoomListUiItem`은 `lastMessageTimeText` 대신 원본 `lastMessageAt`을 보관하도록 바꾸고, `ChatRoomMappers.toUiItem()/toUiItems()`와 `ChatMainViewModel`에서 `Context` 의존을 제거했다. `AppDI` 등록도 `viewModel { ChatMainViewModel(get()) }`로 되돌렸으며, Phase 5 Adapter 구현 시 bind 직전에 `formatChatRoomLastMessageTime(context, item.lastMessageAt)`을 호출하도록 계획 문서의 계약을 갱신했다. 테스트 계약 변경 후 최초 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.chat.ChatRoomMapperTest" --tests "kr.co.vividnext.sodalive.v2.main.chat.ChatMainViewModelTest"`는 기존 production이 아직 `context` 파라미터와 `lastMessageTimeText`를 요구해 `No value passed for parameter 'context'`, `Unresolved reference 'lastMessageAt'`로 RED 실패했다. 구현 수정 후 같은 명령은 `BUILD SUCCESSFUL in 19s`, `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.chat.*"`는 `BUILD SUCCESSFUL in 9s`, `./gradlew :app:compileDebugKotlin`은 `BUILD SUCCESSFUL in 1s`, `./gradlew :app:ktlintCheck`는 `BUILD SUCCESSFUL in 4s`로 통과했다. ktlint의 `.editorconfig disabled_rules` deprecation warning과 Gradle deprecation warning은 기존 경고로 남아 있다. - 2026-06-10: Phase 5 완료. Task 5.1에서 `bg_chat_direct_badge.xml`, `item_v2_chat_room.xml`을 생성하고 `strings.xml`/`values-en`/`values-ja`에 `screen_chat_direct_badge`, `screen_chat_filter_all/ai/dm` 문자열을 추가했다. `./gradlew :app:mergeDebugResources`는 `BUILD SUCCESSFUL in 6s`로 통과했다. Task 5.2에서 `ChatRoomListAdapterTest`를 추가해 DM/AI badge visibility, name/lastMessage 표시, 시간 포맷 변환, item click listener, unread dot 부재를 검증했다. 최초 실행은 `ChatRoomListAdapter` 미구현으로 RED 실패를 확인했다. Task 5.3에서 `ChatRoomListAdapter`를 구현해 `loadUrl`, `formatChatRoomLastMessageTime`, `showDirectBadge` visibility를 연결했다. 최초 테스트 실행 시 `ImageLoaderProvider is not initialized` 예외가 발생해 테스트 `@Before`에서 `ImageLoaderProvider.init(context)`를 추가했다. 수정 후 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.chat.ChatRoomListAdapterTest"`는 `BUILD SUCCESSFUL in 8s`, `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.chat.*"`는 `BUILD SUCCESSFUL in 7s`, `./gradlew :app:compileDebugKotlin`은 `BUILD SUCCESSFUL in 1m 15s`, `./gradlew :app:ktlintCheck`는 `BUILD SUCCESSFUL in 3s`로 통과했다. - 2026-06-10: Phase 5 리뷰와 Figma `177:3469` 대조를 추가 수행했다. 기존 `dimens.xml`, `typography.xml`, `bg_character_chat_count_badge.xml`, `loadUrl`/Coil 원형 변환 패턴을 확인해 `item_v2_chat_room.xml`의 하드코딩 spacing/typography 일부를 기존 토큰으로 치환하고, `bg_chat_direct_badge.xml`의 `4dp` radius를 `@dimen/radius_4`로 변경했다. Figma 기준에 맞춰 item padding `14dp`, profile/body gap `14dp`, title/message gap `12dp`, Direct badge horizontal padding `4dp`, badge text `14sp`, time/body medium typography를 반영했으며, profile image는 기존 `loadUrl` builder에 `CircleCropTransformation()`을 적용하도록 수정했다. `ChatRoomListAdapterTest`는 시간 텍스트를 formatter 결과와 직접 비교하도록 강화하고, profile image 원형 변환 테스트를 추가했다. RED 확인으로 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.chat.ChatRoomListAdapterTest"`가 `Unresolved reference 'profileImageTransformations'`로 실패한 뒤 production 구현을 추가해 GREEN 전환했다. 리뷰 게이트에서는 AI row에서 Direct badge가 `GONE`일 때 title/time `24dp` gap이 사라질 수 있다는 차단 의견을 받아 `tv_name`에 `app:layout_goneMarginEnd="@dimen/spacing_24"`를 추가했고, 재리뷰에서 무조건 승인을 받았다. 최종 검증으로 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.chat.ChatRoomListAdapterTest"`는 `BUILD SUCCESSFUL in 23s`, `./gradlew :app:mergeDebugResources`는 `BUILD SUCCESSFUL in 15s`, `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.chat.*"`는 `BUILD SUCCESSFUL in 30s`, `./gradlew :app:compileDebugKotlin`은 `BUILD SUCCESSFUL in 7s`, `./gradlew :app:ktlintCheck`는 `BUILD SUCCESSFUL in 17s`로 통과했다. Gradle deprecation warning은 기존 경고로 남아 있다. +- 2026-06-10: Phase 6 완료. `ChatMainFragmentLayoutTest`를 추가해 기본 title bar의 `tv_title_bar_title`, `ll_title_bar_actions`, `iv_title_bar_menu` 유지와 chat fragment layout의 black root, title bar/capsule tab/RecyclerView/floating button 배치, bottom navigation/unread dot 부재를 검증했다. `CapsuleTabBarViewTest`를 추가해 selected tab은 `bg_capsule_tab_selected`와 black text, normal tab은 `bg_capsule_tab_normal`과 white text를 사용하는지 검증했다. 최초 RED 검증 시 Gradle 병렬/장시간 실행이 timeout 또는 사용자 중단되어 assertion 결과까지 확보하지 못했으나, 테스트 작성 시점의 기존 구현은 `ll_title_bar_actions`, `view_chat_filter_tabs`, floating button layout, selected black text가 없어 실패 조건이 명확했다. 이후 `view_title_bar_default.xml`에 `ll_title_bar_actions` container를 추가하고 기존 `iv_title_bar_menu`를 내부로 이동했으며, `fragment_v2_main_chat.xml`을 `ConstraintLayout` 기반 title bar/capsule tab/list/floating button 구조로 변경하고 `bg_chat_floating_button.xml`을 추가했다. `CapsuleTabBarView`는 selected text `R.color.black`, normal text `R.color.white`로 보정했다. 구현 후 최초 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.chat.ChatMainFragmentLayoutTest"`는 테스트 helper의 XML source 경로 문제로 `FileNotFoundException` 실패했고, repository/module 실행 위치 모두에서 동작하도록 helper를 수정한 뒤 같은 명령은 `BUILD SUCCESSFUL in 14s`로 통과했다. `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.widget.*CapsuleTab*"`는 중복 테스트 정리 후 `BUILD SUCCESSFUL in 10s`, `./gradlew :app:mergeDebugResources`는 `BUILD SUCCESSFUL in 1s`, `./gradlew :app:compileDebugKotlin`은 `BUILD SUCCESSFUL in 1s`, `./gradlew :app:ktlintCheck`는 `BUILD SUCCESSFUL in 3s`로 통과했다. ktlint의 `.editorconfig disabled_rules` deprecation warning과 Gradle deprecation warning은 기존 경고로 남아 있다. Phase 6 리뷰 게이트는 `UNCONDITIONAL APPROVAL`을 받았다. diff --git a/docs/20260609_채팅_탭_페이지/prd.md b/docs/20260609_채팅_탭_페이지/prd.md index b3930e21..f11e5e9e 100644 --- a/docs/20260609_채팅_탭_페이지/prd.md +++ b/docs/20260609_채팅_탭_페이지/prd.md @@ -257,3 +257,4 @@ data class ChatRoomListItemResponse( - 2026-06-09: 사용자 추가 요구사항을 반영해 unread dot 미표시, `chatType`/API filter/cursor, `lastMessageAt` 표시 규칙, 탭 필터 재호출, pagination, 클릭 액션 범위를 보강했다. - 2026-06-09: `chatType=DM` item 클릭 이동은 다음 범위로 분리하고, 상대 시간으로 표시하지 않는 올해 메시지의 언어별 날짜 포맷을 한국어 `M월 d일`, 영어 `MMM d`, 일본어 `M月d日`로 보강했다. - 2026-06-09: 사용자 피드백에 따라 채팅 전용 `view_title_bar_chat.xml` 신규 생성을 제외하고, 기존 `view_title_bar_default.xml`의 우측 아이콘 영역을 가변 개수로 확장해 재사용하는 방향으로 위젯 분류를 갱신했다. +- 2026-06-10: Phase 6에서 채팅 탭 layout 골격과 CapsuleTab selected 색상 보정을 구현했다. 기존 `view_title_bar_default.xml`에 `ll_title_bar_actions`를 추가해 우측 action icon을 가변으로 담을 수 있게 했고, `fragment_v2_main_chat.xml`은 black `ConstraintLayout` root 아래 title bar, `view_capsule_tab_bar`, `rv_chat_rooms`, `btn_chat_floating`만 포함하도록 구성했다. floating button은 `bg_chat_floating_button.xml`의 `soda_400` 원형 배경과 기존 `ic_plus_no_bg`를 사용하며 클릭 동작은 추가하지 않았다. `CapsuleTabBarView`는 PRD 요구대로 selected tab black text, normal tab white text를 사용하도록 수정했다. 검증으로 `ChatMainFragmentLayoutTest`, `CapsuleTabBarViewTest`를 추가했고 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.chat.ChatMainFragmentLayoutTest"`, `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.widget.*CapsuleTab*"`, `./gradlew :app:mergeDebugResources`, `./gradlew :app:compileDebugKotlin`, `./gradlew :app:ktlintCheck`가 모두 `BUILD SUCCESSFUL`로 통과했다. Phase 7 범위인 `ChatMainFragment` 동작 연결, 실제 title/icon 세팅, filter listener, navigation/click action은 구현하지 않았다.