Skip to content

refactor(timeletter): core 자원과 렌더가 같은 벡터 사본 3개를 core:ui 로 수렴 (#635 인계) #2084

Open

Description

@OnlyReadOneBook

작업 유형

refactor — 동작 변경 없는 구조·책임·경계 개선

주 담당 모듈

timeletter — 타임레터

개요

#635 에 남아 있던 실제 변경면은 timeletter 벡터 사본 3개와 그 소비처 5곳뿐입니다. 전부 timeletter 모듈이라 validate-pr-module-owner.mjs 가 제 PR 을 막습니다. 그래서 범위를 통째로 넘깁니다.

기준 리비전은 origin/develop 7d87aa3f4 이고, 아래 값은 전부 그 리비전에서 다시 잰 것입니다.

대상

할 일 파일
삭제 feature/timeletter/presentation/src/main/res/drawable/ic_image.xml
삭제 feature/timeletter/presentation/src/main/res/drawable/ic_file.xml
삭제 feature/timeletter/presentation/src/main/res/drawable/default_profile.xml
치환 component/MediaBottomSheetContent.kt:44 R.drawable.ic_image → CoreUiR.drawable.core_ui_ic_image
치환 component/MediaBottomSheetContent.kt:56 R.drawable.ic_file → CoreUiR.drawable.core_ui_ic_file
치환 component/RecipientCard.kt:39 R.drawable.default_profile → CoreUiR.drawable.core_ui_ic_profile_placeholder
치환 component/RecipientListItem.kt:39 R.drawable.default_profile → CoreUiR.drawable.core_ui_ic_profile_placeholder
치환 screen/sender/TimeLetterWriteScreen.kt:567 iconRes = R.drawable.ic_file → CoreUiR.drawable.core_ui_ic_file

MediaBottomSheetContent 는 이미 import com.afternote.core.ui.R as CoreUiR 를 들고 있고 같은 함수의 :50(core_ui_ic_mic)·:62(core_ui_ic_link)가 그 별칭을 씁니다. TimeLetterWriteScreen 도 :559 에서 CoreUiR.drawable.core_ui_ic_mic 를 씁니다. 두 파일은 별칭 추가 없이 이름만 바뀝니다.

렌더가 같다는 근거

ic_image 와 ic_file 은 core_ui_ic_image.xml·core_ui_ic_file.xml 과 들여쓰기(2칸 대 4칸)만 빼고 전 속성이 같습니다. 24dp, viewport 24, pathData, strokeAlpha 0.6, strokeWidth 2, fillColor #00000000, strokeColor #000000, cap/join round 까지 같습니다.

default_profile 은 core_ui_ic_profile_placeholder 의 정확한 절반 축소본입니다. viewport 가 134×136 대 67×68 이고 좌표와 strokeWidth 가 전부 2배 관계입니다. 반올림 차이가 셋 있는데(53.843 대 53.845, 41.092 대 41.09, 23.504 대 23.505) 134 단위 viewport 에서 0.005 미만이라 픽셀로 드러나지 않습니다. 소비처 둘 다 size(67.dp)·size(50.dp) 로 크기를 명시하고 종횡비(67:68)가 같아서 확대 결과가 같습니다.

contentDescription 은 "기본 프로필"·"프로필 이미지" 그대로 둡니다. 이 이슈는 접근성 문구를 건드리지 않습니다.

core 쪽 작업은 없습니다

세 자원이 core/ui 에 이미 있고 core:ui 자신과 afternote·mindrecord·receiver 가 씁니다. 추가·수정할 core 파일이 없습니다.

완료 조건

  • 위 세 파일 삭제
  • 소비처 5곳이 CoreUiR 를 쓴다
  • feature/timeletter 에 R.drawable.ic_image·ic_file·default_profile 참조 0건
  • 렌더·접근성 문구가 그대로다. 스크린샷 골든 재생성은 필요 없다

자식 이슈

No response

참고

왜 인계인가

계획한 변경면 7개로 PR JSON 을 만들어 가드를 직접 돌린 결과입니다.

$ node .github/scripts/validate-pr-module-owner.mjs pr.json files.json
::error::PR #9999 작성자 @1hyok 가 담당하지 않는 모듈의 프로덕션 파일을 바꿨습니다.
  timeletter(담당 @koongmai) 7건: ...
EXIT=1

선례로 거론할 만한 7c1c9e9e1(#640, 2026-08-28, timeletter·mindrecord 의 mic 사본을 core 로 이관)은 가드 도입 커밋 969ecaad4(#1889, 2026-09-04)보다 앞섭니다. 그 커밋의 파일 목록을 지금 가드에 먹여도 exit 1 이고 timeletter 3건·mindrecord 1건을 지목합니다. 선례는 해도 된다는 근거가 아니라 가드가 없던 때라 통과했다는 근거입니다.

머지 순서

PR #1365(#714)가 RecipientCard.kt 와 TimeLetterWriteScreen.kt 를 이미 건드립니다. #1365 를 먼저 머지하고 이 정리를 그 위에 올려 주세요. 순서를 강제하려고 이 이슈에 blocked_by #714 를 걸어 뒀습니다. 반대로 하면 #1365 가 리베이스 충돌을 먹는데, 그쪽은 TimeletterScreenScreenshotTest 골든을 물고 있어 재생성이 두 번 돕니다. 이쪽은 렌더가 같아 골든에 영향이 없으니 뒤에 붙는 편이 쌉니다. 참고로 그 골든 4장은 TimeletterScreen(목록·블록·빈 상태)만 그리고 여기 나오는 자원 셋을 하나도 렌더하지 않습니다.

#1613 과 겹치는 부분

#1613(미디어 선택 시트를 core:ui 로 이관)이 먼저 들어오면 MediaBottomSheetContent.kt 가 통째로 사라지면서 소비처 2곳(:44·:56)이 자연히 없어집니다. 그래도 이 이슈가 비지는 않습니다. ic_file 은 TimeLetterWriteScreen.kt:567 의 MediaBlockChip 이 따로 쓰고 있어 참조 0건이 되지 않고, default_profile 은 #1613 범위 밖입니다. #1613 은 행 패딩·아이콘 tint 가 바뀌는 확정적 픽셀 변경이라 골든 재생성을 동반하는 반면 이쪽은 렌더 보존이라, 묶지 않고 따로 두는 편이 맞다고 봤습니다. 어느 쪽이 먼저 들어와도 나머지는 그대로 성립합니다.

core:ui 쪽 컴포넌트는 이미 develop 에 있습니다(core/ui/src/main/kotlin/com/afternote/core/ui/sheet/MediaSelectSheet.kt, PR #1605 로 머지). #1613 에 남은 것은 timeletter 호출부 치환입니다.

리소스 프리픽스보다 먼저입니다

docs/convention/resource-naming.md:27 의 timeletter_ 행이 #635 를 가리킵니다. 이 세 파일은 치환되면 삭제되어 리네임 대상에서 빠지므로 순서가 뒤집히면 헛일이 됩니다.

#635 의 0824 코멘트가 적어 둔 미준수 드로어블 13개는 지금 9개입니다(ic_mic 와 ic_align_* 3개가 그사이 정리됐습니다). 이 이슈가 3개를 지우면 프리픽스 대상은 6개(container·down_vector·ic_block·ic_list·ic_text·setting)로 줄어듭니다.

같은 코멘트가 ic_list 를 사본으로 셌는데 다시 재 보니 아닙니다. timeletter 판은 28dp viewport 28 의 스트로크 아이콘이고 core/ui/src/main/res/drawable/core_ui_list.xml 은 24dp viewport 24 의 Material 채움 아이콘이라 형태가 다릅니다. 통일하면 시각 변경이고, #635 본문이 뷰 전환 아이콘의 크기·tint 통일을 제외 범위로 못박아 두었습니다. 그래서 이 이슈에 넣지 않았습니다.

Metadata

Metadata

Assignees

Labels

area:timeletter타임레터 기능 영역refactor동작 변경 없이 코드 구조·책임·경계를 개선하는 작업

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions