Repository navigation
refactor(receiver): android.widget.Toast 잔여 3건 제거 — 서버 실패 2건은 #446 체계 합류, 영상 앱 없음 안내는 Snackbar·리소스화 #1391
Description
작업 유형
refactor — 동작 변경 없는 구조·책임·경계 개선
주 담당 모듈
receiver — 수신자 관리
개요
android.widget.Toast 실사용이 레포에 3건 남아 있고 전부 receiver 모듈이다 (PR #1336 이 afternote 쪽 1건을 Snackbar 로 전환한 뒤 기준, 나머지 파일의 "Toast" 는 주석·커스텀 컴포저블 이름뿐).
Toast 는 시스템 UI 라 앱 테마·시안을 안 타고, Compose semantics 에 안 잡혀 어떤 테스트로도 단언할 수 없으며, TalkBack 노출도 짧다. #664 가 이미 "repo convention = Snackbar" 로 판단한 전례가 있고, #446 으로 서버 작업 실패의 확정 표시 방식(모달 팝업 4종)까지 나온 지금은 Toast 가 설 자리가 없다. 3건을 성격별로 갈라 제거한다.
건별 처분:
-
ReceiverHomeScreen.kt:173— 내려받기 실패(ReceiverDownloadState.Failed) Toast. 서버 작업 실패라 정본은 공통 오류 안내의 상황별 문구·액션·적용 범위를 PM에게 확인한다 #446 확정 체계(공통 에러 팝업)다. 공통 오류 안내의 상황별 문구·액션·적용 범위를 PM에게 확인한다 #446 의 현황 표가 인라인·스낵바만 조사해 Toast 사용처는 누락돼 있으므로 이 건을 공통 오류 안내의 상황별 문구·액션·적용 범위를 PM에게 확인한다 #446 정렬 범위에 합류시킨다. 공통 팝업 컴포넌트가 나오기 전이라면 fix(afternote): 수신 애프터노트 상세 조회 실패를 '준비 중'으로 오표시 — 재시도 불가 #713 전례처럼 잠정 Snackbar 로 먼저 전환해도 된다(어느 쪽이든 Toast 는 제거).- 진행 중 — PR refactor(receiver): 수신자 홈 내려받기 실패 Toast 를 Snackbar 로 전환 (#1391) #1412 가 잠정 Snackbar 로 전환한다(fix(afternote): 수신 애프터노트 상세 조회 실패를 '준비 중'으로 오표시 — 재시도 불가 #713 전례, 공통 오류 안내의 상황별 문구·액션·적용 범위를 PM에게 확인한다 #446 에 처분 기록됨).
-
ReceiverAfternoteScreen.kt:66— 모든 기록 내려받기 실패 Toast. 처분은 건 1 과 동일.- 처분 변경 — 이 화면이 도달 불가임이 확인돼(수신자 summary 패키지 8파일이 도달 불가 — afternotelist 가 대체, 내려받기 전용 화면은 시안 대조 후 판정 #1424) PR refactor(receiver): 도달 불가한 summary 패키지 8파일 제거 — home 이 대체한 옛 수신자 홈 (#1424) #1430 이
summary패키지를 파일째 삭제한다. Snackbar 로 바꿀 대상이 아니라 지울 대상이었고, 삭제로import android.widget.Toast는 동일하게 사라진다.
- 처분 변경 — 이 화면이 도달 불가임이 확인돼(수신자 summary 패키지 8파일이 도달 불가 — afternotelist 가 대체, 내려받기 전용 화면은 시안 대조 후 판정 #1424) PR refactor(receiver): 도달 불가한 summary 패키지 8파일 제거 — home 이 대체한 옛 수신자 홈 (#1424) #1430 이
-
MemorialReceivedDetailScreen의ReceiverVideoSection— 영상 실행 안내 Toast. 서버 실패가 아닌 로컬 환경 안내라 공통 오류 안내의 상황별 문구·액션·적용 범위를 PM에게 확인한다 #446 팝업 4종 어디에도 안 들어가고(재시도 무의미), Snackbar 가 맞다.2026-08-29 갱신 — PR fix(receiver): 수신 추억 노트 상세 영상 실행에 http/https 스킴 가드 이식 (#1394) #1395 머지 후 기준. 이 건이 원래 안고 있던
PackageManager.resolveActivity사전 조회 갈래(Android 11+ 패키지 가시성 오탐)는 fix(receiver): 수신 추억 노트 상세가 영상 URL 을 스킴 검증 없이 ACTION_VIEW 로 실행 — 발신자발 위험 스킴이 수신자 기기에서 발화 #1394 범위에서 PR fix(receiver): 수신 추억 노트 상세 영상 실행에 http/https 스킴 가드 이식 (#1394) #1395 가 이미 «직접 시도 후 예외 처리»로 정합화했다. 옛 라인 번호:185도 그 PR 로 무효다. 이 이슈에 남은 몫은 아래 셋이다.-
채널 — fix(receiver): 수신 추억 노트 상세 영상 실행에 http/https 스킴 가드 이식 (#1394) #1395 가 신설한
launchReceivedMemorialVideo의 안내 콜백 2개가 아직 Toast 를 띄운다. 둘 다 Snackbar 로 전환한다. -
문구가 성격이 다른 두 원인을 한 문장으로 덮는다— 해소됨 (2026-08-29, PR fix(receiver): 수신 추억 노트 상세 영상 실행에 http/https 스킴 가드 이식 (#1394) #1395) — 그 콜백에는 두 갈래가 함께 도달했다:- URL 불합격 (
uri == null: 공백·http/https아닌 스킴·host 없음) — fix(receiver): 수신 추억 노트 상세 영상 실행에 http/https 스킴 가드 이식 (#1394) #1395 의 보안 가드가 실행 자체를 거부한 경우 - 실행 거부 (
ActivityNotFoundException·SecurityException·IllegalArgumentException) — 재생할 앱이 실제로 없거나 OS 가 막은 경우
단일 문구
"영상을 재생할 수 있는 앱이 없습니다."는 앞 갈래에 거짓이었다(앱 유무와 무관하게 URL 이 막힌 것). 채널만 바꾸고 리소스화하면 거짓 안내가 리소스로 굳으므로, 거짓 갈래를 만든 fix(receiver): 수신 추억 노트 상세 영상 실행에 http/https 스킴 가드 이식 (#1394) #1395 가 같은 PR 에서 콜백을onRejected(URL 불합격) /onUnavailable(실행 거부) 로 갈라 문구를 둘로 나눴다. 현행 문구는 각각"영상 주소가 올바르지 않아 재생할 수 없습니다."/"영상을 재생할 수 있는 앱이 없습니다."(둘 다 하드코딩). 이 이슈에 남은 건 채널·리소스화·테스트뿐이며, 갈래 비혼입은ReceivedMemorialVideoLauncherTest가 교차 0건으로 단언한다. - URL 불합격 (
-
리소스화 — 두 문구 모두 하드코딩을 제거한다. 작성자 쪽
feature_afternote_memorial_video_no_app은 갈래가 하나뿐이라 그대로 못 쓴다. 단 모듈 표기 정정 — 이 화면은feature/receiver/presentation이 아니라feature/afternote/presentation소속이고(…presentation.receiver.detail패키지,R도com.afternote.feature.afternote.presentation.R), 그 모듈에resourcePrefix설정은 없다. 같은 모듈에receiver_접두어 관례(receiver_ic_play_arrow등)를 따라 추가한다.
-
완료 조건:
import android.widget.Toast가 main 소스에서 0건.- 건 3 의 안내가 Snackbar 로 표출되고(문구 분기는 PR fix(receiver): 수신 추억 노트 상세 영상 실행에 http/https 스킴 가드 이식 (#1394) #1395 로 이미 확보), 두 문구 모두
receiver_접두어 리소스로 추출되고, 각 갈래의 표출을 Compose 테스트로 단언한다. - 건 1·2 는 공통 오류 안내의 상황별 문구·액션·적용 범위를 PM에게 확인한다 #446 체계(또는 잠정 Snackbar)로 전환되거나 삭제로 해소되고, 처분이 공통 오류 안내의 상황별 문구·액션·적용 범위를 PM에게 확인한다 #446 에 기록된다.
자식 이슈
No response
참고
- 공통 오류 안내의 상황별 문구·액션·적용 범위를 PM에게 확인한다 #446 — 실패 안내 표시 방식 통일(확정 시안: 공통 에러 팝업 4종). 이 이슈의 건 1·2 는 그 정렬 범위의 누락분이다.
- fix(app): 수신자 홈 내려받기 실패 Toast 가 서버 원문(e.message)을 그대로 노출 — 일반 문구 치환 #652 — 건 1 의 Toast 문구만 서버 원문→일반 문구로 고치고 채널(Toast)은 유지했던 건.
- fix(afternote): 곡 검색 실패 스낵바가 예외 원문을 그대로 노출 — 서버 5xx 본문·역직렬화 메시지 유출 #664 — AddSongScreen 안내에서 Snackbar 를 repo convention 으로 채택한 전례 (
AddSongScreen.kt:33주석). - PR fix(afternote): 추억 노트 상세 기본 상호작용 보완 (#463) #1336 — 작성자 쪽 추억 노트 상세의 같은 안내를 Toast 없이 Snackbar 로 구현(삭제 실패 채널과 통일).
- fix(receiver): 수신 추억 노트 상세가 영상 URL 을 스킴 검증 없이 ACTION_VIEW 로 실행 — 발신자발 위험 스킴이 수신자 기기에서 발화 #1394 / PR fix(receiver): 수신 추억 노트 상세 영상 실행에 http/https 스킴 가드 이식 (#1394) #1395 — 건 3 과 같은 파일의 영상 실행 경로에 보안 가드를 이식한다. 건 3 은 파일 충돌을 피해 그 머지 뒤에 착수한다. 위 갱신 블록이 그 결과를 반영한 것이다. 2026-08-29 추가 — 그 PR 이 만든 거짓 안내 갈래는 그 PR 이 문구 분기로 닫았고, 이 이슈 몫은 채널·리소스화·테스트로 줄었다.
- PR refactor(receiver): 수신자 홈 내려받기 실패 Toast 를 Snackbar 로 전환 (#1391) #1412 — 건 1 실행분. 건 3 이 남아 있어
Closes가 아니라Refs로 걸려 있다(이 이슈는 건 3 때문에 열려 있다). - 수신자 summary 패키지 8파일이 도달 불가 — afternotelist 가 대체, 내려받기 전용 화면은 시안 대조 후 판정 #1424 / PR refactor(receiver): 도달 불가한 summary 패키지 8파일 제거 — home 이 대체한 옛 수신자 홈 (#1424) #1430 — 건 2 의 화면을 도달 불가로 판정해 삭제한다.
- refactor(core): 추모 영상 실행 가드가 발신자·수신자 2벌 — 37줄 문자 단위 동일본을 core:common 으로 승격 #1436 — «같은 화면의 쌍둥이 구현이라 로직 공유도 검토» 갈래의 이관처.
launchMemorialVideo(fix(afternote): 추억 노트 상세 기본 상호작용 보완 (#463) #1336)와launchReceivedMemorialVideo(fix(receiver): 수신 추억 노트 상세 영상 실행에 http/https 스킴 가드 이식 (#1394) #1395)가 37줄 문자 단위로 동일해core:common승격이 필요하지만, 그건 이 이슈(Toast 제거)의 완료 조건이 아니라 별건이다. 콜백 분리는 PR fix(receiver): 수신 추억 노트 상세 영상 실행에 http/https 스킴 가드 이식 (#1394) #1395 에서 이미 확정됐으므로(onRejected/onUnavailable) 승격본의 계약도 거기서 정해졌다 — 이 이슈와 refactor(core): 추모 영상 실행 가드가 발신자·수신자 2벌 — 37줄 문자 단위 동일본을 core:common 으로 승격 #1436 사이의 순서 제약은 사라졌다. - 부수:
AfternoteNavActions.kt:38의 "NavActions 를 통해 Toast 표시를 위임" 주석은 스테일 — 실구현(AppNavigationActions.onFingerprintAuthFailed)은 state 설정으로 바뀐 지 오래다. 이 이슈에서 주석만 정리해도 된다. - 모듈 경계: 3건 모두 receiver 모듈이라 담당자 몫이다. 이 이슈는 추적용이며 타 모듈 코드 0줄 원칙을 따른다.
Activity
OnlyReadOneBook commentedon Aug 28, 2026
건 3 관련 — #1394 / PR #1395 가 같은 지점(
MemorialReceivedDetailScreen영상 클릭)을 보안 가드(스킴 검증) 목적으로 먼저 만졌다. 건 3 에 적힌 «resolveActivity사전 조회 → 직접 시도 후 예외 처리 정합화»는 그 PR 이 선반영했고, Toast→Snackbar 전환·문구 리소스화·표출 Compose 테스트는 그대로 이 이슈 몫으로 남아 있다 (안내 채널·문구 현행 유지). 착수 시 develop 의launchReceivedMemorialVideo기준으로 보면 된다 — «로직 공유도 검토» 갈래에는 작성자 판(PR #1336launchMemorialVideo)과 수신자 판이 이제 실제로 두 벌 있다.refactor(receiver): 내려받기 실패 Toast 2건을 잠정 Snackbar 로 전환한다
docs(receiver): 가드 공유 승격 포인터를 #1436 으로 정정 (#1394)
refactor(receiver): 내려받기 실패 Toast 2건을 잠정 Snackbar 로 전환한다
Merge pull request #1412 from Afternote/refactor/1391-receiver-toast-…
fix(receiver): 영상 실행 안내를 URL 불합격과 실행 거부로 가른다
Merge branch 'develop' into refactor/1469-content-description-resources
Merge remote-tracking branch 'origin/develop' into refactor/1436-memo…