feat(widget): 오디오 콘텐츠 태그 배지를 추가한다
This commit is contained in:
138
docs/prd/20260522_오디오콘텐츠위젯태그배지_prd.md
Normal file
138
docs/prd/20260522_오디오콘텐츠위젯태그배지_prd.md
Normal file
@@ -0,0 +1,138 @@
|
||||
# PRD: 오디오 콘텐츠 위젯 태그 배지
|
||||
|
||||
## 1. Overview
|
||||
Figma `20:3840`, `20:3843`, `20:3815`, `20:3814` 디자인을 기준으로 v2 패키지 아래에 생성된 신규 오디오 콘텐츠 위젯(`AudioContentCardView`, `view_audio_content_card.xml`)의 썸네일 영역에 콘텐츠 태그 배지를 표시한다.
|
||||
|
||||
---
|
||||
|
||||
## 2. Problem
|
||||
- 기존 `AudioContentCardView`는 썸네일, 제목, 크리에이터명만 제공해 콘텐츠의 구매/원작/선공개 속성을 카드에서 즉시 구분할 수 없다.
|
||||
- 기존 오디오 콘텐츠 카드 PRD에서는 태그 배지를 명시적으로 제외했으므로, 이번 추가 요구사항을 별도 문서로 확정해야 한다.
|
||||
- 태그별 위치와 표시 순서가 정해져 있어 호출부마다 임의 구현하면 Original/First, Point/Free 정렬이 달라질 수 있다.
|
||||
- Free 태그는 이미지 리소스가 아니라 다국어 문자열로 생성해야 하므로 string resource 기반 계약이 필요하다.
|
||||
|
||||
---
|
||||
|
||||
## 3. Goals
|
||||
- `AudioContentCardView` 썸네일 위에 Original, First, Point, Free 태그 배지를 표시할 수 있게 한다.
|
||||
- 대상 구현 파일은 v2 패키지 아래 신규 위젯으로 생성된 다음 파일로 한정한다.
|
||||
- `app/src/main/java/kr/co/vividnext/sodalive/v2/widget/AudioContentCardView.kt`
|
||||
- `app/src/main/res/layout/view_audio_content_card.xml`
|
||||
- 왼쪽 상단에는 Original, First를 표시하고, 둘 다 있으면 Original 다음 First 순서를 유지한다.
|
||||
- 왼쪽 하단에는 Point, Free를 표시한다.
|
||||
- Original, Point는 제공된 drawable 리소스를 사용한다.
|
||||
- First는 `ic_content_tag_first_star` 리소스를 사용해 Figma `20:3840` 형태의 배지를 생성한다.
|
||||
- Free는 Figma `20:3843` 기준으로 다국어 string resource 텍스트를 사용해 생성한다.
|
||||
- Figma 예시 조합을 지원한다.
|
||||
- Free + Original + First: `20:3815`
|
||||
- Point + Original + First: `20:3814`
|
||||
|
||||
---
|
||||
|
||||
## 4. Non-Goals
|
||||
- 피드 위젯(`kr.co.vividnext.sodalive.v2.widget.feed.*`)에는 이번 변경을 적용하지 않는다.
|
||||
- 레거시 화면, 레거시 adapter, 레거시 XML에는 이번 변경을 포함하지 않는다.
|
||||
- 기존 화면, adapter, API, DTO에 태그 값을 일괄 연결하지 않는다.
|
||||
- 썸네일 이미지 로딩 정책이나 placeholder 정책을 변경하지 않는다.
|
||||
- 오디오 콘텐츠 카드의 기존 size contract(`large`, `medium`, `small`)를 변경하지 않는다.
|
||||
- Compose 컴포넌트 또는 신규 Activity/Fragment/ViewModel을 만들지 않는다.
|
||||
- Figma에 없는 추가 badge, animation, dim overlay, pressed effect는 추가하지 않는다.
|
||||
|
||||
---
|
||||
|
||||
## 5. Target Users
|
||||
- v2 오디오 콘텐츠 카드에서 콘텐츠 상태를 빠르게 구분하려는 앱 사용자.
|
||||
- `AudioContentCardView`를 XML Views 기반 목록, 캐러셀, 그리드에서 재사용하는 Android 개발자.
|
||||
|
||||
---
|
||||
|
||||
## 6. User Stories
|
||||
- 사용자는 콘텐츠 썸네일에서 Original, First, Point, Free 속성을 즉시 확인하고 싶다.
|
||||
- 개발자는 오디오 콘텐츠 카드에 표시할 태그 목록만 전달하고, 카드 내부에서 Figma 기준 위치와 순서가 자동으로 적용되기를 원한다.
|
||||
- 개발자는 Free 태그 문구가 한국어/영어/일본어 등 기존 다국어 정책을 따르기를 원한다.
|
||||
|
||||
---
|
||||
|
||||
## 7. Core Features
|
||||
|
||||
### Audio Content Card Tag Badges
|
||||
v2 신규 위젯인 `AudioContentCardView`의 썸네일 영역을 overlay 가능한 container로 확장하고, 태그 배지를 카드 썸네일 내부의 왼쪽 상단/왼쪽 하단에 배치한다. 레거시 화면에 include하거나 레거시 카드 구현을 수정하지 않는다.
|
||||
|
||||
#### Figma References
|
||||
- First tag: https://www.figma.com/design/HmN1yNdJ3EIpqknFL0Hkab/-%EA%B3%B5%EC%9C%A0%EC%9A%A9-%EB%B3%B4%EC%9D%B4%EC%8A%A4%EC%98%A8-UI-UX-%EA%B8%B0%ED%9A%8D%EB%AC%B8%EC%84%9C?node-id=20-3840&m=dev
|
||||
- Free tag: https://www.figma.com/design/HmN1yNdJ3EIpqknFL0Hkab/-%EA%B3%B5%EC%9C%A0%EC%9A%A9-%EB%B3%B4%EC%9D%B4%EC%8A%A4%EC%98%A8-UI-UX-%EA%B8%B0%ED%9A%8D%EB%AC%B8%EC%84%9C?node-id=20-3843&m=dev
|
||||
- Free + Original + First example: https://www.figma.com/design/HmN1yNdJ3EIpqknFL0Hkab/-%EA%B3%B5%EC%9C%A0%EC%9A%A9-%EB%B3%B4%EC%9D%B4%EC%8A%A4%EC%98%A8-UI-UX-%EA%B8%B0%ED%9A%8D%EB%AC%B8%EC%84%9C?node-id=20-3815&m=dev
|
||||
- Point + Original + First example: https://www.figma.com/design/HmN1yNdJ3EIpqknFL0Hkab/-%EA%B3%B5%EC%9C%A0%EC%9A%A9-%EB%B3%B4%EC%9D%B4%EC%8A%A4%EC%98%A8-UI-UX-%EA%B8%B0%ED%9A%8D%EB%AC%B8%EC%84%9C?node-id=20-3814&m=dev
|
||||
|
||||
#### Tag Types
|
||||
| Tag | 위치 | 구현 기준 | 리소스/텍스트 |
|
||||
| --- | --- | --- | --- |
|
||||
| `Original` | 왼쪽 상단 | Figma 예시의 24dp 정사각 original audio tag | `ic_content_tag_original` |
|
||||
| `First` | 왼쪽 상단 | `#FF34B8` 배경 + 별 아이콘 + `FIRST` 텍스트 | `ic_content_tag_first_star` |
|
||||
| `Point` | 왼쪽 하단 | Figma 예시의 24dp 정사각 point tag | `ic_content_tag_point` |
|
||||
| `Free` | 왼쪽 하단 | `#052742` 배경 + 다국어 텍스트 | `@string/audio_content_tag_free` |
|
||||
|
||||
#### Layout Requirements
|
||||
- 태그 높이는 Figma 기준 `24dp`를 사용한다.
|
||||
- Original과 Point는 `24dp x 24dp` 아이콘 태그로 표시한다.
|
||||
- First는 `62dp x 24dp` 배지로 표시한다.
|
||||
- First 텍스트는 Figma `20:3840` 기준 `Phosphate Solid`, `16sp`, white, 단일 행, 대문자 `FIRST`로 표시한다.
|
||||
- First 텍스트 위치는 배지 좌측 `20dp`, 상단 `2dp`를 기준으로 하며, 별 아이콘은 좌측 `2dp`, 상단 `4dp`, `17dp x 17dp`로 배치한다.
|
||||
- Free는 높이 `24dp`, 최소 폭 `34dp`, 가로 `wrap_content` 배지로 표시한다. 한국어 `무료`는 Figma 기준 `34dp` 폭으로 보이고, 다른 locale 문구가 더 길면 텍스트가 잘리지 않도록 좌우 padding을 유지한 채 폭을 확장한다.
|
||||
- 왼쪽 상단 tag row는 썸네일의 `start=0`, `top=0`에 배치한다.
|
||||
- 왼쪽 하단 tag row는 썸네일의 `start=0`, `bottom=0`에 배치한다.
|
||||
- 상단 row에서 Original과 First가 함께 있으면 항상 Original, First 순서로 표시한다.
|
||||
- 하단 row에서 Point와 Free가 함께 있으면 Point, Free 순서로 표시한다.
|
||||
- 태그 row는 썸네일 radius와 함께 잘려야 하며 카드 바깥으로 넘치지 않아야 한다.
|
||||
|
||||
#### Data Contract Requirements
|
||||
- 태그 표시는 순수 Kotlin contract로 관리한다.
|
||||
- `AudioContentTag` enum에 `Original`, `First`, `Point`, `Free`를 정의한다.
|
||||
- `AudioContentCardView`는 `setTags(tags: Set<AudioContentTag>)` API를 제공한다.
|
||||
- 태그가 비어 있으면 모든 태그 row를 숨긴다.
|
||||
- `setContent(title, creatorName)` 기존 API는 유지한다.
|
||||
- `thumbnailView()` 기존 API는 유지해 호출부 이미지 로딩 방식을 변경하지 않는다.
|
||||
|
||||
#### Edge Cases
|
||||
- 동일 태그가 중복 전달되면 한 번만 표시한다.
|
||||
- 전달 순서와 무관하게 위치별 고정 순서를 적용한다.
|
||||
- Free와 Point가 모두 전달되면 둘 다 왼쪽 하단에 표시한다.
|
||||
- Original과 First가 모두 전달되면 둘 다 왼쪽 상단에 표시한다.
|
||||
- 태그가 없는 기존 사용처는 현재와 같은 UI를 유지한다.
|
||||
|
||||
---
|
||||
|
||||
## 8. UX / UI Expectations
|
||||
- 태그 배지는 썸네일 위에 직접 겹쳐 보이며, 제목/크리에이터 label 영역에는 영향을 주지 않는다.
|
||||
- large, medium, small 카드 모두 동일한 태그 크기와 위치를 사용한다.
|
||||
- Figma 예시처럼 Original/First는 상단 왼쪽에서 붙어 있고, Point/Free는 하단 왼쪽에서 붙어 있다.
|
||||
- Free 태그는 string resource 기반으로 현재 locale에 맞는 문구를 표시한다.
|
||||
- 장식 아이콘은 접근성 노출이 필요하지 않으면 `contentDescription=@null`로 둔다.
|
||||
|
||||
---
|
||||
|
||||
## 9. Technical Constraints
|
||||
- 현재 프로젝트는 Android XML Views + Kotlin custom View 패턴을 사용한다.
|
||||
- 신규 Kotlin 코드는 `kr.co.vividnext.sodalive.v2.widget` 패키지 하위에 작성한다.
|
||||
- 기존 `AudioContentCardView`의 public API 호환성을 깨지 않는다.
|
||||
- 기존 카드 크기 계산은 v2 신규 위젯의 `AudioContentCardSize`를 유지한다.
|
||||
- 색상과 typography는 기존 token을 우선 사용하되, Figma 고유 색상(`#FF34B8`, `#052742`)은 전용 drawable 리소스로 최소 추가한다.
|
||||
- 다국어 문자열은 `values/strings.xml`, `values-en/strings.xml`, `values-ja/strings.xml`에 추가한다.
|
||||
- 아이콘 리소스는 `ic_content_tag_original`, `ic_content_tag_point`, `ic_content_tag_first_star` 이름으로 제공한다.
|
||||
|
||||
---
|
||||
|
||||
## 10. Metrics
|
||||
- `AudioContentCardView`에서 4가지 태그 타입을 모두 표시할 수 있다.
|
||||
- Original + First 조합은 왼쪽 상단에 Original, First 순서로 표시된다.
|
||||
- Point + Free 조합은 왼쪽 하단에 Point, Free 순서로 표시된다.
|
||||
- Free 태그는 string resource를 통해 다국어 처리된다.
|
||||
- 태그가 없는 기존 오디오 콘텐츠 카드 UI는 변경되지 않는다.
|
||||
- 관련 unit test와 Android resource merge/build가 성공한다.
|
||||
|
||||
---
|
||||
|
||||
## 11. Open Questions
|
||||
- 사용자 확인으로 대상 위젯은 v2 패키지 아래 신규 위젯인 `AudioContentCardView`와 `view_audio_content_card.xml`로 확정한다.
|
||||
- 레거시 화면에는 포함하지 않고, 신규 위젯 자체의 표시 기능으로만 제공한다.
|
||||
- 이번 작업은 문서 생성 범위이며, 구현은 계획/TASK 문서를 기준으로 별도 진행한다.
|
||||
Reference in New Issue
Block a user