My Photo Watch Frame — Overview
Wear OS 워치를 개인 사진 액자로 바꾸는 앱입니다. 모바일 갤러리에서 선택한 사진을 워치로 전송해 전용 워치페이스의 배경으로 띄우거나, 다른 워치페이스의 사진 컴플리케이션으로 사용할 수 있습니다. 홈 화면 위젯으로 같은 사진을 폰에도 표시할 수 있어 폰과 워치의 룩을 한 번에 맞출 수 있습니다.
주요 기능
- 사진 워치페이스 — Watch Face Format (WFF) 기반의 전용 풀스크린 사진 워치페이스
- 포토 컴플리케이션 — 다른 호환 워치페이스 위에 미니 사진 앨범 표시
- 무제한 사진 전송 — 갤러리 다중 선택 또는 다른 앱에서 공유해 워치로 전송, 개수 제한 없음
- ML Kit 얼굴 중심 크롭 — 얼굴을 인식해 인물이 중앙에 오도록 자동 크롭
- 2x2 / 4x4 홈 화면 위젯 — 폰 홈에도 같은 사진 액자
- Wear OS 타일 — 타일에서 사진을 빠르게 넘겨보기
- 스타일 커스터마이징 — 폰트, 색상, 시간 위치, 가독성용 그라디언트 오버레이
기술 스택
- 언어: Kotlin 2.1.0, Java 17 (app/wear), Java 11 (라이브러리)
- 모바일 앱: XML Layouts, MVVM (ViewModel + LiveData + Coroutines), Navigation
- 워치 앱: Jetpack Compose (Wear), Canvas 렌더링 (
MyCanvasView), Wear Tiles 1.5.0-beta01
- 사진 최적화: ML Kit Face Detection, BitmapFactory (최대 3840px 디코딩)
- 기기 간 통신: Wearable Data Layer API (
/image, /start-sync, /update-settings, /sync-response / /sync-reply, /watch-version)
- 위젯: AppWidgetProvider + AlarmManager 기반 갱신 스케줄러
- 빌드: AGP 8.6.0, Gradle 8.7 (루트 Groovy, 서브모듈 Kotlin DSL 혼용)
- CI/CD: GitHub Actions (
android-release.yml) — v*, mobile-v*, wear-v* 태그로 AAB 자동 서명·업로드
이미지 처리 파이프라인
- 갤러리 선택 또는 외부 앱 공유
- BitmapFactory로 최대 3840px까지 디코딩
- ML Kit Face Detection 기반 얼굴 중심 크롭
- 워치용 450×450, 위젯용 900px 리사이즈
- JPEG 90% 품질 압축
- Wearable Data Layer로 워치 전송
아키텍처 요약
- 모바일 (
:app) — MainActivity + MainViewModel, WearClient로 워치와 통신
- 워치 (
:wear) — MyPhotoFrameActivity, MyCanvasView (Canvas 렌더), DataLayerListenerService, MyPhotoComplicationService, MyPhotoTileService
- 공용 라이브러리:
:watch-go-info-fragment, :onboarding (ViewPager2)
- 빌드 스크립트 혼용: 루트는
.gradle(Groovy), 하위 모듈은 .gradle.kts(Kotlin DSL)