Repository navigation
refactor(core): 추모 영상 실행 가드가 발신자·수신자 2벌 — 37줄 문자 단위 동일본을 core:common 으로 승격 #1436
Description
작업 유형
refactor — 동작 변경 없는 구조·책임·경계 개선
주 담당 모듈
core — 코어
개요
추모 영상 URL 을 외부 앱으로 여는 실행 가드가 같은 코드 2벌로 존재한다.
| 모듈 | 함수 | 도입 |
|---|---|---|
feature/afternote/presentation (author/navigation/AfternoteNavGraphDetail.kt) |
launchMemorialVideo |
PR #1336 (#463) |
feature/receiver/presentation (detail/MemorialReceivedDetailScreen.kt) |
launchReceivedMemorialVideo |
PR #1395 (#1394) |
도입 당시엔 함수명만 통일해 diff 하면 본문 37줄이 문자 단위로 동일했다 (차이 0줄, 2026-08-29 실측).
2026-08-29 갱신 — 두 판은 이미 갈라졌다. PR #1395 가 안내 콜백을 원인별로 분리했다(
onRejected= URL 불합격 /onUnavailable= 실행 거부). 작성자 판은 여전히 단일onUnavailable이라 URL 이 막힌 경우에도feature_afternote_memorial_video_no_app(«재생할 앱이 없습니다») 이 뜨는 거짓 안내가 develop 에 남아 있다. 작성자 화면은 #1394 범위 밖이라 그 PR 이 0줄 유지했고, 해소는 이 승격이 맡는다.
왜 중복을 두면 안 되나 — 이건 스타일 중복이 아니라 보안 가드다. 허용 스킴(http/https)·host 검증 규칙이 두 곳에 흩어져 있으면 한쪽만 고칠 때 다른 쪽이 뚫린다. 그리고 이미 갈라지기 시작했다 — 거부 케이스 테스트 목록이 #1395 쪽에만 intent:·tel: 2건 더 많다 (#1336 6건 / #1395 8건).
승격 위치는 core:common — 이 함수는 Compose 비의존이고 Intent/Uri 만 쓰며, 두 소비 모듈이 모두 projects.core.common 에 의존한다. feature:afternote:presentation 의 internal 을 풀어 receiver 가 직접 참조하는 방향(모듈 의존 자체는 feature/receiver/presentation/build.gradle.kts 에 이미 있다)은 화면 유틸을 feature 모듈끼리 노출하게 되므로 택하지 않는다.
완료 조건
core:common에 가드 함수를 1벌 신설한다 (공백 검사 +http/https(ignoreCase) 스킴 + host 비어있지 않음,startActivity직접 시도 +ActivityNotFoundException·SecurityException·IllegalArgumentException폴백).launchMemorialVideo·launchReceivedMemorialVideo두 정의를 제거하고 호출처 2곳을 승격본으로 치환한다.- 단위 테스트도 1벌로 통합한다 — 거부 목록은 두 판의 합집합(
intent:·tel:포함)을 기준으로.MemorialVideoLauncherTest·ReceivedMemorialVideoLauncherTest는 제거한다. - 안내 콜백 계약은 PR fix(receiver): 수신 추억 노트 상세 영상 실행에 http/https 스킴 가드 이식 (#1394) #1395 에서 이미 확정된
onRejected/onUnavailable2콜백을 그대로 쓴다. 승격과 함께 작성자 호출처도 두 갈래로 갈라 거짓 안내를 없애고, 작성자 쪽 문구 리소스도 URL 불합격용 1건을 추가한다(현재feature_afternote_memorial_video_no_app하나뿐).
자식 이슈
No response
참고
- 착수 시점 — PR fix(afternote): 추억 노트 상세 기본 상호작용 보완 (#463) #1336 은 2026-08-29 11:54Z 머지 완료. 남은 선행은 PR fix(receiver): 수신 추억 노트 상세 영상 실행에 http/https 스킴 가드 이식 (#1394) #1395 뿐이다. 미머지 상태에서 승격하면 두 PR 을 스택으로 엮어야 하고, merge ref 재귀·base 수정 불가 비용이 중복보다 크다.
- refactor(receiver): android.widget.Toast 잔여 3건 제거 — 서버 실패 2건은 #446 체계 합류, 영상 앱 없음 안내는 Snackbar·리소스화 #1391 과의 순서 제약은 사라졌다. 승격본 시그니처는 PR fix(receiver): 수신 추억 노트 상세 영상 실행에 http/https 스킴 가드 이식 (#1394) #1395 가 확정했다. refactor(receiver): android.widget.Toast 잔여 3건 제거 — 서버 실패 2건은 #446 체계 합류, 영상 앱 없음 안내는 Snackbar·리소스화 #1391 에 남은 건 표출 채널(Snackbar)·리소스화·Compose 테스트라 이 승격과 독립이다.
- 이 승격은 원래 fix(receiver): 수신 추억 노트 상세가 영상 URL 을 스킴 검증 없이 ACTION_VIEW 로 실행 — 발신자발 위험 스킴이 수신자 기기에서 발화 #1394 참고란에서 «공유 승격 여부는 refactor(receiver): android.widget.Toast 잔여 3건 제거 — 서버 실패 2건은 #446 체계 합류, 영상 앱 없음 안내는 Snackbar·리소스화 #1391 건 3 의 “로직 공유도 검토” 갈래에서» 로 위임돼 있었다. 그런데 refactor(receiver): android.widget.Toast 잔여 3건 제거 — 서버 실패 2건은 #446 체계 합류, 영상 앱 없음 안내는 Snackbar·리소스화 #1391 은 Toast 제거(refactor) 이슈라 완료 조건에 승격이 없어 실행 주체가 없는 상태였다. 추적 주체를 이 이슈로 옮긴다.
Activity
test(afternote): 추모 영상 가드 거부 목록에 intent·tel 스킴 2건 추가 (#463)
docs(receiver): 가드 공유 승격 포인터를 #1436 으로 정정 (#1394)
fix(receiver): 영상 실행 안내를 URL 불합격과 실행 거부로 가른다
Merge branch 'develop' into refactor/1079-afternote-resource-prefix
Merge branch 'develop' into refactor/1514-author-route-relocation