Skip to content

fix: 남은 입력 안내와 창 접근성을 점검하고 보완한다 - #232

Open
OnlyReadOneBook wants to merge 4 commits into
mainfrom
feat/220
Open

OnlyReadOneBook wants to merge 4 commits into
mainfrom
feat/220

Conversation

@OnlyReadOneBook

@OnlyReadOneBook OnlyReadOneBook commented Sep 13, 2026 •

Copy link
Copy Markdown
Owner

📌𝘐𝘴𝘴𝘶𝘦𝘴

📎𝘞𝘰𝘳𝘬 𝘋𝘦𝘴𝘤𝘳𝘪𝘱𝘵𝘪𝘰𝘯

이슈의 여섯 항목을 실제로 렌더하고 돌려 본 뒤, 확인된 결함만 고쳤다.

C29/C39 입력 안내

  • 시작 시간을 다 지우면 저장 버튼만 잠기고 화면 어디에도 이유가 없었다. TimeInputFeedback 에 required 를 둬 시작 시간은 비어 있어도 범위 안내를 낸다. 종료 시간은 선택이라 그대로다.
  • 되읽기와 오류 문구가 칸의 형제 Text 라 화면 낭독기가 칸에 머무는 동안 읽지 않았다. liveRegion(Polite) 을 주고 네 칸에 isError 를 붙여 Material3 의 오류 시맨틱과 색을 받는다.
  • 제목 칸 안내가 첫 글자를 넣는 순간 사라져 아래 칸들이 딸려 올라왔다(큰 글자에서 100dp 이상). 늘 띄우는 규칙 문장으로 바꿨다. 또 label 을 두면 Material3 가 빈 칸에서 placeholder 를 감춰 "무엇을 할까요?" 가 사라지므로, 필수 표시는 머리글이 지고 label 은 뺐다.

C36/R51 테마와 첫 프레임

  • 시작 창이 앱에서 고른 테마를 따르지 않아 어두운 테마에서 밝은 창이 한 번 번쩍였다. UiModeManager.setApplicationNightMode 로 앱별 야간 모드를 심고 windowBackground 를 Compose 토큰과 같은 값으로 맞췄다. minSdk 32 라 API 31 요구를 이미 넘어 분기가 필요 없다.
  • MainActivity 가 테마 Flow 를 재구성마다 새로 만들어 SharedPreferences 리스너를 매번 다시 달았다. remember 로 한 번만 만들고 첫 값도 저장된 값에서 시작한다.

C37/S04/S05 알람·목록·색

  • 알람 시계를 초 단위 갱신에서 분 경계 갱신으로 바꾸고 12시간제로 읽게 했다.
  • 알람 화면에 전용 테마를 줘, 밝은 기기에서 흰 창이 번쩍인 뒤 어두운 화면이 그려지던 것을 없앴다.
  • 일정 칸 경계가 outlineVariant 라 배경 대비 2.02:1(어두운 모드)이었다. 어두운 모드는 surface 와 background 가 같은 값이라 이 선이 칸을 가르는 유일한 표시다. outline 으로 바꿔 5.84:1(어두운 모드)·4.13:1(밝은 모드)이 되어 WCAG 1.4.11 의 3:1 을 넘긴다.
  • 로그아웃이 error 색 버튼이라 바로 아래 계정 삭제와 붉은 버튼 두 개로 보였다. 되돌릴 수 있는 로그아웃은 기본 색으로 두고 error 는 계정 삭제에만 남겼다.

R28 날짜 선택

  • DatePickerDialog 를 Activity 컨텍스트로 직접 띄워 화면이 사라져도 창이 남았다. Composable 이 소유하고 DisposableEffect 로 정리한다. selectedDate 를 키로 두지 않는 이유는 확인을 누르면 상태가 바뀌어 창이 다시 열리기 때문이다.

R52/R53/R54 스토어 소재

  • 스크린샷이 1080×2400(9:20)이라 긴 변이 짧은 변의 2배를 넘어 Play 요건을 어겼다. 미리보기를 360dp × 640dp 로 바꿔 1080×1920(9:16)으로 낸다.
  • 아이콘이 24비트라 Play 가 요구하는 32비트(알파 포함)가 아니었다. RGB 픽셀을 그대로 두고 다시 인코딩했다.
  • 기기 규격이 바뀌어 baseline 이름의 해시가 바뀐다. 옛 baseline 넷을 지웠다. 남겨 두면 내보내기 스크립트가 한 화면에서 파일 둘을 보고 멈춘다.
  • 추천 목록에 의료 안내가 아니라는 문구를 넣고, 「학생」 묶음 문구를 18세 이상 선언과 대조한 결과를 출시 문서에 적었다.

근거 문서

📷𝘚𝘤𝘳𝘦𝘦𝘯𝘴𝘩𝘰𝘵

화면 증빙은 이 PR 의 diff 자체에 들어온다. screenshot-baseline 라벨로 CI 컨테이너가 baseline 을 새로 그려 커밋하므로, Files changed 에서 실제 렌더를 그대로 볼 수 있다.

새로 굳히는 미리보기

  • ScheduleInputScreenshotTest — 입력 안내를 글자 배율 2배의 밝은·어두운 두 벌로 굳힌다. 유효한 시작 시간의 되읽기("입력한 시간: 오후 2:30")와 잘못된 종료 시간(25시)의 붉은 isError 테두리·범위 안내가 한 장에 함께 들어간다.
  • RecommendationHealthNoticeScreenshot — 추천 화면의 의료 안내 문구를 360dp 와 글자 배율 2배 320dp 로 굳힌다.
  • StoreScreenshotTest 네 장 — 1080×1920 으로 다시 그린다.

💬𝘛𝘰 𝘙𝘦𝘷𝘪𝘦𝘸𝘦𝘳𝘴

스토어 소재 순서는 이 PR 안에서 끝냈다.

  1. screenshot-baseline 라벨로 CI 컨테이너가 1080×1920 baseline 을 그려 커밋했다(dc45e4e). 파일 이름의 해시 넷이 문서의 대응표와 그대로 맞는다.
  2. 그 커밋을 받아 scripts/export-play-screenshots.sh 를 돌려 docs/play/screenshots/ 넉 장을 다시 냈다(7d7a342).
  3. --check 통과. 넉 장 모두 1080×1920, 알파 없는 24비트, CI baseline 과 RGB 픽셀이 한 점도 다르지 않다.

옛 baseline 넷은 커밋 전에 지웠기 때문에 CI 가 만든 결과도 화면당 한 장씩이다. 지우지 않았으면 내보내기 스크립트가 한 화면에서 파일 둘을 보고 멈췄다.

소재 현황: 아이콘 512×512 32비트(알파 포함), 그래픽 이미지 1024×500 24비트(알파 없음), 스크린샷 1080×1920 24비트(알파 없음). 서로 다른 세 요구를 이제 다 만족한다.

판단이 갈릴 수 있는 곳

  • core/ui 의 ScheduleRow 는 이 브랜치가 원래 건드리지 않던 파일이다. S04(일정 행 경계)가 이슈 범위라 한 토큰만 바꿨다. 대비값은 직접 계산해 위에 적었다. 범위 밖이라고 보면 되돌리면 된다.
  • 「학생」 추천 문구(자습·공부량 확인·휴식하기·복습하기)는 바꾸지 않았다. 「자습」이 학교를 떠올리게 한다는 지적이 있었지만 성인 학습자도 그대로 쓰는 말이고, 미성년을 가리키는 표현이나 학교 일과 전제가 없어 그대로 뒀다. 판단 근거를 docs/play-release.md 의 타겟층 행에 남겼다.
  • 스토어 메인·어두운 모드 그림은 맨 아래 일정 한 줄이 화면 끝에 걸치고 「일정 추가」 버튼이 그 줄 제목 일부를 덮는다. 9:16 은 종전 9:20 보다 아래가 짧아 생긴 일이다. 목록을 줄여 봤지만 위쪽 높이가 고정이라 접히는 자리는 그대로였고 덮이는 줄만 「끝낸 일정」으로 바뀌어 오히려 나빠져서 되돌렸다(실제로 렌더해 확인). 버튼이 목록 위에 겹치는 것은 앱의 실제 모습이다.

확인하지 못한 것

  • 실기기 확인은 남는다. 알람 화면의 큰 글자 표시와 시작 창 번쩍임이 실제로 사라졌는지는 기기에서 봐야 한다. ThemeAndAlarmAccessibilityTest 는 글자 배율을 기기 전역 설정에서 바꾸지 않으므로 기본 배율만 본다(이름도 그렇게 고쳤다).
  • 계측 테스트는 CI 가 돌리지 않는다(:app:compileDebugAndroidTestKotlin 컴파일 가드만 있다). 에뮬레이터에서 돌려 본 것이 아니라 플랫폼 소스를 따라 정합성만 확인했다.

출시 전 감사에서 남아 있던 입력 안내·창 생명주기·스토어 소재 항목을 실제로 렌더하고
돌려 본 뒤 확인된 결함만 고쳤다.

C29/C39 일정 입력
- 시작 시간을 다 지우면 저장 버튼만 잠기고 화면에 이유가 없었다. 시작 시간은 비어 있어도
  범위 안내를 내도록 TimeInputFeedback 에 required 를 둔다. 종료 시간은 선택이라 그대로다.
- 되읽기와 오류 안내가 칸의 형제 Text 라 화면 낭독기가 칸에 머무는 동안 읽지 않았다.
  liveRegion(Polite)을 주고, 네 칸에 isError 를 붙여 Material3 의 오류 시맨틱과 색을 받는다.
- 제목 칸의 안내가 첫 글자를 넣는 순간 사라져 아래 칸들이 딸려 올라왔다(큰 글자에서 100dp 이상).
  안내를 늘 띄우는 규칙 문장으로 바꾸고, label 을 빼 빈 칸에서 "무엇을 할까요?" 가 다시 보이게 했다.

C36/R51 테마와 첫 프레임
- 시작 창이 앱에서 고른 테마를 따르지 않아 어두운 테마에서 밝은 창이 한 번 번쩍였다.
  UiModeManager.setApplicationNightMode 로 앱별 야간 모드를 심고 windowBackground 를 맞춘다.
  minSdk 32 라 API 31 요구를 이미 넘는다.
  https://developer.android.com/develop/ui/views/theming/darktheme
- MainActivity 가 테마 Flow 를 재구성마다 새로 만들어 SharedPreferences 리스너를 다시 달았다.
  remember 로 한 번만 만들고, 첫 값도 저장된 값으로 시작해 첫 프레임이 어긋나지 않게 한다.

C37/S04/S05 알람·목록·색
- 알람 시계를 초 단위 갱신에서 분 경계 갱신으로 바꾸고 12시간제로 읽게 한다.
- 알람 화면에 전용 테마를 줘 밝은 기기에서 흰 창이 번쩍인 뒤 어두운 화면이 그려지던 것을 없앤다.
- 일정 칸 경계가 outlineVariant 라 배경 대비 2.02:1(어두운 모드)이었다. 어두운 모드는
  surface 와 background 가 같은 값이라 이 선이 칸을 가르는 유일한 표시다. outline 으로 바꿔
  5.84:1(어두운 모드)·4.13:1(밝은 모드)로 올려 WCAG 1.4.11 의 3:1 을 넘긴다.
  https://www.w3.org/WAI/WCAG21/Understanding/non-text-contrast.html
- 로그아웃이 error 색 버튼이라 바로 아래 계정 삭제와 함께 붉은 버튼 두 개로 보였다.
  되돌릴 수 있는 로그아웃은 기본 색으로 두고 error 는 계정 삭제에만 남긴다.

R28 날짜 선택
- DatePickerDialog 를 Activity 컨텍스트로 직접 띄워 화면이 사라져도 창이 남았다.
  Composable 이 소유하고 DisposableEffect 로 정리한다. selectedDate 를 키로 두지 않는 이유는
  확인을 누르면 상태가 바뀌어 창이 다시 열리기 때문이다.

R52/R53/R54 스토어 소재
- 스크린샷이 1080x2400(9:20)이라 긴 변이 짧은 변의 2배를 넘어 Play 요건을 어겼다.
  미리보기를 360dp x 640dp 로 바꿔 1080x1920(9:16)으로 낸다.
- 아이콘이 24비트라 Play 가 요구하는 32비트(알파 포함)가 아니었다. RGB 픽셀을 그대로 두고
  다시 인코딩했다.
  https://support.google.com/googleplay/android-developer/answer/9866151
- 기기 규격이 바뀌어 baseline 이름의 해시가 바뀐다. 옛 baseline 넷을 지운다. 남겨 두면
  내보내기 스크립트가 한 화면에서 파일 둘을 보고 멈춘다.
- 추천 목록에 의료 안내가 아니라는 문구를 넣고, 「학생」 묶음 문구를 18세 이상 선언과 대조한
  결과를 출시 문서에 적는다.

검증
- ktlintCheck · testDebugUnitTest · lintDebug · :app:processDebugMainManifest ·
  :app:compileDebugAndroidTestKotlin · :app:assembleDebug 통과.
- node --test .github/scripts/*.test.mjs 302건, verify-android-manifest.mjs,
  verify-markdown-links.mjs 통과.
- 미리보기는 모두 렌더된다. baseline 은 호스트에서 만들지 않고 CI 컨테이너가 만든다.
- 실기기 확인(알람 큰 글자, 시작 창 번쩍임)은 남는다.

Closes #220
@OnlyReadOneBook OnlyReadOneBook added the screenshot-baseline CI 컨테이너에서 screenshot baseline 생성 요청 label Sep 13, 2026
@github-actions

Copy link
Copy Markdown
Contributor

📸 CI 표준 환경에서 screenshot baseline 14개를 생성·검증해 dc45e4e 로 커밋했습니다.
실행 로그·생성 artifact: https://github.com/1hyok/SlowClock/actions/runs/34746664189
이미지 내용은 이 PR의 PNG diff에서 눈으로 최종 확인해 주세요. 필수 검사도 새 SHA에 다시 요청했습니다.

@github-actions github-actions Bot removed the screenshot-baseline CI 컨테이너에서 screenshot baseline 생성 요청 label Sep 13, 2026
CI 컨테이너가 1080x1920 으로 그린 baseline 을 scripts/export-play-screenshots.sh 로
옮겼다. RGB 픽셀은 baseline 과 한 점도 다르지 않고 알파만 떼어 Play 가 요구하는
24비트 불투명 PNG 로 만든다. --check 도 통과한다.

아이콘은 32비트(알파 포함), 그래픽 이미지와 스크린샷은 24비트(알파 없음)라는
서로 다른 요구를 이제 셋 다 만족한다.
https://support.google.com/googleplay/android-developer/answer/9866151

Refs #220

This branch has not been deployed

No deployments
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.

fix: 남은 입력 안내와 창 접근성을 점검하고 보완한다

1 participant