refactor(modal): V2 확인 모달 사용처를 교체한다

This commit is contained in:
2026-07-08 16:04:01 +09:00
parent 8e086c4888
commit 809ed5ce23
9 changed files with 281 additions and 39 deletions

View File

@@ -135,6 +135,142 @@
---
### Phase 4: V2 사용처 `dialog_v2_modal` 적용 대상 조사
- [x] **Task 4.1: `kr.co.vividnext.sodalive.v2` 하위 dialog/modal 사용처 검색**
- 확인:
- `app/src/main/java/kr/co/vividnext/sodalive/v2`
- `app/src/test/java/kr/co/vividnext/sodalive/v2`
- 검색 키워드:
- `SodaDialog`
- `AlertDialog.Builder`
- `V2ModalDialog`
- `DialogFragment`
- `BottomSheetDialogFragment`
- `PopupWindow`
- `LivePaymentDialog`
- `LiveRoomPasswordDialog`
- `LiveCancelDialog`
- `LiveRoomDonationDialog`
- `UserReportDialog`
- `ProfileReportDialog`
- `CheersReportDialog`
- `NotificationSettingsDialog`
- `EventPopupDialogFragment`
- 검증 명령:
- `rg -n "SodaDialog|V2ModalDialog|AlertDialog\\.Builder|AlertDialog" app/src/main/java/kr/co/vividnext/sodalive/v2 app/src/test/java/kr/co/vividnext/sodalive/v2`
- `rg -n "SodaDialog\\(|AlertDialog\\.Builder\\(|UserReportDialog\\(|ProfileReportDialog\\(|CheersReportDialog\\(|LivePaymentDialog\\(|LiveRoomPasswordDialog\\(|LiveCancelDialog\\(|LiveRoomDonationDialog\\(|NotificationSettingsDialog\\(|EventPopupDialogFragment\\(|BottomSheetDialogFragment|PopupWindow" app/src/main/java/kr/co/vividnext/sodalive/v2`
- 기대 결과:
-`V2ModalDialog`로 직접 바꿀 수 있는 확인형 모달과 별도 설계가 필요한 커스텀 다이얼로그를 구분한다.
- 검증 기록:
- 2026-07-08 실행 결과, 직접 교체 후보는 `SodaDialog` 6곳, `AlertDialog.Builder` 1곳, `ProfileReportDialog` 1곳으로 분류했다.
- 입력/라디오/이미지/토글/BottomSheet/PopupWindow 기반 사용처는 현 `V2ModalDialog` API로 직접 표현하기 어려워 별도 설계 후보로 분류했다.
- [x] **Task 4.2: 교체 후보와 테스트 영향 문서화**
- 수정:
- `docs/20260708_V2_공통_모달창/prd.md`
- `docs/20260708_V2_공통_모달창/plan-task.md`
- 바로 교체 가능한 후보:
- `app/src/main/java/kr/co/vividnext/sodalive/v2/main/MainV2LoginGuard.kt:49`
- `app/src/main/java/kr/co/vividnext/sodalive/v2/live/onair/HomeOnAirLiveActivity.kt:186`
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivity.kt:386`
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivity.kt:403`
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivity.kt:607`
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivity.kt:643`
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivity.kt:980`
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/fantalk/write/CreatorChannelFanTalkWriteActivity.kt:124`
- 테스트 영향:
- `app/src/test/java/kr/co/vividnext/sodalive/v2/main/MainV2LoginGuardSourceTest.kt:20`
- `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivitySourceTest.kt:602`
- `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivitySourceTest.kt:1374`
- 검증 명령:
- `rg -n "SodaDialog\\(|AlertDialog\\.Builder\\(|ProfileReportDialog\\(" app/src/main/java/kr/co/vividnext/sodalive/v2 app/src/test/java/kr/co/vividnext/sodalive/v2`
- 기대 결과:
- 후속 구현자가 교체 파일, 테스트 파일, 제외/보류 대상을 문서만으로 파악할 수 있다.
- 검증 기록:
- 2026-07-08 문서 작성 단계에서는 구현 변경이 없으므로 Gradle 검증을 실행하지 않았다.
---
### Phase 5: 확인형 모달 `V2ModalDialog` 교체 구현
- [x] **Task 5.1: `SodaDialog`, `AlertDialog.Builder`, `ProfileReportDialog` 직접 교체 후보를 `V2ModalDialog`로 변경**
- 수정:
- `app/src/main/java/kr/co/vividnext/sodalive/v2/main/MainV2LoginGuard.kt`
- `app/src/main/java/kr/co/vividnext/sodalive/v2/live/onair/HomeOnAirLiveActivity.kt`
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivity.kt`
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/fantalk/write/CreatorChannelFanTalkWriteActivity.kt`
- 작업:
- `kr.co.vividnext.sodalive.v2.components.modal.V2ModalDialog`를 import한다.
- 확인/취소형 모달의 title, desc, confirm/cancel title, confirm/cancel action을 기존 동작과 동일하게 매핑한다.
- `descGravity = Gravity.CENTER`는 현 `dialog_v2_modal` desc가 중앙 정렬이므로 제거한다.
- 교체 후 미사용 `SodaDialog`, `AlertDialog`, `Gravity`, `ProfileReportDialog` import를 제거한다.
- 레거시 다이얼로그 클래스와 레거시 layout은 수정하지 않는다.
- 검증 명령:
- `./gradlew :app:compileDebugKotlin`
- `git diff --check`
- 기대 결과:
- 직접 교체 후보가 `dialog_v2_modal` 기반으로 표시되고 컴파일 오류가 없다.
- 검증 기록:
- 2026-07-08 `MainV2LoginGuard.kt`, `HomeOnAirLiveActivity.kt`, `CreatorChannelActivity.kt`, `CreatorChannelFanTalkWriteActivity.kt`의 직접 교체 후보를 `V2ModalDialog`로 변경했다. `descGravity = Gravity.CENTER``dialog_v2_modal`의 desc 중앙 정렬 계약으로 대체되어 제거했고, 기존 title/desc/button string과 confirm/cancel callback은 유지했다.
- 2026-07-08 `rg -n "SodaDialog\(|AlertDialog\.Builder\(|ProfileReportDialog\(|descGravity|import android.view.Gravity|import kr.co.vividnext.sodalive.base.SodaDialog|import androidx.appcompat.app.AlertDialog|import kr.co.vividnext.sodalive.report.ProfileReportDialog" ...` 확인 결과, 생산 코드의 직접 교체 대상 레거시 생성자/import는 남지 않았다. 검색에 남은 `showProfileReportDialog`는 V2 모달을 여는 메서드명이다.
- [x] **Task 5.2: source 테스트 기대값 갱신**
- 수정:
- `app/src/test/java/kr/co/vividnext/sodalive/v2/main/MainV2LoginGuardSourceTest.kt`
- `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivitySourceTest.kt`
- 작업:
- `SodaDialog(` 문자열 기대를 `V2ModalDialog(` 또는 더 구체적인 V2 모달 import/호출 계약으로 바꾼다.
- `CreatorChannelActivity`의 사용자 차단/프로필 신고/삭제/성인 인증 확인 흐름이 기존 callback을 유지하는지 source 계약으로 확인한다.
- 검증 명령:
- `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.MainV2LoginGuardSourceTest"`
- `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelActivitySourceTest"`
- 기대 결과:
- 갱신된 source 테스트가 PASS한다.
- 검증 기록:
- 2026-07-08 `MainV2LoginGuardSourceTest`, `CreatorChannelActivitySourceTest`, `CreatorChannelFanTalkWriteSourceTest`의 source 계약을 `V2ModalDialog(` 기대와 레거시 `SodaDialog(`/`AlertDialog.Builder(`/`ProfileReportDialog(this, layoutInflater)` 금지 조건으로 갱신했다.
- 2026-07-08 테스트 변경 직후 병렬 Gradle 실행은 Kotlin incremental cache 경합으로 test assertion 전에 실패했다. 이후 `--no-parallel --no-daemon -Pkotlin.incremental=false`로 직렬 실행해 `MainV2LoginGuardSourceTest`, `CreatorChannelActivitySourceTest`, `CreatorChannelFanTalkWriteSourceTest`가 PASS함을 확인했다.
- [x] **Task 5.3: 직접 교체 범위 회귀 검증**
- 실행:
- `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.components.modal.*"`
- `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.MainV2LoginGuardSourceTest"`
- `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelActivitySourceTest"`
- `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.fantalk.write.CreatorChannelFanTalkWriteSourceTest"`
- `./gradlew :app:compileDebugKotlin`
- `git diff --check`
- 기대 결과:
- 직접 교체 범위 테스트와 컴파일이 PASS한다.
- 검증 기록:
- 2026-07-08 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.components.modal.*" --no-parallel --no-daemon -Pkotlin.incremental=false` PASS.
- 2026-07-08 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.MainV2LoginGuardSourceTest" --no-parallel --no-daemon -Pkotlin.incremental=false` PASS.
- 2026-07-08 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelActivitySourceTest" --no-parallel --no-daemon -Pkotlin.incremental=false` PASS.
- 2026-07-08 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.fantalk.write.CreatorChannelFanTalkWriteSourceTest" --no-parallel --no-daemon -Pkotlin.incremental=false` PASS.
- 2026-07-08 `./gradlew :app:compileDebugKotlin --no-parallel --no-daemon -Pkotlin.incremental=false` PASS.
- 2026-07-08 `git diff --check` PASS.
---
### Phase 6: 커스텀 콘텐츠 다이얼로그 후속 설계
- [ ] **Task 6.1: 현 `V2ModalDialog`로 직접 표현할 수 없는 사용처 처리 방침 결정**
- 확인 대상:
- `app/src/main/java/kr/co/vividnext/sodalive/v2/main/MainV2Activity.kt`
- `app/src/main/java/kr/co/vividnext/sodalive/v2/live/onair/HomeOnAirLiveActivity.kt`
- `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`
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/fantalk/CreatorChannelFanTalkFragment.kt`
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelMoreBottomSheet.kt`
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/ui/CreatorChannelSortPopup.kt`
- `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/fantalk/ui/CreatorChannelFanTalkMorePopup.kt`
- 결정 필요:
- report 라디오 목록, password/reason 입력, payment 시간 안내, donation BottomSheet, notification toggle, event image popup을 `dialog_v2_modal` 기반으로 새로 설계할지 여부
- BottomSheet/PopupWindow 메뉴를 모달 교체 범위에서 제외할지 여부
- 검증 기준:
- 결정 결과를 이 문서의 Phase 6 아래에 추가하고, 구현 전 PRD를 먼저 갱신한다.
---
## Verification Log
- 2026-07-08 문서 작성 단계: 구현 전이므로 Gradle 검증을 실행하지 않았다. Figma `567:17662`, `567:17666` 디자인 컨텍스트와 스크린샷으로 layout 구조/색상 값을 확정했고, `v2/components/modal` 빈 패키지와 `gray_900`/`soda_400` 색상 리소스 존재를 확인했다.
@@ -144,3 +280,4 @@
- 2026-07-08 최종 검증: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.components.modal.*"`, `./gradlew :app:mergeDebugResources`, `./gradlew :app:compileDebugKotlin`, `git diff --check` PASS. `./gradlew :app:ktlintCheck`는 기존 레거시/타 영역 파일의 package-name, trailing comma, indentation 등 사전 존재 위반으로 FAIL했으며, ktlint 보고서에 이번 변경 파일(`V2ModalDialog.kt`, `V2ModalDialogTest.kt`, `dialog_v2_modal.xml`, `bg_v2_modal.xml`)은 포함되지 않았다. Figma `567:17662`, `567:17666` 스크린샷 기준으로 컨테이너/타이틀/본문/버튼 영역, 버튼 1:1 구성, `gray_900`/white/`soda_400` 색상을 대조했다.
- 2026-07-08 리뷰 반영: 투명 `bg_v2_modal_button.xml`은 실제 시각 효과가 없어 제거했다. 버튼 중복 클릭 시 action이 여러 번 실행될 수 있는 위험을 막기 위해 최초 클릭 1회만 dismiss/action을 수행하도록 보완했고, 긴 title 줄바꿈 시 잘림을 줄이기 위해 title 높이를 `wrap_content` + `minHeight=64dp`로 조정했다.
- 2026-07-08 코드 리뷰/검증: `V2ModalDialog.kt`, `dialog_v2_modal.xml`, `bg_v2_modal.xml`, `V2ModalDialogTest.kt`를 PRD와 Figma MCP `567:17662`, `567:17666` 기준으로 재대조했으며 차단 이슈는 발견하지 않았다. `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.components.modal.*"`, `./gradlew :app:mergeDebugResources`, `./gradlew :app:compileDebugKotlin`, `git diff --check` PASS. 신규 untracked 파일은 `git diff --no-index --check /dev/null <file>`로 별도 확인했고 whitespace 오류 출력이 없었다. `./gradlew :app:ktlintCheck`는 기존 레거시/타 영역 위반으로 FAIL했으며 ktlint 보고서에서 이번 변경 파일명 검색 결과는 없었다.
- 2026-07-08 Phase 5 구현: `MainV2LoginGuard.kt`, `HomeOnAirLiveActivity.kt`, `CreatorChannelActivity.kt`, `CreatorChannelFanTalkWriteActivity.kt`의 직접 교체 후보를 `V2ModalDialog`로 변경하고 source test 계약을 갱신했다. 병렬 RED 실행은 Kotlin incremental cache 경합으로 assertion 전 실패했으나, 이후 비증분/직렬 실행으로 `MainV2LoginGuardSourceTest`, `CreatorChannelActivitySourceTest`, `CreatorChannelFanTalkWriteSourceTest`, `v2.components.modal.*` 테스트가 PASS했다. `./gradlew :app:compileDebugKotlin --no-parallel --no-daemon -Pkotlin.incremental=false``git diff --check`도 PASS했다.