feat(state): Phase A · 실측 경로 알람/이력 통합 (cloud-mvp deb7b17 이식)
Guardian 공유 이전 선행 작업 (GUARDIAN-01 §5 Phase A).
이전 버그: 데모 경로 (incrementLevel) 만 NotificationService · HistoryStore 호출.
실측 (BLE) 경로는 bladderLevel = ...copy(currentLevel = level) 로 직접
대입 → 알람 미발생 · 이력 미저장.
수정:
- AppState.updateLevelFromMeasurement(volumeMl, recordHistory) 신규 함수
· bladderLevel 계산·갱신·storage 동기화
· MeasurementRecord 저장 (recordHistory=true 시)
· Urgency 변화 시 sendUrgencyNotification (중복 억제는 기존 로직 재사용)
- AppState.incrementLevel(): 데모 1단계 증가를 신규 함수로 위임
- PiezoMonitoringView 3곳 (L578/L1345/L1550) 직접 대입 → 신규 함수 호출
· auto-scan 갱신: recordHistory=false (폭탄 방지)
· SPOT trimmed 실측: recordHistory=true
· dev-mode tap: recordHistory=true
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -203,24 +203,46 @@ class AppState(private val context: Context) {
|
||||
}
|
||||
|
||||
fun incrementLevel() {
|
||||
// 데모 · 1단계 증가 — 신규 함수로 위임 (cloud-mvp deb7b17 이식).
|
||||
val currentVolume = estimatedVolume
|
||||
val stepVolume = piezoSettings.maxVolume.toDouble() / BladderLevel.MAX_LEVEL
|
||||
updateLevelFromMeasurement(currentVolume + stepVolume, recordHistory = true)
|
||||
}
|
||||
|
||||
/**
|
||||
* Phase A · 실측 경로 통합 (GUARDIAN-01, 2026-08-03 · cloud-mvp deb7b17 이식).
|
||||
*
|
||||
* 이전: PiezoMonitoringView 3곳 bladderLevel 직접 대입 →
|
||||
* NotificationService · MeasurementHistoryStore 우회 → 실사용 시 알람 미발생.
|
||||
* 이제: 실측/데모 경로 모두 이 함수로 일원화. 알람 · 이력 자동.
|
||||
*
|
||||
* @param volumeMl 실측 부피 (mL)
|
||||
* @param recordHistory 이력 저장 여부 (기본 true · auto-scan 갱신 시 false 로 폭탄 방지)
|
||||
*/
|
||||
fun updateLevelFromMeasurement(volumeMl: Double, recordHistory: Boolean = true) {
|
||||
val previousUrgency = bladderLevel.urgency
|
||||
val newLevel = bladderLevel.copy()
|
||||
newLevel.increment()
|
||||
bladderLevel = newLevel
|
||||
|
||||
val maxVol = piezoSettings.maxVolume.toDouble()
|
||||
val pct = if (maxVol > 0) (volumeMl / maxVol).coerceAtMost(1.0) else 0.0
|
||||
val level = (pct * BladderLevel.MAX_LEVEL).toInt().coerceIn(0, BladderLevel.MAX_LEVEL)
|
||||
|
||||
bladderLevel = bladderLevel.copy(currentLevel = level)
|
||||
storage.bladderLevel = bladderLevel.currentLevel
|
||||
|
||||
val record = MeasurementRecord(
|
||||
eventType = MeasurementEventType.MEASUREMENT,
|
||||
level = bladderLevel.currentLevel,
|
||||
estimatedVolume = estimatedVolume,
|
||||
urgencyLevel = bladderLevel.urgency,
|
||||
fillPercentage = fillPercentage
|
||||
)
|
||||
historyStore.addRecord(record)
|
||||
if (recordHistory) {
|
||||
val record = MeasurementRecord(
|
||||
eventType = MeasurementEventType.MEASUREMENT,
|
||||
level = bladderLevel.currentLevel,
|
||||
estimatedVolume = volumeMl.toInt(),
|
||||
urgencyLevel = bladderLevel.urgency,
|
||||
fillPercentage = fillPercentage,
|
||||
)
|
||||
historyStore.addRecord(record)
|
||||
}
|
||||
|
||||
val newUrgency = bladderLevel.urgency
|
||||
if (newUrgency != previousUrgency) {
|
||||
notificationService.sendUrgencyNotification(newUrgency, estimatedVolume)
|
||||
notificationService.sendUrgencyNotification(newUrgency, volumeMl.toInt())
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user