입력 경계
Compose 조작 화면은 원시 리포트 바이트 대신 이동, 버튼 상태, 클릭, 가로 스크롤이라는 의미 요청을 만듭니다. 포그라운드 서비스가 요청을 검증한 뒤 공용 HID 세션에 전달합니다.
| 전송 방식 | Classic HID Device와 BLE HOGP 대체 경로 |
|---|---|
| 리포트 범위 | 상대 이동의 각 성분을 부호 있는 8비트 HID 변화량으로 분할 |
| 대기열 모델 | 유입·의미·대기 명령 용량을 모두 제한 |
| 영속 상태 | 확인된 호스트와 로컬 조작 설정 |
순서를 바꾸지 않는 이동량 합치기
포인터 이동이 이어지는 동안에는 값을 합칩니다. 버튼·클릭·가로 스크롤 경계를 만나면 그 전에 대기 이동을 먼저 비워, 클릭이 대상 위치를 정한 이동보다 앞서지 않게 합니다.
- 큰 이동량은 리포트 범위에 맞는 여러 구간으로 나눕니다.
- 작업자 하나가 묶음을 비워 터치 이벤트마다 코루틴이 생기지 않습니다.
- 같은 UI 프레임에 들어온 입력은 작업자가 시작되기 전에 합칠 수 있습니다.
- 제한된 묶음이 가득 차면 오래된 나머지 이동을 나중에 재생하지 않고 폐기 통계로 남깁니다.
버튼, 클릭과 휠
버튼 상태는 세 버튼의 한 시점 상태로 표현합니다. 이미 받은 누름의 해제는 우선 작업입니다. 대기열이 가득 찼다는 이유로 호스트에 버튼이 눌린 채 남아서는 안 되기 때문입니다. 한 번·두 번 클릭은 정해진 누름, 리포트, 유지, 해제, 간격 명령으로 펼칩니다.
| 제스처 | 프로토콜 처리 |
|---|---|
| 한 번 클릭 | 60ms 누른 뒤 해제 |
| 두 번 클릭 | 100ms 간격의 클릭 두 번 |
| 세로 스크롤 | 상대 마우스 리포트의 휠 |
| 가로 스크롤 | Shift 보조 키와 휠을 함께 보내고 사용자의 보조 키 상태 복원 |
세션과 수명 주기 안전성
서비스가 한 화면보다 오래 전송 역할을 소유하고 연결 상태를 흐름으로 공개합니다. 확인된 호스트는 Android DataStore에 둡니다. 도토리 HID 앱 3종은 같은 서명의 형제 앱 소유권을 조정해 제한된 기기 역할을 하나의 활성 조작 화면만 사용합니다.
- 최소 리포트로 새 호스트 연결을 확인합니다.
- 세션 세대와 서비스 인스턴스 검사로 늦게 도착한 콜백을 버립니다.
- 종료할 때 중립 상태·연결 해제·등록 해제를 순서대로 실행합니다.
- 백그라운드 시작 제약을 가짜 연결 상태로 숨기지 않고 화면에 반영합니다.
검증과 확인된 제약
누산기 용량, 이동 분할과 폐기, 버튼 상태, 클릭 시점, 가로 스크롤 보조 키 복원, 재연결 정책, 형제 앱 소유권 넘김, 영속화 대체 경로와 수명 주기 전달을 시험으로 확인합니다.
- 가로 스크롤은 Shift + 휠을 그렇게 해석하는 호스트 앱에서만 동작합니다.
- 포인터 가속과 화면 가장자리 동작은 호스트가 결정합니다.
- 지속적인 과부하에서 오래된 남은 이동을 버리는 것은 의도한 동작입니다.