Skip to content

refactor(core): 추모 영상 실행 가드를 core:common 한 벌로 승격한다 (#1436) - #1522

Merged
OnlyReadOneBook merged 2 commits into
developfrom
refactor/1436-memorial-video-launcher
Aug 30, 2026
Merged

OnlyReadOneBook merged 2 commits into
developfrom
refactor/1436-memorial-video-launcher

Conversation

@OnlyReadOneBook

@OnlyReadOneBook OnlyReadOneBook commented Aug 29, 2026 •

Copy link
Copy Markdown
Collaborator

Closes #1436

추모 영상 URL 을 외부 앱으로 여는 실행 가드가 작성자·수신자 2벌로 있었다. 이건 스타일 중복이 아니라 보안 가드다 — 허용 스킴(http/https)·host 검증 규칙이 두 곳에 흩어져 있으면 한쪽만 고칠 때 다른 쪽이 뚫린다.

그리고 이미 갈라져 있었다. PR #1395 가 수신자 판의 안내 콜백을 원인별로 나눴는데(onRejected = URL 불합격 / onUnavailable = 실행 거부) 작성자 판은 단일 콜백이라, URL 이 막힌 경우에도 「영상을 재생할 수 있는 앱이 없습니다」라는 거짓 안내가 develop 에 남아 있었다.

무엇을 했나

core:common 에 한 벌(media/MemorialVideoLauncher.kt)을 세우고 두 정의를 지웠다. 이 함수는 Compose 비의존이고 Intent/Uri 만 쓰며, 두 소비처가 이미 projects.core.common 에 의존한다.

  • 계약은 fix(receiver): 수신 추억 노트 상세 영상 실행에 http/https 스킴 가드 이식 (#1394) #1395 가 확정한 2콜백을 그대로 쓴다.
  • 작성자 호출처도 두 갈래로 갈랐다 — 거짓 안내 제거. URL 불합격용 문구 리소스 feature_afternote_memorial_video_invalid_url 를 1건 추가했다(문구는 수신자 쪽과 같은 「영상 주소가 올바르지 않아 재생할 수 없습니다.」).
  • 테스트를 1벌로 합쳤다. 거부 목록은 두 판의 합집합이다 — 승격 전에는 목록이 갈릴 수 있어, 한쪽에만 있는 스킴(intent:·tel:)이 다른 쪽에서 회귀해도 아무도 몰랐다. MemorialVideoLauncherTest·ReceivedMemorialVideoLauncherTest 는 제거했다.

core:common 에 robolectric 을 testImplementation 으로 더했다 — URL 검증이 android.net.Uri 파싱에 기대기 때문이다. 매니페스트는 읽지 않으므로 isIncludeAndroidResources 는 켜지 않았다(#369 에서 켰다가 targetSdk 로 기동이 깨진 전례가 있다).

검증

  • :core:common:compileDebugKotlin → BUILD SUCCESSFUL
  • :core:common:testDebugUnitTest --tests '*MemorialVideoLauncherTest*' → 3 tests / 0 failures (허용 2건 실행 · 거부 8건 · 실행 거부 3종)
  • :feature:afternote:presentation:compileDebugKotlin · compileDebugUnitTestKotlin → BUILD SUCCESSFUL
  • :feature:afternote:presentation:testDebugUnitTest → 171 tests / 0 failures (기존 회귀 없음)
  • :core:common:ktlintCheck · :feature:afternote:presentation:ktlintCheck → BUILD SUCCESSFUL

리뷰어에게

CI Test Plan

{
  "androidTest": {
    "mode": "selected",
    "reason": "author/navigation 아래 파일을 고쳐 규칙상 selected 가 필요하다. 이 PR 이 실제로 건드리는 화면은 추모 영상 상세이므로 그 라우팅을 실기기에서 확인하는 계측 테스트를 고른다. androidTest 소스는 건드리지 않았다.",
    "tests": [
      {
        "path": "app/src/androidTest/java/com/afternote/afternote_fe/AppAndReceiverCompletionAndroidTest.kt",
        "selector": "com.afternote.afternote_fe.ReceiverRuntimeCompletionAndroidTest#receivedMemorialDetail_routesPlaylistContractAndForwardsExactId",
        "device": "api30"
      }
    ]
  }
}

추모 영상 URL 을 외부 앱으로 여는 실행 가드가 작성자·수신자 2벌로 있었다. 도입 당시엔
본문 37줄이 문자 단위로 같았고, 이건 스타일 중복이 아니라 보안 가드다 — 허용 스킴·host
검증 규칙이 두 곳에 흩어져 있으면 한쪽만 고칠 때 다른 쪽이 뚫린다.

그리고 이미 갈라져 있었다. PR #1395 가 수신자 판의 안내 콜백을 원인별로 나눴는데
(onRejected = URL 불합격 / onUnavailable = 실행 거부) 작성자 판은 단일 콜백이라,
URL 이 막힌 경우에도 «재생할 앱이 없습니다» 라는 거짓 안내가 develop 에 남아 있었다.

core:common 에 한 벌을 세우고 두 정의를 지운다. Compose 비의존이고 Intent·Uri 만 쓰며
두 소비처가 이미 core:common 에 의존한다. 계약은 #1395 가 확정한 2콜백을 그대로 쓰고,
승격과 함께 작성자 호출처도 두 갈래로 갈라 거짓 안내를 없앤다 — URL 불합격용 문구
리소스를 1건 추가했다.

테스트도 1벌로 합친다. 거부 목록은 두 판의 합집합이다. 승격 전에는 목록이 갈릴 수 있어
한쪽에만 있는 스킴이 다른 쪽에서 회귀해도 아무도 몰랐다.

core:common 에 robolectric 을 testImplementation 으로 더한다 — URL 검증이 Uri 파싱에
기대기 때문이다. 매니페스트는 읽지 않으므로 isIncludeAndroidResources 는 켜지 않는다.
@github-actions github-actions Bot added the android-test PR head에서 Android Managed Device 계측 테스트 실행 label Aug 29, 2026
@github-actions github-actions Bot added the conflict base 와 충돌 — CI 가 트리거되지 않는다. base 를 병합하면 자동으로 떨어진다 label Aug 30, 2026
@github-actions

Copy link
Copy Markdown
Contributor

이 PR 은 develop 와 충돌 상태이고, 그래서 CI 가 돌지 않는다.

pull_request 워크플로는 base 와 head 를 합친 가상 머지 커밋(refs/pull/<N>/merge)에서
실행되는데, 충돌이면 GitHub 이 그 ref 를 만들지 못해 워크플로가 트리거조차 되지 않는다.
체크가 실패하는 것이 아니라 아예 생성되지 않으므로, 새 커밋을 올려도 no checks reported
인 채 최신 커밋이 한 번도 검증되지 않은 상태로 남는다 (#1028).

develop 를 병합해 충돌을 풀면 검증이 다시 돈다. 해소되면 이 라벨은 자동으로 떨어진다.

…rial-video-launcher

수신자 상세는 develop 에서 #1391 이 스낵바 위임 구조로 바꾸면서 `launchReceivedMemorialVideo`
라는 세 번째 복제본을 만들어 뒀다(그 KDoc 이 «승격 시 작성자 판도 같이 갈아야 한다» 고
예고해 둔 그것이다). 이 PR 의 목적이 그 한 벌 통합이므로 병합 쪽 콜백 위임 구조는 그대로 두고
호출 대상만 `core:common` 승격본으로 맞췄다.

- `.clickable { onVideoClick(url) }` 위임은 develop 판 유지
- `rememberReceivedMemorialVideoClickHandler` 가 `launchMemorialVideo` 를 부른다
- 복제본과 그 전용 테스트는 걷는다 — core:common 판이 같은 3케이스를 이미 덮는다
@github-actions github-actions Bot removed the conflict base 와 충돌 — CI 가 트리거되지 않는다. base 를 병합하면 자동으로 떨어진다 label Aug 30, 2026
@OnlyReadOneBook
OnlyReadOneBook added this pull request to the merge queue Aug 30, 2026
Merged via the queue into develop with commit 7c39e63 Aug 30, 2026
22 checks passed
@OnlyReadOneBook
OnlyReadOneBook deleted the refactor/1436-memorial-video-launcher branch August 30, 2026 04:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

android-test PR head에서 Android Managed Device 계측 테스트 실행

Projects

None yet

Development

Successfully merging this pull request may close these issues.

refactor(core): 추모 영상 실행 가드가 발신자·수신자 2벌 — 37줄 문자 단위 동일본을 core:common 으로 승격

2 participants