공기질 판정·청소 후보 우선순위의 도메인 이관
DeviceAgent 안에 있던 PM·가스 등급 판정을 AirQuality 도메인으로 옮기고 실제 기존 호출을 연결했다. 폴더 이동과 함께 기존 앱의 컴파일 대상도 정본으로 바꿨다.
전체 구조에서의 위치
그림의 services/core → domain 중 airquality/policy에 해당한다.
공통 TaskManager나 Cleaning 정책 아래에 넣지 않는다. 기존 호스트와의 호출은 다음과 같다.
센서 갱신 / 공기질 연동 청소의 보고서 평가
→ DeviceAgent AirQualityManager.evaluateAirQuality
→ base/services/core/.../domain/airquality/policy/LegacyAirQualityGradingPolicy
→ 등급 반환 → 기존 호스트 후속 처리
| 위치 | 책임 |
|---|---|
domain/airquality/policy |
Android 의존성 없는 등급 판정 |
기존 AirQualityManager |
센서 값·기존 상태·가변 경계표 제공 |
AirQualityManagerService |
별도 서비스 수명과 식별자; 이번 변경으로 관측 생산자가 연결되지는 않음 |
| DeviceAgent Gradle | 정본 공기질 정책 하위 폴더만 포함 |
보존한 동작
- PM10·PM2.5·PM1.0: 높은 경계부터 이상 비교하여 좋음/보통/나쁨/매우나쁨 반환.
- TVOC·NOx: 기존 저장 문자열 사용. null·빈 문자열은 0, 4 이상은 3, 그 외 입력에서 1을 뺀다. 숫자 인자를 대신 사용하거나 음수를 보정하지 않는다.
- HCHO·CO₂: 중간 경계 이상은 3, 그 외는 0. PM처럼 네 등급으로 바꾸지 않는다.
- 잘못된 가스 문자열 예외, 미지원 타입의 0 반환, 공개 경계표 변경 반영을 유지한다.
정책 자체는 상태를 저장하지 않는다. 호출 시 전달한 가스 값이 여러 센서의 원자적 스냅샷이라는 뜻도 아니다.
최초 등급 판정 이관의 검증
정책 테스트 5개, DeviceAgent 기존 테스트 22개 통과. 실제 컴파일 소스 검사와 debug APK 빌드가 성공했고 38개 빌드 작업을 모두 재실행했다.
바이트코드에서 기존 메서드가 정본 정책을 호출하는 것도 확인했다.
계층·폴더·공개 API 경계 검사 통과. APK SHA-256은 e07d35013e5cc78a88d46150964de4d4ebcc5436957c4744c97b0be04b277e7e다.
센서 생산자·상태 소유권·알림 수명·제품 Runtime 연결은 남아 있다. 최초 단계에서는 서버 전체 회귀를 실행하지 않았으며, 아래 후속 단계에서 소스 스냅샷 기준으로 확대했다. AOSP 제품 빌드·실기기 설치는 두 단계 모두 미검증이다. 전체 상태 그림의 AirQuality는 일부 구현으로 유지한다.
후속 이관: 보고서 기반 청소 후보 우선순위
MainApi → CleaningLifecycleCommandHandler → AirQualityPriorityResolver의 기존 호출을 유지하면서
판단 규칙을 같은 폴더의 AirQualityReportPolicy로 옮겼다.
| 정본 정책 | 기존 연결부에 남긴 책임 |
|---|---|
| 보고서 10회 이상에서 이력 사용 | DB에서 최근 전체 청소 보고서 조회 |
| 나쁜 등급 기준·보고서 PM/가스 등급 집계 | Bundle 읽기·숫자 문자열 해석 |
| 나쁜 횟수 우선, 동률이면 최대 PM10 우선 | 후보 지역의 PM10 제공·지도 근접 순서 계산 |
횟수가 다르면 PM10을 미리 읽지 않는다. 완전동률의 정렬 순서도 새로 만들지 않고 기존 Map과 stream 동작을 유지한다. 정본 정책은 Android·DB·기존 앱을 참조하지 않는다.
신규 정책 검사 14개와 등급 정책 5개, DeviceAgent 22개가 통과했다. 실제 앱 바이트코드에서 정책 메서드 호출 4개와 debug APK 빌드를 확인했다.
검증을 확대해 서버 674개·SDK 62개 검사 및 Runtime release APK도 확인했다.
기준은 c268aa0 정본에 이번 정책·테스트를 추가한 소스 스냅샷이며, 보존 중인 미완 LLM 등
작업 트리의 다른 수정은 포함하지 않았다. 98개 Gradle 작업을 모두 재실행했다.
Runtime APK SHA-256은 b49e87fefd94516665c8605a6088446fb4166ac0fff9744f139d39cf1e6ccaa6다.
이것은 제품 부팅·실기기 검증이나 도메인 전체 이관 완료를 뜻하지 않는다.
상태 계약과 관측 연결부의 폴더 정리
공기질뿐 아니라 IoT·Power도 같은 책임 기준으로 구분했다.
| 도메인 | state/: 상태 값·키 |
observation/: 기존 관측 변환 |
|---|---|---|
| AirQuality | AirQualityState, AirQualityStateKeys, IndoorAirQualityObservation | AirQualityObservationAdapter |
| IoT | IotConnectionState, IotStateKeys | AwsIotConnectivityObservationAdapter |
| Power | BatteryObservation, PowerStateKeys | BatteryObservationAdapter |
각 ManagerService는 도메인 루트, 공기질 판단은 policy/에 둔다. 운영 클래스 10개와
테스트 클래스 3개를 이동했으며 값·TTL·source·예외 동작은 그대로다.
191ada8 정본에 이 폴더 변경만 반영한 소스 스냅샷에서 서버 674개·SDK 62개와
Runtime release 빌드가 통과했다. 다른 미완 작업·실기기는 이 검증에 포함하지 않았다.
폴더가 나뉘었다고 상태 소유권까지 이관된 것은 아니다. AirQuality·Power의 관측 어댑터는 아직 공통 StateManager에 직접 기록한다. IoT는 9월 14일 후속으로 기본 Runtime에 등록하고, 서비스가 발급한 관측 연결에 READY·수명 세대 검사를 적용했다. 변환 어댑터는 더 이상 직접 기록하지 않는다. 세 도메인 모두 실제 생산자 구독·해제 연결은 남아 있다. 전체 구조도의 ‘일부 구현’ 표시는 유지한다. 최신 상태.