Skip to content

dogeby/tag-player

Repository files navigation

택플 배너

앱 소개

  • 페이지 방식의 동영상 플레이어
  • 태그를 통한 동영상 관리
  • Dynamic color 및 다크 모드 지원 및 다양한 크기에 맞게 UI 구현

동영상 목록

  • 검색, 필터, 정렬 지원

동영상 정보 보기, 태그 설정

  • 다중 선택 지원
  • 동영상 정보 보기
  • 태그 설정

동영상 플레이어

  • 스와이프를 통한 동영상 교체

태그 목록

  • 태그를 통한 동영상 관리

다크 모드

  • 앱 설정을 통한 다크 모드

기술 스킬

  • Kotlin
  • Compose
  • Material3
  • Hilt
  • Navigation
  • Room
  • Proto Datastore
  • Glide
  • ExoPlayer(Media3)
  • Junit4
  • Mockito
  • SplashScreen API
  • Palette API

주요 기능

Adaptive Layout

  • 화면 크기에 따라 UI 변경되게 구현
  • 화면 타입 객체 구현 및 해당 객체를 반환하는 Composable 구현

Dynamic Color

  • M3 Theme colorScheme를 사용해서 앱 UI 구현
  • 디바이스 설정 컬러 팔레트 선택과 다크 모드 유무에 따라 색이 동적으로 표시
  • Palette API를 사용해 동영상 섬네일 색 추출, 해당 색을 섬네일 바탕색으로 사용

Animation

  • InfiniteTransition를 사용해 로딩 애니메이션 구현
  • AnimationVisibility를 사용해 바텀바 Slide 애니메이션과 필터 칩 leading icon 애니메이션 구현
  • animateFloatAsState를 사용해 동영상 플레이어 진행바 구현

Pager, Glide, ExoPlayer를 활용한 동영상 플레이어

  • ExoPlayer로 동영상 재생, LifecycleEventObserver를 통해 앱이 백그라운드 시 동영상 정지되게 구현
  • View 기반인 ExoPlayer의 PlayerViewAndroidView로 구현, 컨트롤러 UI는 Compose로 직접 구현
  • 동영상 플레이어 페이지 넘기는 방식은 androidx.compose.foundation.pager를 통해 구현
  • 현재 사용자에게 보여지는 페이지가 아니더라도 동영상을 준비시키고 PlayerView를 생성하는 것을 막기 위해 Pager의 페이지가 settledPage가 아니면 Glide를 사용한 첫 프레임 이미지를 표시하고, settledPage일 경우 동영상을 표시

Room

  • 디바이스내 동영상 정보와 사용자가 생성한 태그를 Room에 저장
  • 동영상 정보와 태그는 다대다 관계이며, 두 Entity를 연결하는 associate entity TagVideoCrossRef구현
  • 동영상 정보와 태그를 id를 TagVideoCrossRef의 ForeignKey로 지정하고 onDeleteForeignKey.CASCADE로 설정해 동영상 정보나 태그가 삭제될 시 해당 entity의 TagVideoCrossRef를 삭제하게 구현
  • 태그 entity의 이름을 index로 지정하고, unique로 적용해 태그 이름 중복 방지

Proto Datastore

  • 동영상 목록에 적용되는 필터, 정렬과 앱 테마 설정을 Proto Datastore로 저장
  • Proto Datastore는 Flow를 지원하며, 유형 안정성을 제공하기 때문에 사용

개발 일지

App Ui Design

Compose에서 동영상 썸네일 이미지 Coil, Glide 비교

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Languages