Skip to content

fix: 플레이리스트 트랙 중복 추가 및 UI 개선#79

Merged
gagip merged 9 commits intomainfrom
fix/playlist
Mar 26, 2026
Merged

fix: 플레이리스트 트랙 중복 추가 및 UI 개선#79
gagip merged 9 commits intomainfrom
fix/playlist

Conversation

@gagip
Copy link
Copy Markdown
Owner

@gagip gagip commented Mar 26, 2026

Summary

  • 플레이리스트에 동일한 트랙이 중복으로 추가되던 버그를 DB 스키마 레벨에서 근본적으로 수정
  • AlbumArtThumbnailTrackThumbnail 공용 컴포넌트로 대체하고, 전체재생 FAB 위치·색상 개선

Key Changes

  • PlaylistTrackEntity(playlistId, trackId) unique index 추가
  • PlaylistDao.insertTrack 충돌 전략을 REPLACEIGNORE로 변경
  • DB v1→v2 마이그레이션: 기존 중복 행 정리 + unique index 생성
  • AlbumArtThumbnail 컴포넌트 삭제, TrackThumbnail 공용 컴포넌트로 통합
  • PlaylistDetailScreen에서 전체재생 FAB을 MiniPlayerBar 위에 배치하고 primary 색상 적용
  • SampleMusicProvider raw 리소스 자동 탐지 방식으로 개선 (하드코딩 제거)
  • 샘플 트랙 교체 (sample_track_*.mp3 → 실제 음악 파일 7개)

Technical Details

  • OnConflictStrategy.IGNORE로 중복 삽입 시 조용히 무시하여 데이터 무결성 보장
  • Room DB exportSchema = false 유지, MIGRATION_1_2 객체를 companion object에 정의
  • TrackThumbnailcornerRadius 파라미터를 받아 재사용성 확보
  • FAB과 MiniPlayerBar를 Column으로 수직 배치하여 겹침 해결

Rationale

  • REPLACE 전략은 기존 행을 삭제 후 재삽입하여 id가 바뀌는 부작용이 있었음 → IGNORE가 적합
  • unique index를 DB 레벨에서 강제하여 애플리케이션 코드의 방어 로직 없이도 중복을 원천 차단
  • 공용 TrackThumbnail 컴포넌트로 통일해 일관된 앨범아트 표시 및 코드 중복 제거

gagip added 9 commits March 26, 2026 09:47
- Color.White.copy(alpha = ZenAlpha.DISABLED) → MaterialTheme.colorScheme.outlineVariant
- 하드코딩된 색상 대신 테마 시스템 토큰을 사용해 다크/라이트 모드 대응 개선
- Scaffold topBar에 TopAppBar + 뒤로가기 버튼 추가 (ZenMusicSelectScreen과 일관성 맞춤)
- PlaylistHeader에서 embedded 뒤로가기 버튼 제거
- 하드코딩된 영어 문자열 "$trackCount tracks • $totalMinutes minutes" → strings.xml 리소스로 교체
- Scaffold floatingActionButton 제거, Box 내 Column으로 FAB과 MiniPlayerBar를 수직으로 적층
- FAB → MiniPlayerBar 순으로 배치하여 겹침 해소
- LazyColumn 하단 패딩에 ZenDimension.Fab.BottomPadding 추가 (스크롤 최하단 아이템 가림 방지)
- ZenDimension에 Fab.ExtendedHeight, Fab.BottomPadding 토큰 추가
- durationMs = 0L 하드코딩 → openRawResourceFd + MediaMetadataRetriever로 실제 duration 읽기
- Uri.parse() 방식은 에뮬레이터에서 setDataSource 실패 가능 → FileDescriptor 방식으로 교체
- SampleMusicRepository.getAllTracks/getTrackById에 withContext(Dispatchers.IO) 추가
- containerColor = primary, contentColor = Color.White 적용
- core/ui/component/TrackThumbnail.kt 생성 (size, modifier 파라미터 지원)
- AlbumArtThumbnail.kt 삭제
- MiniPlayerBar, PlaylistDetailScreen, ZenPlayerBar, ZenAllTracksTabContent 모두 TrackThumbnail로 교체
- 하드코딩된 트랙 목록을 제거하고 R.raw 리플렉션으로 자동 탐지
- MediaMetadataRetriever로 title/artist/album/앨범아트를 파일에서 직접 추출
- 새 샘플 MP3 파일 7개 추가, 기존 sample_track_1~5.mp3 제거
- QueuePersistenceManager: currentIndex를 coerceIn으로 범위 제한하여 인덱스 초과 버그 수정
- build.gradle.kts: lint.xml 설정 파일 적용
- PlaylistTrackEntity에 (playlistId, trackId) unique index 추가
- PlaylistDao insertTrack의 OnConflictStrategy를 IGNORE로 변경
- DB 버전 1→2 마이그레이션 추가 (기존 중복 행 정리 + unique index 생성)
- PlaylistModule에 MIGRATION_1_2 등록
@gagip gagip marked this pull request as ready for review March 26, 2026 03:45
@github-actions
Copy link
Copy Markdown

Coverage Report

Module Coverage Covered Total
Total 19.49% 918 4709
Player 35.94% 101 281
Playlist 18.25% 71 389
Timer 48.15% 365 758
Music 21.08% 39 185

@gagip gagip merged commit 557497c into main Mar 26, 2026
1 check passed
@gagip gagip deleted the fix/playlist branch March 26, 2026 03:50
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.

1 participant