Skip to content

feat(android): 버블이 가사 상태와 오버레이 표시 여부를 명확히 알린다 - #29

Merged
countnine merged 3 commits into
masterfrom
feat/android/bubble-status
Jul 31, 2026
Merged

feat(android): 버블이 가사 상태와 오버레이 표시 여부를 명확히 알린다#29
countnine merged 3 commits into
masterfrom
feat/android/bubble-status

Conversation

@countnine

Copy link
Copy Markdown
Owner

배경

버블 테두리 색 하나에 번역 상태만 실려 있었다(회색=API 꺼짐, 주황=실패, 흰색=정상). 그래서 정작 자주 궁금한 두 가지를 알 수 없었다 — 지금 가사를 찾는 중인지, 오버레이가 켜져 있는지. "표시 중"은 투명도 0.75/1.0 차이뿐이라 밝은 배경 위에서는 구분이 안 됐다.

한 채널에 여러 뜻을 겹치면 무엇이 바뀐 건지 읽을 수 없다. 채널을 셋으로 나눈다.

표기 규칙

채널 표기
테두리 링 가사 상태 검색 중 = 흐린 트랙 위로 악센트 호가 회전(플레이스토어 다운로드 링과 같은 감각, 1.1초/바퀴) / 찾음 = 가사 색 실선 / 못 찾음·무곡 = 회색
안쪽 채움 오버레이가 지금 보이는가 보이면 링 색으로 채우고 음표를 어두운색으로 반전 / 안 보이면 어두운 채움 + 밝은 음표
우상단 점 번역 예외 한도·실패 = 주황 / API 꺼짐 = 회색 / 정상·캐시로 다 채워짐 = 점 없음

음표 글리프 색도 가사 상태를 따라 흰색/회색으로 함께 움직인다(요청대로).

설계 판단 두 가지

  • "보이는가"의 근거는 _bandExpanded가 아니라 실제 표시 여부(_bandVisible) — 펼쳐 뒀어도 일시정지·무가사면 밴드는 보이지 않는다. 펼침 플래그로 칠하면 버블이 거짓말을 한다.
  • 회전은 ValueAnimator가 아니라 핸들러 틱(16ms) — 개발자 옵션에서 애니메이션 배율을 0으로 둔 기기에서는 ValueAnimator가 즉시 끝나 스피너가 멈춘다. 틱은 검색 중에만 돌고, 버블을 뗄 때 Stop()으로 확실히 멈춰 프레임 예약이 남지 않는다.

그 밖에

  • 색은 사용자 팔레트를 따른다(찾음 = OverlayTextColor, 검색 호 = OverlayKaraokeColor).
  • 상태 문구를 ContentDescription으로도 넣어 TalkBack이 읽는다.
  • 캐시·서버 히트는 코디네이터가 Searching 없이 바로 Cache를 발행하므로 스피너가 깜빡이지 않는다(즉시 "찾음").
  • 코어·엔진 무변경(골든룰). 새 파일은 Views/BubbleStatusDrawable.cs 하나.

검증

  • dotnet build -c Release 경고 0, 서명 APK 산출(22.1MB) → 실기기 확인 예정.

🤖 Generated with Claude Code

countnine and others added 3 commits August 1, 2026 00:16
버블 테두리 색 하나에 번역 상태만 실려 있어, 정작 자주 궁금한 두 가지를
알 수 없었다 — 지금 가사를 찾는 중인지, 오버레이가 켜져 있는지.
채널을 셋으로 나눈다(한 채널에 여러 뜻을 겹치면 무엇이 바뀐 건지 읽을 수 없다).

- 테두리 링 = 가사 상태. 검색 중이면 흐린 트랙 위로 악센트 호가 회전하고
  (플레이스토어 다운로드 링과 같은 감각), 찾았으면 실선 밝게, 못 찾았으면
  회색. 음표 글리프도 함께 흰색/회색으로 움직인다.
- 안쪽 채움 = 오버레이가 지금 보이는가. 보이면 링 색으로 채우고 음표를
  어두운색으로 반전한다. 투명도 0.75/1.0만 바꾸던 이전 방식은 밝은 배경
  위에서 구분이 되지 않았다. 근거는 _bandExpanded가 아니라 실제 표시
  여부(_bandVisible) — 펼쳐 뒀어도 일시정지·무가사면 밴드는 보이지 않는다.
- 우상단 점 = 번역 예외(한도·실패 주황 / API 꺼짐 회색 / 정상은 점 없음).
  링에서 밀려난 번역 상태를 잃지 않게 한다.

회전은 ValueAnimator가 아니라 핸들러 틱(16ms)으로 돈다 — 개발자 옵션에서
애니메이션 배율이 0이면 ValueAnimator는 즉시 끝나 스피너가 멈춘다.
검색 중에만 돌고 버블을 뗄 때 Stop()으로 확실히 멈춘다.

색은 사용자 팔레트(OverlayTextColor/OverlayKaraokeColor)를 따르고,
상태 문구를 ContentDescription으로도 넣어 TalkBack이 읽는다.

코어·엔진 무변경(골든룰). Release 빌드 경고 0.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
"표시 중"을 링 색(기본 흰색)으로 꽉 채워 알렸더니 버블이 불투명해져 뒤의
화면이 가려졌다. 채움은 가림과 직결되므로 상태 채널로 쓰지 않는다.

- 안쪽 채움은 상태와 무관하게 오버레이 배경 설정(색·불투명도)을 따른다 —
  밴드와 같은 재질로 보인다. 배경을 꺼 뒀으면 검정 45%, 불투명도가 아주
  낮아도 25%까지만 내려간다(완전 투명이면 밝은 화면 위에서 음표가 안 읽힌다).
- "지금 보이는가"는 링이 전담한다: 보이면 3dp + 안쪽 보조 링 + 완전 불투명,
  안 보이면 2dp 단선 65%. 선택된 라디오 버튼과 같은 관례라 즉시 읽힌다.
- 링이 굵어질 때 바깥 지름은 고정하고 안쪽으로만 자란다 — 안 그러면 상태가
  바뀔 때마다 버블이 커졌다 작아졌다 한다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
두 가지를 고친다.

1) 링 표기 — 오버레이가 보일 때 링을 3dp·불투명으로 굵혀 놨더니 선이
   도드라져 화면을 방해했다. 굵기(2dp)도 밝기(70%)도 상태에 따라 바꾸지
   않고, 안쪽에 같은 선을 하나 더 그려 **줄 수만** 달라지게 한다.

2) 펼침/접힘 유지 — 곡이 바뀌면 밴드를 접고 있었다(_onTrackChanged,
   0.3.0부터 있던 동작이며 이번 상태 표기 작업과는 무관하다). 곡이 넘어갈
   때마다 버블을 다시 눌러야 했다. 펼침/접힘은 사용자가 버블 탭으로 정하는
   상태이므로 직접 끄기 전까지 유지한다.
   - 이동 모드는 옮기려면 밴드가 보여야 해 강제로 펼치지만, 끝나면 들어가기
     전 상태로 되돌린다(_expandedBeforeMove).
   - 설정 저장(ActionRefreshDisplay)도 접지 않는다 — 접는 건 버블 모드로
     막 들어왔을 때(버블을 새로 붙일 때) 한 번뿐이다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@countnine
countnine merged commit 577925b into master Jul 31, 2026
1 check passed
@countnine
countnine deleted the feat/android/bubble-status branch July 31, 2026 15:48
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