docs(home): AI 캐릭터 이동 검증을 기록한다
This commit is contained in:
@@ -538,18 +538,37 @@
|
|||||||
- `HomeMainFragmentLayoutTest`에 activity type별 route와 Intent extra 계약 회귀 테스트를 추가한다.
|
- `HomeMainFragmentLayoutTest`에 activity type별 route와 Intent extra 계약 회귀 테스트를 추가한다.
|
||||||
- `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentLayoutTest.home recent activity route maps activity type to target destination" --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentLayoutTest.home recent activity route ignores live unknown and missing target" --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentLayoutTest.home recent activity route creates expected intents"`로 RED/GREEN을 확인한다.
|
- `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentLayoutTest.home recent activity route maps activity type to target destination" --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentLayoutTest.home recent activity route ignores live unknown and missing target" --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentLayoutTest.home recent activity route creates expected intents"`로 RED/GREEN을 확인한다.
|
||||||
|
|
||||||
|
- [x] **Task 11.2: AI 캐릭터 item 크리에이터 채널 이동으로 변경**
|
||||||
|
- 수정: `app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/data/HomeRecommendationModels.kt`
|
||||||
|
- 수정: `app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/model/HomeRecommendationUiModels.kt`
|
||||||
|
- 수정: `app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/model/HomeRecommendationMappers.kt`
|
||||||
|
- 수정: `app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/HomeMainFragment.kt`
|
||||||
|
- 수정: `app/src/test/java/kr/co/vividnext/sodalive/v2/main/home/HomeMainFragmentLayoutTest.kt`
|
||||||
|
- 구현 내용:
|
||||||
|
- `HomeAiCharacterItem`에 `@SerializedName("creatorId") val creatorId: Long`을 추가한다.
|
||||||
|
- `HomeRecommendationAiCharacterUiModel` 또는 동등한 UI model에 `creatorId`를 보존한다.
|
||||||
|
- `HomeAiCharacterItem.toUiModel()`에서 `characterId`는 `CharacterChatThumbnailItem.characterId` 표시 계약에 유지하고, `creatorId`는 클릭 라우팅 전용 값으로 분리해 전달한다.
|
||||||
|
- `HomeAiCharacterAdapter` callback은 AI 캐릭터 UI model을 그대로 전달하고, `HomeMainFragment`에서 `creatorId > 0L`일 때 `CreatorChannelActivity.newIntent(requireContext(), creatorId)`로 이동한다.
|
||||||
|
- 기존 `CharacterDetailActivity` import와 `openCharacterDetail()` 사용은 제거한다.
|
||||||
|
- `creatorId <= 0L`이면 앱이 crash 되지 않고 이동하지 않는다.
|
||||||
|
- 검증:
|
||||||
|
- `HomeMainFragmentLayoutTest`에 `HomeAiCharacterItem.creatorId`가 UI model로 보존되는 mapper 회귀 테스트를 추가한다.
|
||||||
|
- `HomeMainFragmentLayoutTest`에 AI 캐릭터 item route가 `CreatorChannelActivity` intent와 `creatorId` extra를 생성하고, `creatorId <= 0L`에서는 intent를 생성하지 않는 회귀 테스트를 추가한다.
|
||||||
|
- `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentLayoutTest"`로 RED/GREEN을 확인한다.
|
||||||
|
- `./gradlew :app:compileDebugKotlin`, `./gradlew :app:ktlintCheck`로 회귀를 확인한다.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### Phase 12: 최종 검증과 문서 기록
|
### Phase 12: 최종 검증과 문서 기록
|
||||||
|
|
||||||
- [ ] **Task 12.1: 단위 테스트와 빌드 검증**
|
- [x] **Task 12.1: 단위 테스트와 빌드 검증**
|
||||||
- 실행: `./gradlew :app:testDebugUnitTest`
|
- 실행: `./gradlew :app:testDebugUnitTest`
|
||||||
- 실행: `./gradlew :app:compileDebugKotlin`
|
- 실행: `./gradlew :app:compileDebugKotlin`
|
||||||
- 실행: `./gradlew :app:mergeDebugResources`
|
- 실행: `./gradlew :app:mergeDebugResources`
|
||||||
- 실행: `./gradlew :app:ktlintCheck`
|
- 실행: `./gradlew :app:ktlintCheck`
|
||||||
- 기대 결과: 모두 성공.
|
- 기대 결과: 모두 성공.
|
||||||
|
|
||||||
- [ ] **Task 12.2: 수동 확인**
|
- [ ] **Task 12.2: 수동 확인** `[blocked: 연결된 Android 기기 없음]`
|
||||||
- 확인 항목:
|
- 확인 항목:
|
||||||
- 추천 tab 선택 상태
|
- 추천 tab 선택 상태
|
||||||
- tab 전환은 글자 터치로만 동작하고 swipe 전환은 없음
|
- tab 전환은 글자 터치로만 동작하고 swipe 전환은 없음
|
||||||
@@ -560,13 +579,14 @@
|
|||||||
- 첫 오디오 태그 조건
|
- 첫 오디오 태그 조건
|
||||||
- activity type 다국어 문자열
|
- activity type 다국어 문자열
|
||||||
- 방금 활동한 크리에이터 목적지별 클릭 이동
|
- 방금 활동한 크리에이터 목적지별 클릭 이동
|
||||||
|
- AI 캐릭터 item 크리에이터 채널 클릭 이동
|
||||||
- 모두 팔로우 success 후 완료 상태
|
- 모두 팔로우 success 후 완료 상태
|
||||||
- 배너 목적지별 클릭 이동
|
- 배너 목적지별 클릭 이동
|
||||||
- 인기 커뮤니티 유료/무료/구매 완료 이미지 상태
|
- 인기 커뮤니티 유료/무료/구매 완료 이미지 상태
|
||||||
- 사업자 정보 더보기/접기
|
- 사업자 정보 더보기/접기
|
||||||
- 기대 결과: PRD Metrics 항목 충족.
|
- 기대 결과: PRD Metrics 항목 충족.
|
||||||
|
|
||||||
- [ ] **Task 12.3: 검증 기록 누적**
|
- [x] **Task 12.3: 검증 기록 누적**
|
||||||
- 수정: `docs/20260601_메인_홈_추천_UI와_API_연동/plan-task.md`
|
- 수정: `docs/20260601_메인_홈_추천_UI와_API_연동/plan-task.md`
|
||||||
- 수정: `docs/20260601_메인_홈_추천_UI와_API_연동/prd.md`
|
- 수정: `docs/20260601_메인_홈_추천_UI와_API_연동/prd.md`
|
||||||
- 구현 내용: 실행 명령, 결과, 실패 시 원인과 후속 조치를 문서 하단 `검증 기록`에 누적한다.
|
- 구현 내용: 실행 명령, 결과, 실패 시 원인과 후속 조치를 문서 하단 `검증 기록`에 누적한다.
|
||||||
@@ -583,6 +603,12 @@
|
|||||||
---
|
---
|
||||||
|
|
||||||
## 검증 기록
|
## 검증 기록
|
||||||
|
- 2026-06-23: Task 11.2와 Phase 12 코드 리뷰 및 검증을 재수행했다. 리뷰 범위는 `HomeAiCharacterItem.creatorId` DTO 추가, `HomeRecommendationAiCharacterUiModel.creatorId` 보존, `CharacterChatThumbnailItem.characterId` 표시 계약 유지, `HomeRecommendationAiCharacterRoute.Creator` 라우팅, `CreatorChannelActivity.newIntent(context, creatorId)` intent 생성, `creatorId <= 0L` no-op, `CharacterDetailActivity` 제거, `HomeAiCharacterAdapter` callback 변경, 회귀 테스트 추가다. 코드 리뷰 결과 blocking finding은 없었다. 검증으로 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentLayoutTest"`는 BUILD SUCCESSFUL을 확인했다. 첫 `./gradlew :app:testDebugUnitTest` 실행은 `CreatorChannelHomeViewModelTest > 채널 후원 성공은 기존 후원 API를 호출하고 홈을 다시 로드한다`의 `SharedPreferenceManager.can` assert에서 1건 실패했으나, 이번 변경 파일과 무관한 `v2.creator.channel` 영역이고 해당 테스트 단독 실행 및 `CreatorChannelHomeViewModelTest` 클래스 실행은 모두 BUILD SUCCESSFUL이었다. 이후 전체 `./gradlew :app:testDebugUnitTest` 재실행도 BUILD SUCCESSFUL을 확인했다. `./gradlew :app:compileDebugKotlin`, `./gradlew :app:mergeDebugResources`, `./gradlew :app:ktlintCheck`도 BUILD SUCCESSFUL을 확인했다. `adb devices`는 권한 실행 기준 연결된 Android 기기가 없어 Phase 12.2 실제 화면 수동 확인은 계속 `[blocked: 연결된 Android 기기 없음]`으로 유지한다.
|
||||||
|
- 2026-06-23: Phase 12.1 후속 조치로 기존 `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/fantalk/CreatorChannelFanTalkFragmentLayoutTest.kt:78`의 긴 줄을 동작 변경 없이 줄바꿈만 수정했다. 관련 테스트 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.fantalk.CreatorChannelFanTalkFragmentLayoutTest"`와 `./gradlew :app:ktlintCheck`는 BUILD SUCCESSFUL을 확인했다. 이후 Phase 12.1 전체 명령 `./gradlew :app:testDebugUnitTest`, `./gradlew :app:compileDebugKotlin`, `./gradlew :app:mergeDebugResources`, `./gradlew :app:ktlintCheck`를 재실행했고 모두 BUILD SUCCESSFUL을 확인해 Task 12.1을 완료 처리했다.
|
||||||
|
- 2026-06-23: Phase 12.2 수동 확인을 위해 `adb devices`를 실행했으나 연결된 Android 기기가 없어 실제 앱 화면 수동 확인은 수행하지 못했다. 자동 검증으로 추천 tab/스크롤/섹션/라우팅/빈 리스트/태그/배너/커뮤니티/사업자 정보 관련 `HomeMainFragmentLayoutTest` 전체와 전체 unit test는 통과했지만, 실제 기기 수동 확인 항목은 `[blocked: 연결된 Android 기기 없음]`으로 남긴다.
|
||||||
|
- 2026-06-23: Phase 12.1 검증으로 `./gradlew :app:testDebugUnitTest`, `./gradlew :app:compileDebugKotlin`, `./gradlew :app:mergeDebugResources`를 실행했고 모두 BUILD SUCCESSFUL을 확인했다. `./gradlew :app:ktlintCheck`는 이번 변경 파일이 아닌 `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/fantalk/CreatorChannelFanTalkFragmentLayoutTest.kt:78`의 기존 줄 길이/인자 줄바꿈 위반으로 실패했다. `git diff -- app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/fantalk/CreatorChannelFanTalkFragmentLayoutTest.kt` 결과 변경 없음으로 확인해 이번 Task 11.2 변경과 분리했다. 따라서 Phase 12.1은 ktlint 외부 이슈 해소 전까지 완료 처리하지 않는다.
|
||||||
|
- 2026-06-23: Task 11.2 구현으로 `HomeAiCharacterItem.creatorId`를 DTO에 추가하고, `HomeRecommendationAiCharacterUiModel`에 `creatorId`를 보존하도록 매핑했다. `characterId`는 기존 `CharacterChatThumbnailItem.characterId` 표시 계약에 유지하고, AI 캐릭터 item 클릭 라우팅은 `HomeRecommendationAiCharacterRoute.Creator`와 `CreatorChannelActivity.newIntent(context, creatorId)`로 분리했다. `HomeAiCharacterAdapter` callback은 UI model을 전달하도록 변경했고, `HomeMainFragment`에서는 `creatorId > 0L`일 때만 이동하며 기존 `CharacterDetailActivity` import와 `openCharacterDetail()` 사용을 제거했다. RED 검증은 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentLayoutTest.home ai character mapper preserves creator id for routing and character id for display" --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentLayoutTest.home ai character route uses creator id and ignores invalid ids" --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentLayoutTest.home ai character route creates creator channel intent"`에서 `HomeRecommendationAiCharacterRoute`, `toHomeRecommendationAiCharacterIntent`, `toHomeRecommendationAiCharacterRoute`, `HomeAiCharacterItem.creatorId` 미정의 컴파일 실패로 확인했다. 구현 후 동일 명령과 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentLayoutTest"`는 모두 BUILD SUCCESSFUL을 확인했다.
|
||||||
|
- 2026-06-23: 사용자 추가 요청에 따라 `HomeAiCharacterItem.creatorId` 추가와 `크리에이터와 이야기를 나눠요!` item 터치 목적지를 캐릭터 상세에서 크리에이터 채널로 변경하는 후속 작업을 `Task 11.2`로 추가했다. DTO, UI model, mapper, `HomeMainFragment` 라우팅, mapper/intent 회귀 테스트, `creatorId <= 0L` no-op guard, `CharacterDetailActivity` 제거 항목을 구현 기준으로 명시했다. 문서 변경만 수행했으므로 Gradle 검증은 실행하지 않고 문서 재읽기로 확인한다.
|
||||||
- 2026-06-06: 사용자 요청에 따라 `Phase 11: 방금 활동한 크리에이터 터치 액션 연결`을 추가하고 기존 `Phase 11: 최종 검증과 문서 기록`을 `Phase 12`로 뒤로 밀었다. 구현으로 최근 활동 카드 클릭 시 `Live`는 no-op, `LiveReplay`/`Audio`는 `AudioContentDetailActivity` + `Constants.EXTRA_AUDIO_CONTENT_ID = targetId`, `Community`는 `CreatorCommunityAllActivity` + `Constants.EXTRA_COMMUNITY_CREATOR_ID = targetId`로 이동하도록 연결했다. RED 검증은 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentLayoutTest.home recent activity route maps activity type to target destination" --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentLayoutTest.home recent activity route ignores live unknown and missing target" --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentLayoutTest.home recent activity route creates expected intents"`에서 `HomeRecommendationRecentlyActiveCreatorRoute`, `toHomeRecommendationRecentlyActiveCreatorRoute()`, `toHomeRecommendationRecentlyActiveCreatorIntent()` 미정의 컴파일 실패로 확인했다. 구현 후 동일 명령은 BUILD SUCCESSFUL을 확인했다.
|
- 2026-06-06: 사용자 요청에 따라 `Phase 11: 방금 활동한 크리에이터 터치 액션 연결`을 추가하고 기존 `Phase 11: 최종 검증과 문서 기록`을 `Phase 12`로 뒤로 밀었다. 구현으로 최근 활동 카드 클릭 시 `Live`는 no-op, `LiveReplay`/`Audio`는 `AudioContentDetailActivity` + `Constants.EXTRA_AUDIO_CONTENT_ID = targetId`, `Community`는 `CreatorCommunityAllActivity` + `Constants.EXTRA_COMMUNITY_CREATOR_ID = targetId`로 이동하도록 연결했다. RED 검증은 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentLayoutTest.home recent activity route maps activity type to target destination" --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentLayoutTest.home recent activity route ignores live unknown and missing target" --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentLayoutTest.home recent activity route creates expected intents"`에서 `HomeRecommendationRecentlyActiveCreatorRoute`, `toHomeRecommendationRecentlyActiveCreatorRoute()`, `toHomeRecommendationRecentlyActiveCreatorIntent()` 미정의 컴파일 실패로 확인했다. 구현 후 동일 명령은 BUILD SUCCESSFUL을 확인했다.
|
||||||
- 2026-06-06: Task 11.1 회귀 검증으로 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentLayoutTest"`, `./gradlew :app:compileDebugKotlin`, `./gradlew :app:ktlintCheck`를 실행했고 모두 BUILD SUCCESSFUL을 확인했다. `ktlintCheck`에서는 기존 `.editorconfig`의 `disabled_rules` 속성 deprecation warning만 출력되었고 신규 실패는 없었다. 변경 파일 4개로 리뷰 게이트를 수행했고, `Live` no-op, `LiveReplay`/`Audio`/`Community` 목적지 및 extra 계약, invalid target no-op, Fragment callback 연결, Phase 11/12 문서 이동, 테스트 커버리지에 대해 blocking finding 없음으로 승인받았다.
|
- 2026-06-06: Task 11.1 회귀 검증으로 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentLayoutTest"`, `./gradlew :app:compileDebugKotlin`, `./gradlew :app:ktlintCheck`를 실행했고 모두 BUILD SUCCESSFUL을 확인했다. `ktlintCheck`에서는 기존 `.editorconfig`의 `disabled_rules` 속성 deprecation warning만 출력되었고 신규 실패는 없었다. 변경 파일 4개로 리뷰 게이트를 수행했고, `Live` no-op, `LiveReplay`/`Audio`/`Community` 목적지 및 extra 계약, invalid target no-op, Fragment callback 연결, Phase 11/12 문서 이동, 테스트 커버리지에 대해 blocking finding 없음으로 승인받았다.
|
||||||
- 2026-06-05: Task 10.1 구현으로 홈 추천 배너 클릭 라우팅을 연결했다. `eventItem`은 `EventDetailActivity` + `Constants.EXTRA_EVENT`, `creatorId`는 `UserProfileActivity` + `Constants.EXTRA_USER_ID`, `seriesId`는 `SeriesDetailActivity` + `Constants.EXTRA_SERIES_ID`, `link`는 `Intent.ACTION_VIEW`로 실행한다. 여러 대상이 함께 내려오면 `eventItem` → `creatorId` → `seriesId` → `link` 순서로 우선 처리한다. RED 검증은 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentLayoutTest.home banner route uses event creator series link priority"`에서 `HomeRecommendationBannerRoute`, `toHomeRecommendationBannerRoute()` 미정의 컴파일 실패로 확인했다. 구현 후 동일 테스트는 최초 `:app:kspDebugKotlin`의 `java.io.EOFException`으로 중단되었고, `--rerun-tasks` 재실행에서 BUILD SUCCESSFUL을 확인했다. 이후 내부 딥링크 판별 누락 지적에 따라 `BuildConfig.APPSCHEME` custom scheme과 `https://${BuildConfig.APPSCHEME}.onelink.me` app link만 내부 딥링크로 인정하고, `mailto:` 같은 외부 custom scheme은 이동하지 않도록 보강했다. RED 검증은 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentLayoutTest.home banner route maps creator series web and internal deeplink" --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentLayoutTest.home banner route ignores blank malformed and scheme-less links"`에서 2개 테스트 실패로 확인했고, 수정 후 동일 명령은 BUILD SUCCESSFUL을 확인했다.
|
- 2026-06-05: Task 10.1 구현으로 홈 추천 배너 클릭 라우팅을 연결했다. `eventItem`은 `EventDetailActivity` + `Constants.EXTRA_EVENT`, `creatorId`는 `UserProfileActivity` + `Constants.EXTRA_USER_ID`, `seriesId`는 `SeriesDetailActivity` + `Constants.EXTRA_SERIES_ID`, `link`는 `Intent.ACTION_VIEW`로 실행한다. 여러 대상이 함께 내려오면 `eventItem` → `creatorId` → `seriesId` → `link` 순서로 우선 처리한다. RED 검증은 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentLayoutTest.home banner route uses event creator series link priority"`에서 `HomeRecommendationBannerRoute`, `toHomeRecommendationBannerRoute()` 미정의 컴파일 실패로 확인했다. 구현 후 동일 테스트는 최초 `:app:kspDebugKotlin`의 `java.io.EOFException`으로 중단되었고, `--rerun-tasks` 재실행에서 BUILD SUCCESSFUL을 확인했다. 이후 내부 딥링크 판별 누락 지적에 따라 `BuildConfig.APPSCHEME` custom scheme과 `https://${BuildConfig.APPSCHEME}.onelink.me` app link만 내부 딥링크로 인정하고, `mailto:` 같은 외부 custom scheme은 이동하지 않도록 보강했다. RED 검증은 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentLayoutTest.home banner route maps creator series web and internal deeplink" --tests "kr.co.vividnext.sodalive.v2.main.home.HomeMainFragmentLayoutTest.home banner route ignores blank malformed and scheme-less links"`에서 2개 테스트 실패로 확인했고, 수정 후 동일 명령은 BUILD SUCCESSFUL을 확인했다.
|
||||||
|
|||||||
@@ -101,6 +101,7 @@ data class HomeFirstAudioContentItem(
|
|||||||
|
|
||||||
data class HomeAiCharacterItem(
|
data class HomeAiCharacterItem(
|
||||||
val characterId: Long,
|
val characterId: Long,
|
||||||
|
val creatorId: Long,
|
||||||
val name: String,
|
val name: String,
|
||||||
val description: String,
|
val description: String,
|
||||||
val profileImage: String?,
|
val profileImage: String?,
|
||||||
@@ -127,6 +128,8 @@ data class HomePopularCommunityPostItem(
|
|||||||
#### Changed Item Requirements
|
#### Changed Item Requirements
|
||||||
- `HomeFirstAudioContentItem.price`는 첫 오디오 콘텐츠의 무료 여부 표시 정책에 사용한다.
|
- `HomeFirstAudioContentItem.price`는 첫 오디오 콘텐츠의 무료 여부 표시 정책에 사용한다.
|
||||||
- `HomeFirstAudioContentItem.isPointAvailable`은 첫 오디오 콘텐츠 카드 바인딩 시 포인트 사용 가능 표시 정책에 반영한다.
|
- `HomeFirstAudioContentItem.isPointAvailable`은 첫 오디오 콘텐츠 카드 바인딩 시 포인트 사용 가능 표시 정책에 반영한다.
|
||||||
|
- `HomeAiCharacterItem.creatorId`는 `크리에이터와 이야기를 나눠요!` 섹션 item 터치 시 크리에이터 채널 이동 값으로 사용한다.
|
||||||
|
- `HomeAiCharacterItem.characterId`는 `CharacterChatThumbnailView` 표시 모델의 캐릭터 식별 값으로 유지하되, 추천 홈 item 터치 목적지로는 사용하지 않는다.
|
||||||
- `HomeAiCharacterItem.profileImage`는 `CharacterChatThumbnailView`의 실제 이미지 URL로 사용한다.
|
- `HomeAiCharacterItem.profileImage`는 `CharacterChatThumbnailView`의 실제 이미지 URL로 사용한다.
|
||||||
- `HomeAiCharacterItem.originalWorkTitle`이 null이면 기존 `CharacterChatThumbnailView`의 원작 없음 표시 정책에 맞춰 원작 영역을 유지하거나 숨기는 방식을 구현 계획에서 확정한다.
|
- `HomeAiCharacterItem.originalWorkTitle`이 null이면 기존 `CharacterChatThumbnailView`의 원작 없음 표시 정책에 맞춰 원작 영역을 유지하거나 숨기는 방식을 구현 계획에서 확정한다.
|
||||||
- `HomePopularCommunityPostItem.postId`는 커뮤니티 게시글 이동/식별 값으로 사용한다.
|
- `HomePopularCommunityPostItem.postId`는 커뮤니티 게시글 이동/식별 값으로 사용한다.
|
||||||
@@ -328,6 +331,8 @@ HomeRecommendation 화면
|
|||||||
- `HomeAiCharacterItem.profileImage`가 null이면 호출부 이미지 로딩 정책에 따라 placeholder 또는 빈 상태를 표시한다.
|
- `HomeAiCharacterItem.profileImage`가 null이면 호출부 이미지 로딩 정책에 따라 placeholder 또는 빈 상태를 표시한다.
|
||||||
- `HomePopularCommunityPostItem.imageUrl` 또는 `audioUrl`이 null이어도 커뮤니티 feed는 본문/반응 수 중심으로 표시 가능해야 한다.
|
- `HomePopularCommunityPostItem.imageUrl` 또는 `audioUrl`이 null이어도 커뮤니티 feed는 본문/반응 수 중심으로 표시 가능해야 한다.
|
||||||
- 유료 미구매 포스트의 가격 capsule은 `price` 값을 사용하고, 유료 구매 완료 또는 무료 포스트에는 가격 capsule을 표시하지 않는다.
|
- 유료 미구매 포스트의 가격 capsule은 `price` 값을 사용하고, 유료 구매 완료 또는 무료 포스트에는 가격 capsule을 표시하지 않는다.
|
||||||
|
- `HomeAiCharacterItem.creatorId <= 0`이면 `크리에이터와 이야기를 나눠요!` item 터치 시 이동하지 않는다.
|
||||||
|
- `크리에이터와 이야기를 나눠요!` item 터치 시 `CharacterDetailActivity`가 아니라 `CreatorChannelActivity`로 이동한다.
|
||||||
- `HomeBannerItem`은 `type` 없이 `eventItem`, `creatorId`, `seriesId`, `link` 값 기준으로 이동한다.
|
- `HomeBannerItem`은 `type` 없이 `eventItem`, `creatorId`, `seriesId`, `link` 값 기준으로 이동한다.
|
||||||
- 배너 이동 우선순위는 `eventItem`, `creatorId`, `seriesId`, `link` 순서로 처리한다.
|
- 배너 이동 우선순위는 `eventItem`, `creatorId`, `seriesId`, `link` 순서로 처리한다.
|
||||||
- `link`가 웹 URL이면 `Intent.ACTION_VIEW`를 사용해 외부 웹 URL로 이동한다.
|
- `link`가 웹 URL이면 `Intent.ACTION_VIEW`를 사용해 외부 웹 URL로 이동한다.
|
||||||
@@ -351,6 +356,7 @@ HomeRecommendation 화면
|
|||||||
- 커뮤니티 본문과 사업자 정보는 긴 텍스트가 화면 폭을 밀어내지 않아야 한다.
|
- 커뮤니티 본문과 사업자 정보는 긴 텍스트가 화면 폭을 밀어내지 않아야 한다.
|
||||||
- 사업자 정보는 기본 3줄만 보여 홈 탐색을 방해하지 않고, 사용자가 원할 때 전체 내용을 확인할 수 있어야 한다.
|
- 사업자 정보는 기본 3줄만 보여 홈 탐색을 방해하지 않고, 사용자가 원할 때 전체 내용을 확인할 수 있어야 한다.
|
||||||
- 터치 동작은 UI 컴포넌트 내부에서 목적지를 결정하지 않고 화면/adapter callback으로 위임한다.
|
- 터치 동작은 UI 컴포넌트 내부에서 목적지를 결정하지 않고 화면/adapter callback으로 위임한다.
|
||||||
|
- `크리에이터와 이야기를 나눠요!` 섹션의 AI 캐릭터 카드는 표시 형태는 유지하되, 터치 결과는 캐릭터 상세가 아닌 해당 크리에이터 채널 진입이어야 한다.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -378,6 +384,7 @@ HomeRecommendation 화면
|
|||||||
- `HomeMainFragment`에서 `view_title_bar_home`, `TextTabBarView`, `view_section_title` 재사용이 확인된다.
|
- `HomeMainFragment`에서 `view_title_bar_home`, `TextTabBarView`, `view_section_title` 재사용이 확인된다.
|
||||||
- `FeedCommunityView`에서 keyword 영역이 추천 페이지에 노출되지 않고, 이미지와 유료 미구매 overlay가 표시된다.
|
- `FeedCommunityView`에서 keyword 영역이 추천 페이지에 노출되지 않고, 이미지와 유료 미구매 overlay가 표시된다.
|
||||||
- `AudioContentCardView`에서 `ic_content_tag_point`, `무료`, `FIRST` 태그가 조건에 맞게 표시되고, `ic_content_tag_original`은 표시되지 않는다.
|
- `AudioContentCardView`에서 `ic_content_tag_point`, `무료`, `FIRST` 태그가 조건에 맞게 표시되고, `ic_content_tag_original`은 표시되지 않는다.
|
||||||
|
- `HomeAiCharacterItem.creatorId`가 UI model까지 보존되고, AI 캐릭터 item 터치 시 `CreatorChannelActivity`에 `creatorId`가 전달된다.
|
||||||
- 제외 대상인 `추천 필모그래피`, `또 다른 모습` 섹션이 화면에 생성되지 않는다.
|
- 제외 대상인 `추천 필모그래피`, `또 다른 모습` 섹션이 화면에 생성되지 않는다.
|
||||||
- 모두 팔로우 API success 후 버튼이 `모두 팔로우 완료`와 `ic_new_following` 상태로 변경된다.
|
- 모두 팔로우 API success 후 버튼이 `모두 팔로우 완료`와 `ic_new_following` 상태로 변경된다.
|
||||||
- 사업자 정보는 기본 3줄 말줄임, 더보기 후 전체 표시, 접기 후 3줄 복귀가 동작한다.
|
- 사업자 정보는 기본 3줄 말줄임, 더보기 후 전체 표시, 접기 후 3줄 복귀가 동작한다.
|
||||||
@@ -397,7 +404,11 @@ HomeRecommendation 화면
|
|||||||
---
|
---
|
||||||
|
|
||||||
## 12. 검증 기록
|
## 12. 검증 기록
|
||||||
|
- 2026-06-23: 기존 `CreatorChannelFanTalkFragmentLayoutTest.kt:78` ktlint 줄바꿈 위반을 동작 변경 없이 수정한 뒤 `./gradlew :app:testDebugUnitTest`, `./gradlew :app:compileDebugKotlin`, `./gradlew :app:mergeDebugResources`, `./gradlew :app:ktlintCheck`가 모두 BUILD SUCCESSFUL임을 재확인했다. `adb devices` 결과 연결된 Android 기기가 없어 실제 기기 수동 확인은 수행하지 못했고, 해당 수동 확인은 환경 차단으로 계획 문서에 남겼다.
|
||||||
|
- 2026-06-23: Phase 12 검증으로 `./gradlew :app:testDebugUnitTest`, `./gradlew :app:compileDebugKotlin`, `./gradlew :app:mergeDebugResources`는 BUILD SUCCESSFUL을 확인했다. `./gradlew :app:ktlintCheck`는 이번 변경 범위 밖의 `CreatorChannelFanTalkFragmentLayoutTest.kt:78` 기존 줄 길이/인자 줄바꿈 위반으로 실패했으며, 해당 파일은 이번 diff에 포함되지 않음을 확인했다.
|
||||||
|
- 2026-06-23: `HomeAiCharacterItem.creatorId` 응답 계약을 실제 DTO/UI model/mapper에 반영하고, `크리에이터와 이야기를 나눠요!` item 터치 시 `CharacterDetailActivity` 대신 `CreatorChannelActivity`로 이동하도록 구현했다. `creatorId <= 0L`은 route를 만들지 않아 이동하지 않고, `characterId`는 `CharacterChatThumbnailItem.characterId` 표시 계약에 유지한다. 관련 RED/GREEN targeted test와 `HomeMainFragmentLayoutTest` 전체 회귀 테스트가 BUILD SUCCESSFUL임을 확인했다.
|
||||||
- 2026-06-05: 사용자 추가 요청에 따라 배너 `link`가 내부 딥링크이면 기존 딥링크 실행 정책에 따라 앱 내부 딥링크를 실행하도록 PRD의 사용자 스토리, Edge Cases, Open Questions를 갱신했다. 문서 변경만 수행했으므로 Gradle 검증은 실행하지 않고 문서 재읽기로 확인한다.
|
- 2026-06-05: 사용자 추가 요청에 따라 배너 `link`가 내부 딥링크이면 기존 딥링크 실행 정책에 따라 앱 내부 딥링크를 실행하도록 PRD의 사용자 스토리, Edge Cases, Open Questions를 갱신했다. 문서 변경만 수행했으므로 Gradle 검증은 실행하지 않고 문서 재읽기로 확인한다.
|
||||||
|
- 2026-06-23: 사용자 추가 요청에 따라 `HomeAiCharacterItem.creatorId`를 응답 계약에 추가하고, `크리에이터와 이야기를 나눠요!` item 터치 시 `CharacterDetailActivity`가 아니라 `CreatorChannelActivity`로 이동하는 요구사항을 PRD에 반영했다. 문서 변경만 수행했으므로 Gradle 검증은 실행하지 않고 문서 재읽기로 확인한다.
|
||||||
- 2026-06-01: `docs/prd/sample-prd.md`와 `docs/agent-guides/work-plan-docs.md`를 확인해 신규 문서 위치와 PRD 작성 형식을 맞췄다.
|
- 2026-06-01: `docs/prd/sample-prd.md`와 `docs/agent-guides/work-plan-docs.md`를 확인해 신규 문서 위치와 PRD 작성 형식을 맞췄다.
|
||||||
- 2026-06-01: Figma `24:5514`의 최상위 구조를 확인해 `live`, `banner`, `section-title`, `contents`, `chat-thumbnail`, `profile`, `feed`, 사업자 정보 섹션의 배치와 제외 후보 섹션을 PRD에 반영했다.
|
- 2026-06-01: Figma `24:5514`의 최상위 구조를 확인해 `live`, `banner`, `section-title`, `contents`, `chat-thumbnail`, `profile`, `feed`, 사업자 정보 섹션의 배치와 제외 후보 섹션을 PRD에 반영했다.
|
||||||
- 2026-06-01: 저장소의 기존 v2 widget 패키지(`banner`, `livethumbnail`, `characterchatthumbnail`, `feed`, `AudioContentCardView`)와 관련 PRD를 확인해 재사용 후보를 문서화했다.
|
- 2026-06-01: 저장소의 기존 v2 widget 패키지(`banner`, `livethumbnail`, `characterchatthumbnail`, `feed`, `AudioContentCardView`)와 관련 PRD를 확인해 재사용 후보를 문서화했다.
|
||||||
|
|||||||
Reference in New Issue
Block a user