# 20260225 채널 후원 영역 및 전체보기 구현 ## 작업 목표 - 크리에이터 채널에 채널 후원 섹션을 추가한다. - 채널 후원하기 UI는 라이브 후원하기 UI와 동일한 흐름/스타일을 따른다. - 채널 후원 전체보기 페이지를 별도로 추가한다. - API 연동은 `/explorer/profile/channel-donation`의 POST/GET 요구사항을 반영한다. ## 구현 체크리스트 - [x] 기존 라이브 후원 다이얼로그/아이콘/문구 스타일 재사용 지점 확인 - [x] `ExplorerApi`/`ExplorerRepository`에 채널 후원 POST/GET API 추가 - [x] `UserProfileViewModel`에 채널 후원 조회/후원하기 액션 추가 - [x] `kr.co.vividnext.sodalive.explorer.profile.channel_donation` 패키지에 전체보기 Activity/ViewModel/Adapter 생성 - [x] 크리에이터 채널(`UserProfileActivity`)에 채널 후원 섹션 UI 추가 - [x] 섹션 상단 `제목 - 전체보기` 및 총 개수 노출 - [x] 가로 아이템 리스트 폭을 줄여 좌/우 아이템 일부가 보이도록 구성 - [x] `채널 후원하기` 텍스트 버튼 스타일 적용(배경 `#525252`, radius `16dp`, 흰색 텍스트, 선물 아이콘) - [x] 아이템 UI 적용(프로필 이미지, 닉네임, 시간, 내용) - [x] `createdAt(UTC)`을 기기 타임존으로 변환해 `OO분전/OO시간전/OO일전` 표시 - [x] 내용 텍스트에서 `OO캔` 색상 `#FDCA2F`, 나머지 `#CFD8DC`, 글자 크기 `16sp` 적용 - [x] 문자열/리소스 추가 및 기존 다국어 리소스 반영 - [x] LSP 진단, 테스트/빌드 실행 및 결과 확인 ## 검증 기록 - 2026-02-25 - 무엇/왜/어떻게: 채널 후원 API(POST/GET) 연동, 프로필 채널 후원 섹션 및 후원 버튼(라이브 후원 다이얼로그 재사용), 채널 후원 전체보기 페이지를 추가하고 아이템 시간/문구 스타일을 요구사항대로 반영했다. - 실행 명령: `./gradlew :app:testDebugUnitTest` - 결과: 성공(BUILD SUCCESSFUL), 신규 변경으로 인한 테스트 실패 없음. - 실행 명령: `./gradlew :app:assembleDebug` - 결과: 성공(BUILD SUCCESSFUL), 디버그 빌드 정상 완료. - 참고: 현재 실행 환경의 LSP 도구는 `.kt` 확장 LSP 서버가 구성되어 있지 않아 LSP 진단 대신 Gradle 컴파일/테스트로 정합성을 검증했다. - 2026-02-25 (후속 요구사항 반영) - 무엇/왜/어떻게: 채널 후원 섹션 위치를 최신 콘텐츠 아래로 이동하고, 프로필 페이지는 `GetCreatorProfileResponse.channelDonationList`만 사용하도록 변경했다. 후원 0건 시 빈 문구 노출/전체보기 숨김, 프로필 페이지 개수 제거, 비밀후원 전달, 채널 후원 메시지 100자 제한, `OO캔을 후원했습니다.` 문구 강조, 라이브룸 채팅 후원과 동일한 배경색 규칙을 적용했다. - 실행 명령: `./gradlew --no-daemon :app:assembleDebug` - 결과: 성공(BUILD SUCCESSFUL), 디버그 빌드 정상 완료. - 실행 명령: `./gradlew --no-daemon :app:testDebugUnitTest` - 결과: 성공(BUILD SUCCESSFUL), 단위 테스트 통과. - 참고: 일반 daemon 모드에서 Kotlin incremental cache 충돌로 실패가 발생해 `--no-daemon`으로 재검증했다. - 2026-02-25 (힌트 최대 글자수/국제화 및 중복 문구 수정) - 무엇/왜/어떻게: 채널 후원 UI에서는 메시지 힌트를 최대 100자로 표시하도록 변경하고(라이브는 기존 1000 유지), 힌트 문자열을 `%d` 포맷 기반 국제화 리소스로 분리했다. 또한 채널 후원 리스트 문구는 서버 `message` 원문을 그대로 표시하도록 바꿔 `OO캔을 후원했습니다.` 중복이 생기지 않게 수정하고, 원문 안의 `OO캔` 구간만 색상 강조하도록 반영했다. - 실행 명령: `./gradlew --no-daemon :app:testDebugUnitTest` - 결과: 성공(BUILD SUCCESSFUL), 단위 테스트 통과. - 실행 명령: `./gradlew --no-daemon :app:assembleDebug` - 결과: 성공(BUILD SUCCESSFUL), 디버그 빌드 정상 완료. - 참고: 1회 실행에서 리소스 패키징 일시 오류(`NoSuchFileException`)가 있었으나 재실행 시 정상 통과했다. - 2026-02-25 (채널 후원 아이템 길이 제한/전체보기 터치 동작) - 무엇/왜/어떻게: 채널 후원 아이템에서 긴 메시지로 인한 UI 깨짐을 막기 위해 `message`를 최대 30자 + `...`로 표시하도록 변경했다. 크리에이터 채널 페이지 아이템에는 터치 이벤트를 추가하지 않았고, 채널 후원 전체보기 페이지 아이템은 터치 시 전체 `message`를 다이얼로그로 확인할 수 있게 적용했다. - 실행 명령: `./gradlew --no-daemon :app:assembleDebug` - 결과: 성공(BUILD SUCCESSFUL), 디버그 빌드 정상 완료. - 실행 명령: `./gradlew --no-daemon :app:testDebugUnitTest` - 결과: 성공(BUILD SUCCESSFUL), 단위 테스트 통과. - 참고: 테스트/빌드를 병렬 실행한 1회에서 매니페스트 입력 파일 검증 오류가 발생해 테스트를 단독 재실행하여 통과 확인했다. - 2026-02-25 (전체보기 아이템 확장 방식 변경) - 무엇/왜/어떻게: 채널 후원 전체 리스트 페이지에서 말줄임표가 붙은 텍스트를 터치했을 때 AlertDialog를 띄우지 않고, 해당 아이템 내부 텍스트를 전체 내용으로 확장해서 표시하도록 변경했다. 크리에이터 채널 페이지는 기존처럼 터치 이벤트를 추가하지 않았다. - 실행 명령: `./gradlew --no-daemon :app:testDebugUnitTest` - 결과: 성공(BUILD SUCCESSFUL), 단위 테스트 통과. - 실행 명령: `./gradlew --no-daemon :app:assembleDebug` - 결과: 성공(BUILD SUCCESSFUL), 디버그 빌드 정상 완료. - 참고: 테스트/빌드 병렬 실행 시 1회 manifest 중간 산출물 누락 오류가 발생해 각각 재실행하여 최종 성공을 확인했다. - 2026-02-25 (채널 후원 시간 표시 보정) - 무엇/왜/어떻게: 채널 후원 아이템의 상대 시간 표시가 커뮤니티 포스트와 다르게 계산되던 문제를 수정하기 위해 `GetCommunityPostListResponse.relativeTimeText`와 동일한 계산 규칙(방금 전/분/시간/일/개월/년, UTC 파싱 및 로컬 타임존 기준 계산)으로 동기화했다. - 실행 명령: `./gradlew --no-daemon :app:testDebugUnitTest` - 결과: 성공(BUILD SUCCESSFUL), 단위 테스트 통과. - 실행 명령: `./gradlew --no-daemon :app:assembleDebug` - 결과: 성공(BUILD SUCCESSFUL), 디버그 빌드 정상 완료.