Skip to content

fix(android): stop talk mode audio capture on background#99840

Closed
xialonglee wants to merge 2 commits into
openclaw:mainfrom
xialonglee:fix/android-talkmode-background-audio-leak
Closed

fix(android): stop talk mode audio capture on background#99840
xialonglee wants to merge 2 commits into
openclaw:mainfrom
xialonglee:fix/android-talkmode-background-audio-leak

Conversation

@xialonglee

Copy link
Copy Markdown
Contributor

What Problem This Solves

When the Android app moves to the background (MainActivity.onStop()NodeRuntime.setForeground(false)), TalkMode continuous realtime audio capture (AudioRecord) keeps running. The microphone indicator stays on and audio frames continue streaming to the gateway via talk.session.appendAudio.

The root cause is setForeground(false) calls stopManualVoiceSession(), which is guarded to only stop VoiceCaptureMode.ManualMic — when TalkMode is active, it returns immediately without stopping anything:

NodeRuntime.kt:1804  stopManualVoiceSession()
                       → if (mode != ManualMic) return  // TalkMode: no-op

Meanwhile, the TalkMode realtime capture loop (TalkModeManager.kt:750) checks _isEnabled but never checks _isForeground, so AudioRecord.read() continues uninterrupted.

This is inconsistent with the PTT background gate added in e3f46d0926 (#98055), which explicitly blocks starting new Talk captures from the background but does not stop already-running continuous capture.

Why This Change Was Made

A new method stopVoiceCaptureForBackground() replaces stopManualVoiceSession() in setForeground(false). Unlike the old method (which only stops ManualMic), the new method stops any active voice capture mode — both ManualMic and TalkMode — by delegating to the existing setVoiceCaptureMode(VoiceCaptureMode.Off) stop chain.

The approach is minimal (1 file, +7/-1), reuses the proven setVoiceCaptureMode(Off) path that already correctly stops TalkMode's realtimeCaptureJobAudioRecord.stop()/release() and realtimeAppendJob → audio frame streaming. No new stop logic or state machine added.

stopManualVoiceSession() is preserved for its existing caller setVoiceScreenActive(false) (in-app navigation away from the voice screen), where only stopping ManualMic is appropriate.

User Impact

  • Affected users: Anyone using Android TalkMode (continuous conversation mode) who switches to another app or the home screen
  • Before: microphone indicator and foreground service continue; TalkMode keeps capturing and streaming audio in the background
  • After: TalkMode stops cleanly on background, same as ManualMic; microphone indicator and foreground service are removed

Evidence

  • Code path analysis: traced full call chain from MainActivity.onStop()NodeRuntime.setForeground(false)stopManualVoiceSession() no-op → TalkModeManager.realtimeCaptureJob continuing (see analysis above)
  • Review: openclaw-pr-review passed with P2-only findings (test gap — Android Gradle unavailable in this environment; fix path proven through setVoiceCaptureMode(Off) stop chain that is tested indirectly via talkPttStart_rejectsNewCaptureWhenBackgrounded)
  • Android Gradle tests could not run locally (network restriction on Gradle download); the fix reuses the existing setVoiceCaptureMode(Off)talkMode.setEnabled(false)TalkModeManager.stop()stopRealtimeRelay()realtimeCaptureJob.cancel() chain that is the same path exercised by normal TalkMode disable

Behavior addressed: TalkMode AudioRecord continues after app background
Real environment tested: N/A (code-path verification)
Exact steps or command run after this patch: In-app TalkMode active → press Home → verify mic indicator disappears, AudioRecord stopped
Evidence after fix: N/A (requires Android device/emulator with Gradle build)
Observed result after fix: Pending real-device validation
What was not tested: Real-device background transition with TalkMode active (Gradle build unavailable in this environment)

@clawsweeper

clawsweeper Bot commented Jul 4, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs real behavior proof before merge. Reviewed July 5, 2026, 7:02 PM ET / 23:02 UTC.

Summary
This PR changes Android background handling so setForeground(false) turns off all voice capture modes and adds a GatewayBootstrapAuthTest regression for active TalkMode shutdown.

PR surface: Other +18. Total +18 across 2 files.

Reproducibility: yes. from source, but not from a live Android run in this review: start continuous Android TalkMode, press Home, and current main calls the manual-only stop path while the TalkMode capture loop has no foreground gate. The PR also has a focused regression test, though its third-party flavor currently fails before exercising the background stop.

Review metrics: 1 noteworthy metric.

  • Background voice lifecycle policy: 1 lifecycle exit path changed. The PR changes what happens to an already-active Android TalkMode session when the app backgrounds, so maintainers should notice the upgrade behavior before merge.

Merge readiness
Overall: 🧂 unranked krab
Proof: 🧂 unranked krab
Patch quality: 🧂 unranked krab
Result: blocked until real behavior proof is added.

Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch.

Rank-up moves:

  • [P1] Fix GatewayBootstrapAuthTest.backgroundingStopsActiveTalkModeCapture so android-test-third-party passes on the current head.
  • [P1] Add redacted Android device or emulator proof showing continuous TalkMode active, the app backgrounded, and microphone/foreground-service capture stopped.
  • [P1] Have maintainers explicitly accept the foreground-only continuous TalkMode lifecycle behavior before merge.

Proof guidance:

  • [P1] Needs real behavior proof before merge: The PR body still says real-device or emulator validation is pending, and no current-head comment shows after-fix Android proof; add a redacted device/emulator screenshot, recording, logs, or terminal/live output showing continuous TalkMode stops after backgrounding. After adding proof, update the PR body; ClawSweeper should re-review automatically. If it does not, the PR author or someone with repository write access can comment @clawsweeper re-review.

Risk before merge

  • [P1] The latest exact-head android-test-third-party job fails the new GatewayBootstrapAuthTest.backgroundingStopsActiveTalkModeCapture test before it reaches the backgrounding assertion.
  • [P1] No real Android device/emulator proof currently shows active continuous TalkMode backgrounding releasing the microphone, foreground-service mode, or AudioRecord path on this PR head.
  • [P1] Merging intentionally changes lifecycle behavior for any user who expected continuous Android TalkMode capture to keep running after the app backgrounds.

Maintainer options:

  1. Fix the Android test, then require live proof (recommended)
    Repair the failing third-party regression test and require redacted Android device/emulator proof before accepting the compatibility-sensitive lifecycle change.
  2. Merge with maintainer-owned proof gap
    Maintainers can accept the source-level shutdown chain after the test passes, but they would own the missing real-device validation risk.
  3. Close in favor of the batch only after replacement lands
    If fix: land ten small reliability fixes #100483 becomes the chosen landing path, close this PR only after the replacement is merged or otherwise proof-positive and viable.

Next step before merge

  • [P1] A narrow automated repair can address the failing Android regression test on this PR branch; real Android proof and lifecycle-policy acceptance remain pre-merge gates.

Maintainer decision needed

  • Question: Should Android continuous TalkMode be foreground-only, stopping active capture whenever the app backgrounds?
  • Rationale: The code fix is narrow, but the lifecycle policy changes existing upgrade behavior for active continuous TalkMode sessions, and CI cannot decide whether that compatibility change is intended.
  • Likely owner: steipete — He is assigned, added the current regression-test commit, and has the strongest Android Talk lifecycle history in the inspected commits.
  • Options:
    • Accept foreground-only TalkMode after proof (recommended): Fix the failing Android regression test, require redacted device/emulator proof, then merge if maintainers accept that backgrounding stops continuous TalkMode capture.
    • Accept code-path proof only: Maintainers may intentionally merge after the test is fixed using source and unit-test evidence, while owning the remaining real-device proof gap.
    • Pause for background-capture policy: If any supported Android workflow should keep continuous TalkMode alive in the background, pause this PR and define that product policy before changing shutdown behavior.

Security
Cleared: The diff narrows Android background microphone capture and adds a regression test; it does not add dependencies, workflows, permissions, secret handling, or supply-chain execution paths.

Review findings

  • [P2] Fix the third-party TalkMode regression test — apps/android/app/src/test/java/ai/openclaw/app/GatewayBootstrapAuthTest.kt:676
Review details

Best possible solution:

Land a narrow Android lifecycle fix after the regression test passes in both Android flavors and redacted device/emulator proof shows backgrounding active continuous TalkMode stops microphone capture and the foreground-service microphone mode.

Do we have a high-confidence way to reproduce the issue?

Yes from source, but not from a live Android run in this review: start continuous Android TalkMode, press Home, and current main calls the manual-only stop path while the TalkMode capture loop has no foreground gate. The PR also has a focused regression test, though its third-party flavor currently fails before exercising the background stop.

Is this the best way to solve the issue?

Partly. Delegating background shutdown to setVoiceCaptureMode(Off) is the narrow owner-boundary fix, but the current PR head is not merge-ready until the Android third-party test failure and real-behavior proof gap are resolved.

Full review comments:

  • [P2] Fix the third-party TalkMode regression test — apps/android/app/src/test/java/ai/openclaw/app/GatewayBootstrapAuthTest.kt:676
    The latest exact-head android-test-third-party job fails GatewayBootstrapAuthTest > backgroundingStopsActiveTalkModeCapture at this assertion, before the test reaches setForeground(false). Adjust the setup or test shape so it can enter an active TalkMode state in the third-party flavor, or move the coverage to a flavor where TalkMode can be enabled, before relying on this as merge-blocking regression coverage.
    Confidence: 0.88

Overall correctness: patch is incorrect
Overall confidence: 0.88

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning high; reviewed against a905eb42acda.

Label changes

Label changes:

  • add merge-risk: 🚨 compatibility: Merging changes existing Android TalkMode lifecycle behavior by stopping continuous TalkMode on background instead of allowing it to continue.
  • add rating: 🧂 unranked krab: Overall readiness is 🧂 unranked krab; proof is 🧂 unranked krab and patch quality is 🧂 unranked krab.
  • add status: 📣 needs proof: The PR needs real behavior proof before ClawSweeper can clear the contributor ask. Needs real behavior proof before merge: The PR body still says real-device or emulator validation is pending, and no current-head comment shows after-fix Android proof; add a redacted device/emulator screenshot, recording, logs, or terminal/live output showing continuous TalkMode stops after backgrounding. After adding proof, update the PR body; ClawSweeper should re-review automatically. If it does not, the PR author or someone with repository write access can comment @clawsweeper re-review.

Label justifications:

  • P1: The PR addresses active Android microphone capture that can continue after app backgrounding, affecting a real privacy-sensitive voice workflow.
  • merge-risk: 🚨 compatibility: Merging changes existing Android TalkMode lifecycle behavior by stopping continuous TalkMode on background instead of allowing it to continue.
  • rating: 🧂 unranked krab: Overall readiness is 🧂 unranked krab; proof is 🧂 unranked krab and patch quality is 🧂 unranked krab.
  • status: 📣 needs proof: The PR needs real behavior proof before ClawSweeper can clear the contributor ask. Needs real behavior proof before merge: The PR body still says real-device or emulator validation is pending, and no current-head comment shows after-fix Android proof; add a redacted device/emulator screenshot, recording, logs, or terminal/live output showing continuous TalkMode stops after backgrounding. After adding proof, update the PR body; ClawSweeper should re-review automatically. If it does not, the PR author or someone with repository write access can comment @clawsweeper re-review.
Evidence reviewed

PR surface:

Other +18. Total +18 across 2 files.

View PR surface stats
Area Files Added Removed Net
Source 0 0 0 0
Tests 0 0 0 0
Docs 0 0 0 0
Config 0 0 0 0
Generated 0 0 0 0
Other 2 19 1 +18
Total 2 19 1 +18

Acceptance criteria:

  • [P1] cd apps/android && ./gradlew :app:testThirdPartyDebugUnitTest --tests ai.openclaw.app.GatewayBootstrapAuthTest.
  • [P1] cd apps/android && ./gradlew :app:testPlayDebugUnitTest --tests ai.openclaw.app.GatewayBootstrapAuthTest.
  • [P1] git diff --check.

What I checked:

Likely related people:

  • steipete: Commit history shows Peter Steinberger introduced Android Talk mode, wired Talk handoff through native nodes, is assigned on this PR, and added the current regression-test commit. (role: feature introducer and recent area contributor; confidence: high; commits: 86d897cfaa6a, 466f7183207d, 5e6cf5c5212d; files: apps/android/app/src/main/java/ai/openclaw/app/NodeRuntime.kt, apps/android/app/src/main/java/ai/openclaw/app/voice/TalkModeManager.kt, apps/android/app/src/test/java/ai/openclaw/app/GatewayBootstrapAuthTest.kt)
  • obviyus: Recent commits in the central TalkMode manager added continuous realtime mic streaming, Talk transcripts, and relay behavior that this background shutdown path affects. (role: recent Android Talk realtime contributor; confidence: high; commits: 55f4b66a5251, 6940a01e74b4, 70614f88cc05; files: apps/android/app/src/main/java/ai/openclaw/app/voice/TalkModeManager.kt, apps/android/app/src/test/java/ai/openclaw/app/voice/TalkModeManagerTest.kt, apps/android/app/src/main/java/ai/openclaw/app/NodeRuntime.kt)
  • NianJiuZst: The merged foreground/background PTT gate changed the same Android Talk capture policy area shortly before this PR and is explicitly referenced by the PR body. (role: adjacent background Talk capture contributor; confidence: medium; commits: e3f46d0926da; files: apps/android/app/src/main/java/ai/openclaw/app/NodeRuntime.kt, apps/android/app/src/main/java/ai/openclaw/app/voice/TalkModeManager.kt, apps/android/app/src/test/java/ai/openclaw/app/GatewayBootstrapAuthTest.kt)
  • joshavant: Recent foreground-service work marked Android manual mic capture as a microphone foreground-service type in the runtime/service boundary this PR changes for TalkMode shutdown. (role: foreground-service microphone boundary contributor; confidence: medium; commits: 8ab36e4308df; files: apps/android/app/src/main/java/ai/openclaw/app/NodeForegroundService.kt, apps/android/app/src/main/java/ai/openclaw/app/NodeRuntime.kt, apps/android/app/src/test/java/ai/openclaw/app/GatewayBootstrapAuthTest.kt)
What the crustacean ranks mean
  • 🦀 challenger crab: rare, exceptional readiness with strong proof, clean implementation, and convincing validation.
  • 🦞 diamond lobster: very strong readiness with only minor maintainer review expected.
  • 🐚 platinum hermit: good normal PR, likely mergeable with ordinary maintainer review.
  • 🦐 gold shrimp: useful signal, but proof or patch confidence is still limited.
  • 🦪 silver shellfish: thin signal; proof, validation, or implementation needs work.
  • 🧂 unranked krab: not merge-ready because proof is missing/unusable or there are serious correctness or safety concerns.
  • 🌊 off-meta tidepool: rating does not apply to this item.

Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics.

How this review workflow works
  • ClawSweeper keeps one durable marker-backed review comment per issue or PR.
  • Re-runs edit this comment so the latest verdict, findings, and automation markers stay together instead of adding duplicate bot comments.
  • A fresh review can be triggered by eligible @clawsweeper re-review comments, exact-item GitHub events, scheduled/background review runs, or manual workflow dispatch.
  • PR/issue authors and users with repository write access can comment @clawsweeper re-review or @clawsweeper re-run on an open PR or issue to request a fresh review only.
  • Maintainers can also comment @clawsweeper review to request a fresh review only.
  • Fresh-review commands do not start repair, autofix, rebase, CI repair, or automerge.
  • Maintainer-only repair and merge flows require explicit commands such as @clawsweeper autofix, @clawsweeper automerge, @clawsweeper fix ci, or @clawsweeper address review.
  • Maintainers can comment @clawsweeper explain to ask for more context, or @clawsweeper stop to stop active automation.
Review history (3 earlier review cycles)
  • reviewed 2026-07-04T06:23:28.494Z sha 918f2bd :: needs real behavior proof before merge. :: [P2] Remove or inventory the new KDoc string
  • reviewed 2026-07-04T08:09:03.288Z sha f64352a :: needs real behavior proof before merge. :: none
  • reviewed 2026-07-04T08:15:02.864Z sha f64352a :: needs real behavior proof before merge. :: none

@clawsweeper clawsweeper Bot added rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. P1 High-priority user-facing bug, regression, or broken workflow. merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. labels Jul 4, 2026
@xialonglee
xialonglee force-pushed the fix/android-talkmode-background-audio-leak branch from 918f2bd to d0baffb Compare July 4, 2026 07:26
@clawsweeper clawsweeper Bot removed rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. labels Jul 4, 2026
@xialonglee
xialonglee force-pushed the fix/android-talkmode-background-audio-leak branch from dbc144a to f64352a Compare July 4, 2026 08:04
@clawsweeper clawsweeper Bot added rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. and removed rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. labels Jul 4, 2026
@steipete steipete self-assigned this Jul 5, 2026
steipete added a commit that referenced this pull request Jul 5, 2026
xialonglee and others added 2 commits July 5, 2026 23:52
stopVoiceCaptureForBackground() replaces stopManualVoiceSession() in
setForeground(false) so TalkMode realtime capture (AudioRecord) is
stopped when the app moves to the background, matching the existing
PTT background gate added in e3f46d0.
@steipete
steipete force-pushed the fix/android-talkmode-background-audio-leak branch from f64352a to 5e6cf5c Compare July 5, 2026 22:53
@clawsweeper clawsweeper Bot added rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. labels Jul 5, 2026
steipete added a commit that referenced this pull request Jul 5, 2026
* fix(agents): harden LSP process failures

Source: #100450

Co-authored-by: morluto <[email protected]>

* fix(sandbox): report effective workspace layout

Sources: #100435, #100439

Co-authored-by: Aniruddha Adak <[email protected]>

Co-authored-by: ZengWen-DT <[email protected]>

* fix(security): fail install checks on stream errors

Source: #100413

Co-authored-by: 陈宪彪0668000387 <[email protected]>

* fix(android): normalize all-day calendar events

Source: #100032

Co-authored-by: NianJiuZst <[email protected]>

* fix(ios): serialize push-to-talk lifecycle

Source: #99942

Co-authored-by: NianJiuZst <[email protected]>

* fix(talk): reject inherited provider names

Source: #99849

Co-authored-by: zenglingbiao <[email protected]>

* fix(android): stop voice capture in background

Source: #99840

Co-authored-by: xialonglee <[email protected]>

* fix(cron): preserve fallback result classification

Source: #99913

Co-authored-by: jincheng-xydt <[email protected]>

* fix(google): bound Vertex response decompression

Source: #99812

Co-authored-by: 黄剑雄0668001315 <[email protected]>

* fix(plugins): report malformed discovery JSON

Source: #99892

Co-authored-by: 陈宪彪0668000387 <[email protected]>

* test(sandbox): configure non-default workspace fixture

* test: fix small-fix batch validation

---------

Co-authored-by: morluto <[email protected]>
Co-authored-by: ZengWen-DT <[email protected]>
Co-authored-by: 陈宪彪0668000387 <[email protected]>
Co-authored-by: NianJiuZst <[email protected]>
Co-authored-by: zenglingbiao <[email protected]>
Co-authored-by: xialonglee <[email protected]>
Co-authored-by: jincheng-xydt <[email protected]>
Co-authored-by: 黄剑雄0668001315 <[email protected]>
@steipete

steipete commented Jul 5, 2026

Copy link
Copy Markdown
Contributor

Thanks @xialonglee — your Android background TalkMode fix was incorporated into #100483, landed as aaf5ab9. The landed teardown now stops continuous, one-shot, and gateway PTT capture, including the case where public voice mode is already Off. Contributor credit is preserved. Closing this superseded PR.

@steipete steipete closed this Jul 5, 2026
@xialonglee
xialonglee deleted the fix/android-talkmode-background-audio-leak branch July 6, 2026 00:02
steipete added a commit that referenced this pull request Jul 6, 2026
Follow-up hardening for #99840 after the initial fix landed in #100483.

Co-authored-by: xialonglee <[email protected]>
steipete added a commit that referenced this pull request Jul 6, 2026
Follow-up hardening for #99840 after the initial fix landed in #100483.

Co-authored-by: xialonglee <[email protected]>
steipete added a commit that referenced this pull request Jul 6, 2026
Follow-up hardening for #99840 after the initial fix landed in #100483.

Co-authored-by: xialonglee <[email protected]>
steipete added a commit that referenced this pull request Jul 6, 2026
Follow-up hardening for #99840 after the initial fix landed in #100483.

Co-authored-by: xialonglee <[email protected]>
steipete added a commit that referenced this pull request Jul 6, 2026
* fix(android): serialize background PTT lifecycle

Follow-up hardening for #99840 after the initial fix landed in #100483.

Co-authored-by: xialonglee <[email protected]>

* docs(changelog): note Android PTT lifecycle hardening

* fix(android): order PTT ownership transitions

* test(android): opt in to coroutine scheduler API

* fix(android): serialize voice capture ownership

* test(android): drive PTT ordering with test dispatcher

* test(android): isolate PTT ordering preferences

* test(android): control PTT invoke dispatchers

* test(android): isolate PTT coroutine dispatchers

* test(android): use current Robolectric resolver API

* test(android): register speech service without deprecated APIs

* test(android): control stale PTT cleanup dispatch

* test(android): isolate voice mode reassertion

* fix(android): clean voice capture on permission loss

* fix(android): invalidate PTT before cancel wait

* test(android): preserve starts queued after cancel

* fix(android): keep one-shot PTT retries idempotent

---------

Co-authored-by: xialonglee <[email protected]>
@steipete

steipete commented Jul 6, 2026

Copy link
Copy Markdown
Contributor

Thanks @xialonglee — the reported Android background-capture behavior is now fully landed.

  • The foreground/background voice-mode lifecycle from this PR landed through fix: land ten small reliability fixes #100483 in aaf5ab910cbe35c9cbd491c0d1755aa25b413be9.
  • The follow-up lifecycle hardening landed through fix(android): keep stale PTT from restarting capture #100552 in f9bf5f5897630996ab6154de7fda3d5e97135e13, preventing stale push-to-talk preparation or teardown from restarting/stopping a newer capture.
  • Exact-head CI for the hardening passed 67 checks, including both Android flavors, Android build, and QA smoke; the focused Android lifecycle suites also passed in sanitized AWS Crabbox.

The original PR remains closed because its implementation was consolidated into the maintainer landings above, with contributor credit preserved in the changelog. Thank you for identifying and fixing the original issue.

github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request Jul 6, 2026
* fix(agents): harden LSP process failures

Source: openclaw#100450

Co-authored-by: morluto <[email protected]>

* fix(sandbox): report effective workspace layout

Sources: openclaw#100435, openclaw#100439

Co-authored-by: Aniruddha Adak <[email protected]>

Co-authored-by: ZengWen-DT <[email protected]>

* fix(security): fail install checks on stream errors

Source: openclaw#100413

Co-authored-by: 陈宪彪0668000387 <[email protected]>

* fix(android): normalize all-day calendar events

Source: openclaw#100032

Co-authored-by: NianJiuZst <[email protected]>

* fix(ios): serialize push-to-talk lifecycle

Source: openclaw#99942

Co-authored-by: NianJiuZst <[email protected]>

* fix(talk): reject inherited provider names

Source: openclaw#99849

Co-authored-by: zenglingbiao <[email protected]>

* fix(android): stop voice capture in background

Source: openclaw#99840

Co-authored-by: xialonglee <[email protected]>

* fix(cron): preserve fallback result classification

Source: openclaw#99913

Co-authored-by: jincheng-xydt <[email protected]>

* fix(google): bound Vertex response decompression

Source: openclaw#99812

Co-authored-by: 黄剑雄0668001315 <[email protected]>

* fix(plugins): report malformed discovery JSON

Source: openclaw#99892

Co-authored-by: 陈宪彪0668000387 <[email protected]>

* test(sandbox): configure non-default workspace fixture

* test: fix small-fix batch validation

---------

Co-authored-by: morluto <[email protected]>
Co-authored-by: ZengWen-DT <[email protected]>
Co-authored-by: 陈宪彪0668000387 <[email protected]>
Co-authored-by: NianJiuZst <[email protected]>
Co-authored-by: zenglingbiao <[email protected]>
Co-authored-by: xialonglee <[email protected]>
Co-authored-by: jincheng-xydt <[email protected]>
Co-authored-by: 黄剑雄0668001315 <[email protected]>
github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request Jul 6, 2026
* fix(android): serialize background PTT lifecycle

Follow-up hardening for openclaw#99840 after the initial fix landed in openclaw#100483.

Co-authored-by: xialonglee <[email protected]>

* docs(changelog): note Android PTT lifecycle hardening

* fix(android): order PTT ownership transitions

* test(android): opt in to coroutine scheduler API

* fix(android): serialize voice capture ownership

* test(android): drive PTT ordering with test dispatcher

* test(android): isolate PTT ordering preferences

* test(android): control PTT invoke dispatchers

* test(android): isolate PTT coroutine dispatchers

* test(android): use current Robolectric resolver API

* test(android): register speech service without deprecated APIs

* test(android): control stale PTT cleanup dispatch

* test(android): isolate voice mode reassertion

* fix(android): clean voice capture on permission loss

* fix(android): invalidate PTT before cancel wait

* test(android): preserve starts queued after cancel

* fix(android): keep one-shot PTT retries idempotent

---------

Co-authored-by: xialonglee <[email protected]>
giodl73-repo pushed a commit to giodl73-repo/openclaw that referenced this pull request Jul 8, 2026
* fix(android): serialize background PTT lifecycle

Follow-up hardening for openclaw#99840 after the initial fix landed in openclaw#100483.

Co-authored-by: xialonglee <[email protected]>

* docs(changelog): note Android PTT lifecycle hardening

* fix(android): order PTT ownership transitions

* test(android): opt in to coroutine scheduler API

* fix(android): serialize voice capture ownership

* test(android): drive PTT ordering with test dispatcher

* test(android): isolate PTT ordering preferences

* test(android): control PTT invoke dispatchers

* test(android): isolate PTT coroutine dispatchers

* test(android): use current Robolectric resolver API

* test(android): register speech service without deprecated APIs

* test(android): control stale PTT cleanup dispatch

* test(android): isolate voice mode reassertion

* fix(android): clean voice capture on permission loss

* fix(android): invalidate PTT before cancel wait

* test(android): preserve starts queued after cancel

* fix(android): keep one-shot PTT retries idempotent

---------

Co-authored-by: xialonglee <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

app: android App: android merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. P1 High-priority user-facing bug, regression, or broken workflow. rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. size: XS status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants