Files
sodalive-android/docs/20260313_커뮤니티댓글알림딥링크포스트아이디연결구현.md

77 lines
7.9 KiB
Markdown

# 2026-03-13 커뮤니티 댓글 알림 딥링크 postId 연결 구현 계획
## 요구사항 정리
- 입력 패턴: `$uriScheme://community/$creatorId?postId=$postId`
- 목표 동작: `path=community`이고 `postId` 쿼리가 존재하면 `CreatorCommunityAllActivity`로 이동한 뒤 해당 게시물의 댓글 리스트를 즉시 노출한다.
- 범위: 앱 내부 딥링크 파싱/라우팅/커뮤니티 화면 진입 동작만 다루며, 서버 API 스키마와 푸시 발송 규격 변경은 포함하지 않는다.
## 완료 기준
- [x] `DeepLinkActivity.buildDeepLinkExtras`에서 `postId` 쿼리를 파싱해 `Constants.EXTRA_COMMUNITY_POST_ID`로 보존한다.
- [x] `MainActivity.buildBundleFromDeepLinkUrl`에서도 동일하게 `postId`를 파싱해 cold start 경로와 foreground 경로의 동작을 일치시킨다.
- [x] `DeepLinkActivity.routeForegroundDeepLink``MainActivity.executeBundleRoute`의 community 분기에서 `EXTRA_COMMUNITY_CREATOR_ID``EXTRA_COMMUNITY_POST_ID`를 함께 전달한다.
- [x] `CreatorCommunityAllActivity``EXTRA_COMMUNITY_POST_ID`를 수신하면 대상 게시물을 찾은 뒤 댓글 바텀시트(`CreatorCommunityCommentFragment`)를 자동으로 띄운다.
- [x] 대상 게시물이 첫 페이지에 없을 수 있으므로 페이징 로드 완료(`isLast`)까지 탐색 후 미발견 시 안전하게 fallback(일반 커뮤니티 목록 유지 + 사용자 안내)한다.
- [x] 변경 파일 기준 정적 진단/단위 테스트/디버그 빌드 검증을 완료하고 결과를 문서 하단 검증 기록에 누적한다.
## 작업 체크리스트
- [x] 딥링크 파라미터 매핑 확장
- [x] `DeepLinkActivity.kt`의 query 파싱 키 목록에 `postId` 추가
- [x] `MainActivity.kt`의 query 파싱 키 목록에 `postId` 추가
- [x] `postId -> Constants.EXTRA_COMMUNITY_POST_ID` 매핑 규칙을 두 파일에 동일하게 반영
- [x] community 라우팅 인텐트 확장
- [x] `CreatorCommunityAllActivity` 호출 시 creatorId/postId 동시 전달
- [x] 포그라운드 라우팅과 앱 재실행 라우팅의 동작 일관성 검증
- [x] 커뮤니티 화면 자동 댓글 오픈 처리
- [x] `CreatorCommunityAllActivity`에 목표 `postId` 상태(1회성 플래그 포함) 추가
- [x] 목록 수신 시 target `postId` 존재 여부 확인 후 댓글 바텀시트 자동 오픈
- [x] 미발견 시 다음 페이지 로드 트리거 및 `isLast` 도달 시 graceful fallback
- [x] 회귀 방지 검증
- [x] community 외 기존 딥링크(`live`, `content`, `series`, `message`, `audition`) 경로 영향 점검
- [x] 푸시 경유(`SodaFirebaseMessagingService`)와 직접 URL 실행(`Intent.ACTION_VIEW`) 모두 동작 확인
## 예상 영향 파일
- `app/src/main/java/kr/co/vividnext/sodalive/main/DeepLinkActivity.kt`
- `app/src/main/java/kr/co/vividnext/sodalive/main/MainActivity.kt`
- `app/src/main/java/kr/co/vividnext/sodalive/explorer/profile/creator_community/all/CreatorCommunityAllActivity.kt`
## 검증 계획
- `./gradlew :app:testDebugUnitTest`
- `./gradlew :app:assembleDebug`
- 필요 시 `./gradlew :app:ktlintCheck`
## 외부 레퍼런스(구현 기준)
- Android Intent/Filter 가이드: `https://developer.android.com/guide/components/intents-filters`
- Android `<data>` element 가이드: `https://developer.android.com/guide/topics/manifest/data-element`
- Android App Links 가이드: `https://developer.android.com/training/app-links`
- Navigation deep link 가이드: `https://developer.android.com/guide/navigation/navigation-deep-link`
## 검증 기록
- 2026-03-13
- 무엇/왜/어떻게: 커뮤니티 댓글 알림 딥링크 구현 계획에 필요한 내부 라우팅 근거를 확보하기 위해 딥링크/커뮤니티/댓글/푸시 경로를 저장소 전역에서 탐색했다.
- 실행 명령: `grep(pattern="postId|community|deeplink|intent-filter|uriScheme|scheme", include="*.{kt,kts,xml,md}")`, `grep(pattern="getQueryParameter|Uri\\.parse|intent\\.data|ACTION_VIEW", include="*.{kt,kts,xml}")`, `ast_grep_search(pattern="Uri.parse($URL)", lang="kotlin")`, `ast_grep_search(pattern="$URI.getQueryParameter($NAME)", lang="kotlin")`, `rg ...` 시도
- 결과: 핵심 경로를 `DeepLinkActivity`/`MainActivity`/`SodaFirebaseMessagingService`/`CreatorCommunityAllActivity`로 특정했고, 현재 community 딥링크는 creatorId만 전달하며 `postId`는 파싱/전달하지 않음을 확인했다. 또한 실행 환경에 `rg` 바이너리가 없어 `command not found: rg`가 발생했다.
- 2026-03-13
- 무엇/왜/어떻게: 공식 문서 및 OSS 예시를 기반으로 안전한 딥링크 파라미터 처리 계획을 보강하기 위해 librarian 탐색 결과를 수집했다.
- 실행 명령: `task(subagent_type="librarian", run_in_background=true, ...)` 2건 수행 후 `session_read(session_id=...)`로 결과 수집
- 결과: Android 공식 딥링크/App Links 가이드와 쿼리 파라미터 처리 예시를 확보했고, 계획 문서의 구현 기준/검증 항목에 반영했다.
- 2026-03-13
- 무엇/왜/어떻게: 계획 문서 기준 구현을 위해 community 딥링크 파싱/라우팅/화면 자동 댓글 오픈 경로를 수정했다.
- 실행 명령: `git diff -- app/src/main/java/kr/co/vividnext/sodalive/main/DeepLinkActivity.kt app/src/main/java/kr/co/vividnext/sodalive/main/MainActivity.kt app/src/main/java/kr/co/vividnext/sodalive/explorer/profile/creator_community/all/CreatorCommunityAllActivity.kt`
- 결과: `postId` 쿼리(`postId`)를 `Constants.EXTRA_COMMUNITY_POST_ID`로 맵핑하고, community 이동 인텐트에 함께 전달되며, 커뮤니티 화면에서 target post의 댓글 바텀시트를 자동 오픈하도록 반영했다.
- 2026-03-13
- 무엇/왜/어떻게: 수정 파일 정적 진단 가능 여부와 회귀를 점검했다.
- 실행 명령: `lsp_diagnostics(DeepLinkActivity.kt/MainActivity.kt/CreatorCommunityAllActivity.kt)`, `./gradlew :app:testDebugUnitTest :app:assembleDebug`
- 결과: Kotlin LSP 서버 미구성으로 `.kt` 진단은 불가했으며, Gradle 검증은 `BUILD SUCCESSFUL`.
- 2026-03-13
- 무엇/왜/어떻게: 수동 딥링크 실행으로 실제 인텐트 라우팅 경로를 확인했다.
- 실행 명령: `adb devices`, `./gradlew :app:installDebug`, `adb shell am start -a android.intent.action.VIEW -d "voiceon://community/1?postId=1"`, `adb shell dumpsys activity activities`
- 결과: 단말 연결/설치 성공 후 `voiceon://community/1?postId=1` 인텐트가 앱 `DeepLinkActivity`로 전달되고 `SplashActivity` 경유 태스크로 진입하는 것을 확인했다.
- 2026-03-13
- 무엇/왜/어떻게: 구현 누락 여부를 줄이기 위해 Oracle 리뷰를 수행하고 지적된 분기 불일치/누락을 보정했다.
- 실행 명령: `task(subagent_type="oracle", run_in_background=false, ...)`, `git diff -- app/src/main/java/kr/co/vividnext/sodalive/main/DeepLinkActivity.kt app/src/main/java/kr/co/vividnext/sodalive/main/MainActivity.kt app/src/main/java/kr/co/vividnext/sodalive/explorer/profile/creator_community/all/CreatorCommunityAllActivity.kt`
- 결과: `MainActivity``deep_link_value/deep_link_sub5` 승격 로직을 추가해 cold start 경로를 정렬했고, `CreatorCommunityAllActivity`의 마지막 페이지 fallback 트리거 보완 및 invalid creator 조기 반환을 반영했다.
- 2026-03-13
- 무엇/왜/어떻게: Oracle 보정 반영 후 회귀 여부를 다시 확인했다.
- 실행 명령: `lsp_diagnostics(DeepLinkActivity.kt/MainActivity.kt/CreatorCommunityAllActivity.kt)`, `./gradlew :app:testDebugUnitTest :app:assembleDebug`, `adb shell am start -a android.intent.action.VIEW -d "voiceon://community/1?postId=1" && adb shell dumpsys activity activities`
- 결과: Kotlin LSP 서버 미구성으로 `.kt` 진단은 불가했고, Gradle은 `BUILD SUCCESSFUL`, ADB 수동 검증에서 딥링크 인텐트(`voiceon://community/1?postId=1`)가 `DeepLinkActivity` 인텐트로 전달됨을 재확인했다.