From 30417a5f98a98b2f02ca7e19c2eab2d4b2adaf9d Mon Sep 17 00:00:00 2001 From: Jay Date: Mon, 13 Jul 2026 16:43:07 -0400 Subject: [PATCH] Slice 5: Audio Level Assist + fixed guidance slot (Codex) - AudioAssistStateMachine (core/audio, pure, tested): proximity bands with enter/exit hysteresis (close 1.0/1.2, near 3.0/3.4 degrees), cadence preserved across band changes (no threshold double-ping), lock cue driven solely by LockDetector's fireFeedback transition - no second lock threshold, and the haptic debounce paces the ping. - Silence gates: disabled, backgrounded, settling, invalid placement, or outside FACE_UP all reset and mute; all five unit-tested. - SonarSoundPool: locally synthesized WAV pings via SoundPool with USAGE_ASSISTANCE_SONIFICATION; zero audio-focus APIs (verified by grep); player exists only while enabled and resumed, released on composition disposal. - Persisted SONAR ON/OFF header control using the existing audioCueEnabled preference; off by default; state shown as text, never color alone. - Guidance slot fixed at 56dp so settling/correction/level copy no longer shifts the instrument (Slice 4 polish note). 59 tests passing. Audited-by: Claude (no findings) Co-Authored-By: Claude Fable 5 --- .../core/audio/AudioAssistStateMachine.kt | 102 ++++++++++++++ .../feature/level/AudioLevelAssist.kt | 124 ++++++++++++++++++ .../onthelevel/feature/level/LevelScreen.kt | 84 ++++++++---- app/src/main/res/raw/sonar_lock.wav | Bin 0 -> 51200 bytes app/src/main/res/raw/sonar_proximity.wav | Bin 0 -> 37088 bytes .../core/audio/AudioAssistStateMachineTest.kt | 65 +++++++++ 6 files changed, 348 insertions(+), 27 deletions(-) create mode 100644 app/src/main/java/com/onthelevel/core/audio/AudioAssistStateMachine.kt create mode 100644 app/src/main/java/com/onthelevel/feature/level/AudioLevelAssist.kt create mode 100644 app/src/main/res/raw/sonar_lock.wav create mode 100644 app/src/main/res/raw/sonar_proximity.wav create mode 100644 app/src/test/java/com/onthelevel/core/audio/AudioAssistStateMachineTest.kt diff --git a/app/src/main/java/com/onthelevel/core/audio/AudioAssistStateMachine.kt b/app/src/main/java/com/onthelevel/core/audio/AudioAssistStateMachine.kt new file mode 100644 index 0000000..9df8c42 --- /dev/null +++ b/app/src/main/java/com/onthelevel/core/audio/AudioAssistStateMachine.kt @@ -0,0 +1,102 @@ +package com.onthelevel.core.audio + +import com.onthelevel.core.sensors.SurfacePresentation + +/** + * Pure scheduler for optional Surface Audio Assist. It deliberately receives the + * existing lock transition rather than measuring a second lock threshold, and + * owns only proximity-band hysteresis and pulse cadence. + */ +class AudioAssistStateMachine { + enum class Cue { PROXIMITY, LOCK } + + private enum class ProximityBand(val intervalMillis: Long) { + NONE(0), + NEAR(2_200), + CLOSE(1_200), + } + + private var band = ProximityBand.NONE + private var lastProximityPulseMillis: Long? = null + + fun update(input: Input): Cue? { + if (!input.isEnabled || !input.isAppForeground || !input.placementOk || + input.surfacePresentation != SurfacePresentation.FACE_UP || input.isSettling + ) { + reset() + return null + } + + // Lock acquisition already passed LockDetector's dwell and debounce. A + // distinct one-shot ping is therefore truthful without another threshold. + if (input.isLocked) { + band = ProximityBand.NONE + lastProximityPulseMillis = null + return if (input.fireLockFeedback) Cue.LOCK else null + } + + val nextBand = resolveBand(input.displayPrimaryDegrees) + if (nextBand == ProximityBand.NONE) { + band = ProximityBand.NONE + lastProximityPulseMillis = null + return null + } + if (nextBand != band) { + band = nextBand + // Keep the prior pulse time across a band change. The new interval + // changes the next cadence without creating a double-ping at a + // threshold crossing. + } + + val lastPulse = lastProximityPulseMillis + return if (lastPulse == null || input.nowMillis - lastPulse >= band.intervalMillis) { + lastProximityPulseMillis = input.nowMillis + Cue.PROXIMITY + } else { + null + } + } + + fun reset() { + band = ProximityBand.NONE + lastProximityPulseMillis = null + } + + /** Hysteresis prevents a noisy display from chattering between pulse cadences. */ + private fun resolveBand(degrees: Double): ProximityBand = when (band) { + ProximityBand.CLOSE -> when { + degrees <= CLOSE_EXIT_DEGREES -> ProximityBand.CLOSE + degrees <= NEAR_ENTER_DEGREES -> ProximityBand.NEAR + else -> ProximityBand.NONE + } + ProximityBand.NEAR -> when { + degrees <= CLOSE_ENTER_DEGREES -> ProximityBand.CLOSE + degrees <= NEAR_EXIT_DEGREES -> ProximityBand.NEAR + else -> ProximityBand.NONE + } + ProximityBand.NONE -> when { + degrees <= CLOSE_ENTER_DEGREES -> ProximityBand.CLOSE + degrees <= NEAR_ENTER_DEGREES -> ProximityBand.NEAR + else -> ProximityBand.NONE + } + } + + data class Input( + val isEnabled: Boolean, + val isAppForeground: Boolean, + val placementOk: Boolean, + val surfacePresentation: SurfacePresentation?, + val isSettling: Boolean, + val displayPrimaryDegrees: Double, + val isLocked: Boolean, + val fireLockFeedback: Boolean, + val nowMillis: Long, + ) + + companion object { + const val CLOSE_ENTER_DEGREES = 1.0 + const val CLOSE_EXIT_DEGREES = 1.2 + const val NEAR_ENTER_DEGREES = 3.0 + const val NEAR_EXIT_DEGREES = 3.4 + } +} diff --git a/app/src/main/java/com/onthelevel/feature/level/AudioLevelAssist.kt b/app/src/main/java/com/onthelevel/feature/level/AudioLevelAssist.kt new file mode 100644 index 0000000..32d0c3b --- /dev/null +++ b/app/src/main/java/com/onthelevel/feature/level/AudioLevelAssist.kt @@ -0,0 +1,124 @@ +package com.onthelevel.feature.level + +import android.content.Context +import android.media.AudioAttributes +import android.media.SoundPool +import androidx.compose.runtime.Composable +import androidx.compose.runtime.DisposableEffect +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.platform.LocalContext +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.LifecycleEventObserver +import androidx.lifecycle.compose.LocalLifecycleOwner +import com.onthelevel.R +import com.onthelevel.core.audio.AudioAssistStateMachine + +/** + * Lifecycle-scoped SoundPool player for the optional hands-free Surface assist. + * It mixes as sonification and intentionally never asks Android for audio focus. + */ +@Composable +fun AudioLevelAssist(reading: LevelReading?, isEnabled: Boolean) { + val isForeground = rememberIsResumed() + val stateMachine = remember { AudioAssistStateMachine() } + val context = LocalContext.current.applicationContext + val player = remember(isEnabled, isForeground, context) { + if (isEnabled && isForeground) SonarSoundPool(context) else null + } + + DisposableEffect(player) { + onDispose { player?.release() } + } + + LaunchedEffect(reading, isEnabled, isForeground, stateMachine, player) { + val current = reading ?: return@LaunchedEffect + when ( + stateMachine.update( + AudioAssistStateMachine.Input( + isEnabled = isEnabled, + isAppForeground = isForeground, + placementOk = current.placementOk, + surfacePresentation = current.surfacePresentation, + isSettling = current.isSettling, + displayPrimaryDegrees = current.displayPrimaryDegrees, + isLocked = current.isLocked, + fireLockFeedback = current.fireFeedback, + nowMillis = System.currentTimeMillis(), + ), + ) + ) { + AudioAssistStateMachine.Cue.PROXIMITY -> player?.playProximity() + AudioAssistStateMachine.Cue.LOCK -> player?.playLock() + null -> Unit + } + } +} + +@Composable +private fun rememberIsResumed(): Boolean { + val lifecycleOwner = LocalLifecycleOwner.current + var isResumed by remember(lifecycleOwner) { + mutableStateOf(lifecycleOwner.lifecycle.currentState.isAtLeast(Lifecycle.State.RESUMED)) + } + DisposableEffect(lifecycleOwner) { + val observer = LifecycleEventObserver { _, _ -> + isResumed = lifecycleOwner.lifecycle.currentState.isAtLeast(Lifecycle.State.RESUMED) + } + lifecycleOwner.lifecycle.addObserver(observer) + onDispose { lifecycleOwner.lifecycle.removeObserver(observer) } + } + return isResumed +} + +private class SonarSoundPool(context: Context) { + private val loadedSoundIds = mutableSetOf() + private var pendingSoundId: Int? = null + private var initialized = false + private val soundPool = SoundPool.Builder() + .setMaxStreams(1) + .setAudioAttributes( + AudioAttributes.Builder() + .setUsage(AudioAttributes.USAGE_ASSISTANCE_SONIFICATION) + .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) + .build(), + ) + .build() + private val proximitySound: Int + private val lockSound: Int + + init { + soundPool.setOnLoadCompleteListener { _, sampleId, status -> + if (status == 0) { + loadedSoundIds += sampleId + if (initialized && pendingSoundId == sampleId) { + pendingSoundId = null + play(sampleId, volumeFor(sampleId)) + } + } + } + proximitySound = soundPool.load(context, R.raw.sonar_proximity, 1) + lockSound = soundPool.load(context, R.raw.sonar_lock, 1) + initialized = true + } + + fun playProximity() = play(proximitySound, volume = 0.28f) + + fun playLock() = play(lockSound, volume = 0.36f) + + private fun play(soundId: Int, volume: Float) { + if (soundId in loadedSoundIds) { + soundPool.play(soundId, volume, volume, 1, 0, 1f) + } else { + pendingSoundId = soundId + } + } + + private fun volumeFor(soundId: Int): Float = + if (soundId == lockSound) 0.36f else 0.28f + + fun release() = soundPool.release() +} diff --git a/app/src/main/java/com/onthelevel/feature/level/LevelScreen.kt b/app/src/main/java/com/onthelevel/feature/level/LevelScreen.kt index 53e3297..cf496dd 100644 --- a/app/src/main/java/com/onthelevel/feature/level/LevelScreen.kt +++ b/app/src/main/java/com/onthelevel/feature/level/LevelScreen.kt @@ -22,11 +22,13 @@ import androidx.compose.material3.SegmentedButtonDefaults import androidx.compose.material3.SingleChoiceSegmentedButtonRow import androidx.compose.material3.Surface import androidx.compose.material3.Text +import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment @@ -49,6 +51,7 @@ import com.onthelevel.core.sensors.SurfacePresentation import com.onthelevel.core.settings.MeasurementUnits import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach +import kotlinx.coroutines.launch import java.util.Locale /** @@ -75,12 +78,15 @@ fun LevelScreen(container: AppContainer, onOpenSurfaceCalibration: () -> Unit) { .collectAsStateWithLifecycle(initialValue = EdgeCalibration.NONE) val hapticsEnabled by container.settings.hapticsEnabled .collectAsStateWithLifecycle(initialValue = true) + val audioCueEnabled by container.settings.audioCueEnabled + .collectAsStateWithLifecycle(initialValue = false) val reducedMotion by container.settings.reducedMotion .collectAsStateWithLifecycle(initialValue = false) val measurementUnits by container.settings.measurementUnits .collectAsStateWithLifecycle(initialValue = MeasurementUnits.METRIC) val view = LocalView.current + val scope = rememberCoroutineScope() val lockDetector = remember { LockDetector() } LaunchedEffect(mode) { lockDetector.reset() } @@ -91,6 +97,7 @@ fun LevelScreen(container: AppContainer, onOpenSurfaceCalibration: () -> Unit) { .onEach { if (it.fireFeedback && hapticsEnabled) view.performConfirmHaptic() } } val reading by readingFlow.collectAsStateWithLifecycle(initialValue = null) + AudioLevelAssist(reading, audioCueEnabled) val isLocked = reading?.isLocked == true val isCalibrated = when (mode) { @@ -116,12 +123,23 @@ fun LevelScreen(container: AppContainer, onOpenSurfaceCalibration: () -> Unit) { color = if (isCalibrated) LevelColors.LimeLock else LevelColors.TextFaint, ) } - IconButton(onClick = onOpenSurfaceCalibration) { - Icon( - Icons.Outlined.Settings, - contentDescription = "Calibration and settings", - tint = LevelColors.TextDim, - ) + Row(verticalAlignment = Alignment.CenterVertically) { + TextButton(onClick = { + scope.launch { container.settings.setAudioCueEnabled(!audioCueEnabled) } + }) { + Text( + text = if (audioCueEnabled) "SONAR ON" else "SONAR OFF", + style = MaterialTheme.typography.labelSmall, + color = if (audioCueEnabled) LevelColors.LimeLockText else LevelColors.TextDim, + ) + } + IconButton(onClick = onOpenSurfaceCalibration) { + Icon( + Icons.Outlined.Settings, + contentDescription = "Calibration and settings", + tint = LevelColors.TextDim, + ) + } } } @@ -183,7 +201,17 @@ fun LevelScreen(container: AppContainer, onOpenSurfaceCalibration: () -> Unit) { ) if (mode == LevelMode.SURFACE && surfacePresentation == SurfacePresentation.FACE_UP) { Spacer(Modifier.height(8.dp)) - SurfaceAdjustmentInfo(reading, measurementUnits) + // This slot stays the same height for Settling, guidance, and + // level states so a stable phone never makes the instrument + // jump as its correction copy changes. + Box( + modifier = Modifier + .fillMaxWidth() + .height(56.dp), + contentAlignment = Alignment.TopCenter, + ) { + SurfaceAdjustmentInfo(reading, measurementUnits) + } } } } @@ -215,32 +243,34 @@ fun LevelScreen(container: AppContainer, onOpenSurfaceCalibration: () -> Unit) { */ @Composable private fun SurfaceAdjustmentInfo(reading: LevelReading?, units: MeasurementUnits) { - if (reading == null) return + Column(horizontalAlignment = Alignment.CenterHorizontally) { + if (reading == null) return@Column + + if (reading.isSettling) { + Text( + text = "Settling", + style = MaterialTheme.typography.labelSmall, + color = LevelColors.TextDim, + ) + return@Column + } + + val pitch = reading.secondaryADegrees ?: return@Column + val roll = reading.secondaryBDegrees ?: return@Column + val highLabel = SurfaceGuidance.from(pitch, roll).highLabel ?: return@Column - if (reading.isSettling) { Text( - text = "Settling", + text = highLabel, + style = MaterialTheme.typography.headlineMedium, + color = LevelColors.Amber, + textAlign = TextAlign.Center, + ) + Text( + text = formatRiseRun(reading.displayPrimaryDegrees, units), style = MaterialTheme.typography.labelSmall, color = LevelColors.TextDim, ) - return } - - val pitch = reading.secondaryADegrees ?: return - val roll = reading.secondaryBDegrees ?: return - val highLabel = SurfaceGuidance.from(pitch, roll).highLabel ?: return - - Text( - text = highLabel, - style = MaterialTheme.typography.headlineMedium, - color = LevelColors.Amber, - textAlign = TextAlign.Center, - ) - Text( - text = formatRiseRun(reading.displayPrimaryDegrees, units), - style = MaterialTheme.typography.labelSmall, - color = LevelColors.TextDim, - ) } @Composable diff --git a/app/src/main/res/raw/sonar_lock.wav b/app/src/main/res/raw/sonar_lock.wav new file mode 100644 index 0000000000000000000000000000000000000000..2c2e3072e9f5cbd38c2df398986636d625a71724 GIT binary patch literal 51200 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

h&F-^k;Lt3ry51`RcZ^(-09f$NAEA5lau)`IBaP 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%0AVD zTBw)PO;nZCHTha*n4&tooxeFnM_%R9`-p%_vVP9w3A^{H2;T(7S75oypKI*t7LoE9 zM1QrCoT~d0CM368QHc9NI(swtnH9Pw??fy;$m{(fKV^u{g7V}nY-N9?$+;5()*6TJF*)Z`pb z+TW;Zdq}jD;8^z2re{@o_pADDG>6E~Pi2`jorGsxpQnoma#D!n�zwz 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 YEle<#)lhJu|GKQ$NtB6HuORjQKL&CL=Kufz literal 0 HcmV?d00001 diff --git a/app/src/test/java/com/onthelevel/core/audio/AudioAssistStateMachineTest.kt b/app/src/test/java/com/onthelevel/core/audio/AudioAssistStateMachineTest.kt new file mode 100644 index 0000000..ec3e015 --- /dev/null +++ b/app/src/test/java/com/onthelevel/core/audio/AudioAssistStateMachineTest.kt @@ -0,0 +1,65 @@ +package com.onthelevel.core.audio + +import com.onthelevel.core.sensors.SurfacePresentation +import org.junit.Assert.assertEquals +import org.junit.Assert.assertNull +import org.junit.Test + +class AudioAssistStateMachineTest { + + private val machine = AudioAssistStateMachine() + + private fun input( + degrees: Double = 2.0, + nowMillis: Long = 0, + enabled: Boolean = true, + foreground: Boolean = true, + placementOk: Boolean = true, + presentation: SurfacePresentation? = SurfacePresentation.FACE_UP, + settling: Boolean = false, + locked: Boolean = false, + fireLockFeedback: Boolean = false, + ) = AudioAssistStateMachine.Input( + isEnabled = enabled, + isAppForeground = foreground, + placementOk = placementOk, + surfacePresentation = presentation, + isSettling = settling, + displayPrimaryDegrees = degrees, + isLocked = locked, + fireLockFeedback = fireLockFeedback, + nowMillis = nowMillis, + ) + + @Test + fun `is silent while disabled settling invalid or backgrounded`() { + assertNull(machine.update(input(enabled = false))) + assertNull(machine.update(input(settling = true))) + assertNull(machine.update(input(placementOk = false))) + assertNull(machine.update(input(presentation = SurfacePresentation.NEAR_VERTICAL))) + assertNull(machine.update(input(foreground = false))) + } + + @Test + fun `proximity cadence uses hysteretic bands`() { + assertEquals(AudioAssistStateMachine.Cue.PROXIMITY, machine.update(input(degrees = 1.0, nowMillis = 0))) + assertNull(machine.update(input(degrees = 1.1, nowMillis = 1_199))) // remains Close through exit at 1.2° + assertEquals(AudioAssistStateMachine.Cue.PROXIMITY, machine.update(input(degrees = 1.1, nowMillis = 1_200))) + + // Cross Close's exit but remain in Near: cadence changes without a + // threshold double-ping, then holds Near through 3.4°. + assertNull(machine.update(input(degrees = 1.3, nowMillis = 1_201))) + assertEquals(AudioAssistStateMachine.Cue.PROXIMITY, machine.update(input(degrees = 3.3, nowMillis = 3_400))) + assertNull(machine.update(input(degrees = 3.5, nowMillis = 3_401))) + } + + @Test + fun `lock sound reuses the existing one shot lock transition`() { + assertNull(machine.update(input(degrees = 0.1, locked = true, fireLockFeedback = false))) + assertEquals( + AudioAssistStateMachine.Cue.LOCK, + machine.update(input(degrees = 0.1, locked = true, fireLockFeedback = true, nowMillis = 20)), + ) + assertNull(machine.update(input(degrees = 0.1, locked = true, fireLockFeedback = false, nowMillis = 40))) + } +}