OpenClaw merged PR #103130, "refactor(android): align talk levels and thinking state with iOS/macOS", a focused Android voice polish change that makes Talk, dictation, playback metering, and voice-note amplitude behave more like the Apple clients.
This is not a flashy new channel or model provider. It is the sort of cross-platform consistency work that matters once users start treating OpenClaw voice as an everyday interface.
What Changed
The PR fixes two Android-specific gaps.
First, Android was using a different audio metering curve. The PR says Android measured PCM audio with mean absolute amplitude and voice notes with a linear peak calculation. iOS and macOS use RMS through a shared 50 dB window. That meant the same speaker at the same distance could produce a flatter, less responsive waveform on Android.
The new Android TalkAudioLevel.kt ports the OpenClawKit curve into Kotlin. Dictation, realtime talk input, playback metering, and voice-note amplitude now go through the shared model.
Second, Android's Thinking waveform was tied to user-visible status text. The UI inferred the Thinking phase by matching strings such as "Thinking…" or "Generating voice…". That is brittle: a copy change can accidentally change behavior.
PR #103130 replaces that with a typed awaitingAgent state flow. Status text can now change without breaking the waveform state machine.
Why It Matters
Voice UI lives or dies on feedback. When a user speaks to OpenClaw, the waveform is not decorative. It tells them whether the app is hearing them, whether the agent is thinking, and whether audio is playing back.
If Android's meter is much less responsive than iOS at quiet conversational levels, the user gets a subtly worse experience. It can feel like the app is not listening even when the pipeline is working. Matching the Apple loudness curve reduces that platform gap.
The typed Thinking state is equally important. Voice systems have several overlapping states: capturing, waiting for the agent, speaking, interrupted, disconnected, and failed. Binding one of those states to localized display text makes future UI cleanup risky. A typed boolean is less glamorous, but it is a much better contract.
Tests and Review
The PR touched 12 files with 225 additions and 151 deletions. It reports successful Android ktlint and unit test runs, including AudioLevelsTest, TalkModeManagerTest, VoiceScreenLogicTest, and VoiceNoteRecorderControllerTest.
The test coverage checks the shared curve explicitly. According to the PR, half amplitude now normalizes to about 0.8796, while quiet speech at -40 dBFS reads 0.2 instead of disappearing into a near-zero linear value.
The review pass also caught a subtle status preservation issue: a no-op status republish could have cleared the new flag. That was fixed before merge, and teardown restores now preserve both the visible text and the typed awaiting-agent value together.
User Impact
Android users should see livelier, more consistent voice waves in Talk, dictation, and voice-note flows. The Thinking wave should also be more reliable because it no longer depends on exact status copy.
For OpenClaw maintainers, this also lowers future UI risk. Android can keep refining wording, localization, and status presentation without making the waveform logic chase strings.
Bottom Line
PR #103130 is a voice-quality fix with platform-parity impact. OpenClaw's Android app now uses the same audio-level math and a cleaner Thinking-state contract as iOS and macOS, which should make Talk feel more predictable across devices.
