Skip to content

[design] #108 아이콘 리소스 변경 및 포즈 필터바 공용 컴포넌트 분리#112

Merged
ikseong00 merged 7 commits into
developfrom
design/#108-icon-change-2
Feb 15, 2026
Merged

[design] #108 아이콘 리소스 변경 및 포즈 필터바 공용 컴포넌트 분리#112
ikseong00 merged 7 commits into
developfrom
design/#108-icon-change-2

Conversation

@ikseong00
Copy link
Copy Markdown
Contributor

@ikseong00 ikseong00 commented Feb 14, 2026

🔗 관련 이슈

📙 작업 설명

  • Arrow, Close, Bell, Download, Trash 등 아이콘 리소스 수정
  • 아이콘 리소스 이름 변경 (icon_heart_stroke → icon_heart_stroked, icon_plus_primary → icon_plus, icon_repeat_recommendation → icon_repeat, icon_scrap → icon_scrap_filled/icon_scrap_stroked 등)
  • 아이콘 리소스 신규 추가 (icon_down, icon_heart_filled, icon_torch_on, icon_torch_off 등)
  • 포즈 화면 FilterBarcore/ui의 공용 FilterBar 컴포넌트를 사용하도록 리팩토링
  • 변경된 아이콘 리소스명에 맞게 참조 코드 일괄 수정

💬 추가 설명 or 리뷰 포인트 (선택)

  • 기능 동작 및 UI는 동일하기 때문에 별도 스크린샷 및 녹화 첨부하지 않았습니다.

Summary by CodeRabbit

  • 새로운 기능

    • 손전등 토글(켜짐/꺼짐에 따른 아이콘 분기) 추가
    • 반복 아이콘 추가
  • UI 개선

    • 즐겨찾기 하트 아이콘을 채워진 버전으로 통일
    • 스크랩 아이콘에 채워진/테두리 버전 추가 및 상태별 색상 적용
    • 여러 액션 아이콘의 형태·크기·색상 일관성 개선
  • 구성 변경

    • 기존 FilterBar 제거 및 대체 컴포넌트로 재구성
  • 자산 정리

    • 일부 아이콘 리소스 삭제 및 교체 (QR, 추천 리피트 등)

포즈 추천 화면에서 사용되던 `FilterBar`를 앱 전반에서 재사용할 수 있는 공용 `core:ui` 컴포넌트로 분리했습니다. 이에 따라 기존 `feature:pose` 모듈 내의 `FilterBar.kt`는 삭제되었고, 이를 대체하는 `PoseFilterBar.kt`를 추가하여 공용 `FilterBar`를 사용하도록 구조를 변경했습니다.
## 주요 변경 사항

- **아이콘 리소스 교체 및 정리:**
    - 기존에 사용되던 `icon_heart_stroke`, `icon_scrap` 등 일부 아이콘을 삭제했습니다.
    - `filled`(채워진)와 `stroked`(선) 스타일을 명확하게 구분하는 새로운 아이콘 리소스를 추가하고, 이를 각 기능에 적용했습니다.
        - `icon_heart_filled`, `icon_heart_stroked`
        - `icon_scrap_filled`, `icon_scrap_stroked`
        - `icon_torch_on`, `icon_torch_off`
- **아이콘 이름 변경:**
    - `icon_plus_primary.xml` -> `icon_plus.xml`
    - `icon_repeat_recommendation.xml` -> `icon_repeat.xml`
- **아이콘 벡터 데이터 업데이트:**
    - `icon_download.xml`, `icon_trash.xml` 등의 벡터 드로어블 코드를 stroke 기반으로 수정하여 명확성을 높였습니다.
- **UI 컴포넌트 수정:**
    - 아이콘 변경에 따라 관련 UI 컴포넌트(`ArchiveMainTopBar`, `RandomPoseFloatingBar`, `PhotoDetailActionBar` 등)의 아이콘 리소스 경로와 `tint` 속성을 업데이트했습니다.
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Feb 14, 2026

Walkthrough

디자인 시스템 벡터 아이콘 다수(채움→획 변환, 기하 업데이트), 일부 아이콘 추가/삭제, Compose UI에서 아이콘 리소스·크기·색상 변경, FilterBar 삭제 및 PoseFilterBar 추가, PoseDetail에서 스크랩 변경 결과 발행 및 LocalResultEventBus 시그니처 변경이 포함됩니다.

Changes

Cohort / File(s) Summary
아이콘 — 획/기하 업데이트
core/designsystem/src/main/res/drawable/icon_arrow_down.xml, .../icon_arrow_left.xml, .../icon_arrow_right.xml, .../icon_arrow_top_right.xml, .../icon_bell.xml, .../icon_close.xml, .../icon_download.xml, .../icon_plus.xml, .../icon_trash.xml
여러 벡터에서 채움(filled) 경로를 획(stroke) 기반으로 변경하거나 pathData 조정. strokeWidth/strokeColor/strokeLineCap 등 속성 추가 및 fill 투명 처리/제거.
하트 아이콘 변형
core/designsystem/src/main/res/drawable/icon_heart_filled.xml, .../icon_heart_stroked.xml, .../icon_heart_stroke.xml
icon_heart_stroke.xml 삭제, icon_heart_filled.xml·icon_heart_stroked.xml 추가 — 채움/획 버전으로 대체.
스크랩 아이콘 재구성
core/designsystem/src/main/res/drawable/icon_scrap.xml, .../icon_scrap_unselected.xml, .../icon_scrap_filled.xml, .../icon_scrap_stroked.xml
기존 icon_scrap* 일부 삭제 및 상태별(_filled/_stroked) 새 리소스 추가로 상태 표현 변경.
반복/QR/토치 아이콘
core/designsystem/src/main/res/drawable/icon_repeat.xml, .../icon_repeat_recommendation.xml, .../icon_qr_light.xml, .../icon_torch_on.xml, .../icon_torch_off.xml
icon_repeat.xml·토치 온/오프 추가, icon_repeat_recommendation.xml·icon_qr_light.xml 삭제. QR 스캐너에서 토치 아이콘 사용으로 교체.
Compose UI — 리소스 교체 및 스타일 조정
core/ui/src/main/java/.../AlbumRowComponent.kt, feature/.../SelectablePhotoItem.kt, .../ArchiveMain*.kt, .../ArchiveMainPhotoItem.kt, PhotoDetailActionBar.kt, QRScannerContent.kt, RecommendationChip.kt, RandomPoseFloatingBar.kt
여러 컴포저블에서 icon_hearticon_heart_filled, 스크랩/토치/반복 아이콘 참조 변경. 일부 아이콘에 Modifier.size(...) 추가 및 tint 색상/크기 조정.
FilterBar 리팩토링
feature/pose/impl/src/main/java/.../FilterBar.kt (삭제), .../PoseFilterBar.kt (추가), PoseScreen.kt
기존 FilterBar 파일 삭제 및 새 PoseFilterBar 추가. PoseScreen에서 호출을 PoseFilterBar로 교체 (인자/동작 유지).
PoseDetail 및 결과 발행 변경
feature/pose/impl/src/main/java/.../PoseDetailScreen.kt, core/navigation/result/LocalResultEventBus
PoseDetailRoute에 NotifyScrapChanged 사이드이펙트 처리 추가. LocalResultEventBus.sendResult 시그니처가 sendResult(result: PoseResult, allowDuplicate: Boolean)로 변경됨.
리소스 추가/삭제 요약
core/designsystem/src/main/res/drawable/*
다수의 drawable 파일이 추가되거나 삭제됨(하트/스크랩/반복/토치/QR 등). 삭제된 리소스의 남은 참조 여부 확인 필요.

Sequence Diagram(s)

mermaid
sequenceDiagram
participant User as "사용자"
participant PoseScreen as "PoseDetailScreen"
participant PoseRoute as "PoseDetailRoute"
participant ResultBus as "LocalResultEventBus"
participant Consumer as "Result Consumer"
User->>PoseScreen: 스크랩 토글
PoseScreen->>PoseRoute: 사이드이펙트 발생 (NotifyScrapChanged)
PoseRoute->>ResultBus: sendResult(PoseResult, allowDuplicate=false)
ResultBus->>Consumer: 결과 발행 (ScrapChanged)

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Poem

🐰 퐁당퐁당, 아이콘이 깡충 뛰네,
획은 반짝, 하트는 채워져 반짝,
필터는 갈아입고 토치는 깜박,
작은 리소스들 모여 새 얼굴로 도약!

🚥 Pre-merge checks | ✅ 2 | ❌ 2
❌ Failed checks (2 warnings)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Merge Conflict Detection ⚠️ Warning ⚠️ Unable to check for merge conflicts: Invalid branch name format
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed 제목은 아이콘 리소스 변경과 포즈 필터바 공용 컴포넌트 분리라는 PR의 핵심 변경사항을 명확하게 요약하고 있습니다.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch design/#108-icon-change-2
⚔️ Resolve merge conflicts (beta)
  • Auto-commit resolved conflicts to branch design/#108-icon-change-2
  • Create stacked PR with resolved conflicts
  • Post resolved changes as copyable diffs in a comment

No actionable comments were generated in the recent review. 🎉


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@core/designsystem/src/main/res/drawable/icon_torch_on.xml`:
- Around line 1-15: Summary: The diagonal strike path
(android:pathData="M6.47,6.47L21.53,21.531") is currently in icon_torch_on.xml
while the non-struck version is in icon_torch_off.xml, so names and contents are
reversed. Fix: open icon_torch_on.xml and icon_torch_off.xml, and either swap
the file contents or move the diagonal strike <path> (the path with
android:pathData="M6.47,6.47L21.53,21.531") into icon_torch_off.xml and remove
it from icon_torch_on.xml so the "off" file contains the strike-through path and
"on" contains only the torch shape (the large path with android:pathData
starting "M11.648,25.213..."), then run a quick visual check in the app to
confirm icon semantics match filenames.
🧹 Nitpick comments (4)
core/designsystem/src/main/res/drawable/icon_bell.xml (1)

6-8: fillColor가 하드코딩되어 있어 테마 대응이 어려울 수 있습니다.

이 아이콘은 fillColor="#74788B"가 직접 지정되어 있고, ArchiveMainTopBar.kt에서 tint = Color.Unspecified로 사용됩니다. 반면 다른 아이콘들(icon_heart_filled, icon_torch_off 등)은 #ffffff로 설정하고 Compose 측 tint로 색상을 제어하는 패턴을 따르고 있습니다.

다크 모드 등 테마 변경 시 이 아이콘만 색상이 고정되어 대응이 안 될 수 있으므로, 다른 아이콘과 동일하게 #ffffff 채우기 + Compose tint 제어 패턴으로 통일하는 것을 권장합니다.

♻️ 제안: drawable에서 흰색 채우기 사용 + Compose에서 tint 적용

icon_bell.xml:

-      android:fillColor="#74788B"/>
+      android:fillColor="#ffffff"/>

ArchiveMainTopBar.kt (Line 91):

-                        tint = Color.Unspecified,
+                        tint = NekiTheme.colorScheme.gray500, // 또는 적절한 테마 색상
feature/archive/impl/src/main/kotlin/com/neki/android/feature/archive/impl/main/component/ArchiveMainTopBar.kt (1)

88-92: Bell 아이콘의 tint = Color.Unspecified 사용이 테마 일관성을 깨뜨릴 수 있습니다.

같은 Row 내에서 플러스 아이콘은 NekiTheme.colorScheme.primary400 tint를 사용하지만, bell 아이콘은 Color.Unspecified로 drawable에 하드코딩된 #74788B 색상에 의존합니다. icon_bell.xml 리뷰에서 언급한 것과 같이, 테마 색상으로 통일하는 것을 권장합니다.

core/designsystem/src/main/res/drawable/icon_repeat.xml (1)

1-5: 캔버스 크기가 다른 아이콘들과 다릅니다.

이 PR의 다른 아이콘들은 28dp 캔버스를 사용하지만, icon_repeat.xml은 24dp입니다. 의도된 것이라면 무시해도 되지만, 디자인 시스템 일관성을 위해 확인해 주세요.

feature/pose/impl/src/main/java/com/neki/android/feature/pose/impl/main/component/PoseFilterBar.kt (1)

22-23: 하드코딩된 한국어 문자열에 대한 참고 사항.

"인원수""스크랩" 문자열이 하드코딩되어 있습니다. 현재 한국어 전용 앱이라면 문제없지만, 향후 다국어 지원 시 stringResource()를 사용하도록 변경이 필요합니다.

Comment thread core/designsystem/src/main/res/drawable/icon_torch_on.xml
Copy link
Copy Markdown
Member

@Ojongseok Ojongseok left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

음성으로 이야기했던 것 처럼 _filled / _stroke 형태로 suffix를 작성하기로 해 저는 _filled / _stroke로 진행을 했습니다. _filled와 반대되게 _stroked로 수정하는게 좋을까요?

Comment on lines +57 to +61
tint = if (isFavorite) {
NekiTheme.colorScheme.primary400
} else {
NekiTheme.colorScheme.gray700
},
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

tint의 경우 한줄로 나타내는게 어떨까요?
tint = if (isFavorite) NekiTheme.colorScheme.primary400 else NekiTheme.colorScheme.gray700,

Comment on lines 51 to 55
imageVector = if (isFavorite) {
ImageVector.vectorResource(R.drawable.icon_heart)
ImageVector.vectorResource(R.drawable.icon_heart_filled)
} else {
ImageVector.vectorResource(R.drawable.icon_heart_stroke)
ImageVector.vectorResource(R.drawable.icon_heart_stroked)
},
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

리소스 id만 분기해

imageVector = ImageVector.vectorResource(
    if (isFavorite) R.drawable.icon_heart_filled else R.drawable.icon_heart_stroked
),

라인을 줄일 수 있을 것 같은데 어떠신가요?

Comment on lines +98 to +103
if (uiState.pose.isScrapped) R.drawable.icon_scrap_filled
else R.drawable.icon_scrap_stroked,
),
contentDescription = null,
tint = NekiTheme.colorScheme.gray500,
tint = if (uiState.pose.isScrapped) NekiTheme.colorScheme.gray900
else NekiTheme.colorScheme.gray500,
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if else 절을 한 줄로 표기하는게 어떨까요?

Comment on lines +138 to +139
if (isScrapped) R.drawable.icon_scrap_filled
else R.drawable.icon_scrap_stroked,
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

여기도 한줄로 표기하는게 어떨까욥?

@ikseong00
Copy link
Copy Markdown
Contributor Author

음성으로 이야기했던 것 처럼 _filled / _stroke 형태로 suffix를 작성하기로 해 저는 _filled / _stroke로 진행을 했습니다. _filled와 반대되게 _stroked로 수정하는게 좋을까요?

엇 형용사로 stroked 로 이해했었습니다..!! ed 가 붙는 게 나을 것 같아여

if-else 한 줄 분기 관련

개인적이긴 한데 if else 라인을 한 줄로 줄여 코드를 줄이는 경우보단 개행하는 게 조금 더 좋더라구요, 엄청 짧은 라인이 아니면 거의 개행하는 편입니다..!
가로 스크롤을 지양하는 편이어서 가로로 엄청 길어져서 가로 스크롤이 되는 거를 피하려고 했었습니다. 리소스 특성 상 이름이 길기도 하구요.
통일하는 편이 나을까요??

@Ojongseok
Copy link
Copy Markdown
Member

엇 형용사로 stroked 로 이해했었습니다..!! ed 가 붙는 게 나을 것 같아여

넵, 그럼 stroke 형태의 icon의 경우 _stroked를 붙이도록 수정해서 PR을 다시 올리겠습니다-!

if-else 한 줄 분기 관련

흐음.. 정말 취향차이의 영역인 것 같군요..ㅎㅎ.. 리소스 특성 상 이름이 길기는 하나 저같은 경우에는 크게 중요하지 않은 구문이다 보니 가로스크롤이 들어가더라도 한줄로 작성하거나 길어지는 경우 아래와 같이 작성하는 편입니다.

if (uiState.pose.isScrapped) {
    R.drawable.icon_scrap_filled
} else R.drawable.icon_scrap_stroked,

클형에게 여쭈어보니

표현식이 길어지면 중괄호와 줄바꿈을 사용하고, vectorResource 내부는 값이 짧으니 중괄호 없이 두 줄로 작성하는 방식이 균형이 좋아 보입니다.
핵심은 프로젝트 내 일관성입니다. 같은 프로젝트 내에서 동일한 패턴을 유지하는 게 가장 중요합니다.

라는 답변을 받았습니다. 클형님의 말씀대로 익성님이 작성하신 방법처럼

if (isScrapped) R.drawable.icon_scrap_filled
else R.drawable.icon_scrap_stroked,

형태로 작성하시죠! ImageVector.vectorResource를 지정하는 경우 vectorResource() 내에서 id만 분기하는게 어떨까요?

@ikseong00
Copy link
Copy Markdown
Contributor Author

엇 형용사로 stroked 로 이해했었습니다..!! ed 가 붙는 게 나을 것 같아여

넵, 그럼 stroke 형태의 icon의 경우 _stroked를 붙이도록 수정해서 PR을 다시 올리겠습니다-!

if-else 한 줄 분기 관련

흐음.. 정말 취향차이의 영역인 것 같군요..ㅎㅎ.. 리소스 특성 상 이름이 길기는 하나 저같은 경우에는 크게 중요하지 않은 구문이다 보니 가로스크롤이 들어가더라도 한줄로 작성하거나 길어지는 경우 아래와 같이 작성하는 편입니다.

if (uiState.pose.isScrapped) {
    R.drawable.icon_scrap_filled
} else R.drawable.icon_scrap_stroked,

클형에게 여쭈어보니

표현식이 길어지면 중괄호와 줄바꿈을 사용하고, vectorResource 내부는 값이 짧으니 중괄호 없이 두 줄로 작성하는 방식이 균형이 좋아 보입니다.
핵심은 프로젝트 내 일관성입니다. 같은 프로젝트 내에서 동일한 패턴을 유지하는 게 가장 중요합니다.

라는 답변을 받았습니다. 클형님의 말씀대로 익성님이 작성하신 방법처럼

if (isScrapped) R.drawable.icon_scrap_filled
else R.drawable.icon_scrap_stroked,

형태로 작성하시죠! ImageVector.vectorResource를 지정하는 경우 vectorResource() 내에서 id만 분기하는게 어떨까요?

대 클 코

@ikseong00 ikseong00 merged commit c5c9d1c into develop Feb 15, 2026
2 checks passed
@ikseong00 ikseong00 deleted the design/#108-icon-change-2 branch February 25, 2026 15:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants