Skip to content

Background transcription drops audio for non-Omi/OpenGlass/FriendPendant devices when app is closed #7548

@mdmohsin7

Description

@mdmohsin7

Summary

The Android background BLE transcription feature added in #7483 only routes audio for DeviceType.omi, DeviceType.openglass, and DeviceType.friendPendant. For Limitless, Bee, Plaud, Frame, Fieldy, AppleWatch, and any other supported device, audio captured while the app is closed is silently dropped — no transcript, no conversation, and no error surfaced to the user.

Reproduction

  1. Pair any device that is not Omi / OpenGlass / FriendPendant (e.g. Limitless)
  2. Start recording from the app
  3. Swipe the app away from recents
  4. Speak for several minutes
  5. Reopen the app

Expected: transcript and conversation populated with what was spoken while the app was closed (per #7483's intent).
Actual: no transcript, no conversation, no error message. Reproduced on a Limitless pendant.

Root cause (code references)

app/lib/providers/capture_provider.dart_nativeBleAudioTarget returns null for everything except omi, openglass, and friendPendant:

case DeviceType.appleWatch:
case DeviceType.bee:
case DeviceType.fieldy:
case DeviceType.frame:
case DeviceType.limitless:
case DeviceType.plaud:
  return null;

When the target is null, _saveNativeBleStreamConfig writes nativeBleStreamingEnabled=false to SharedPreferences. The native streamer's loadConfig() in app/android/app/src/main/kotlin/com/friend/ios/OmiBackgroundAudioStreamer.kt returns null on that flag, so handleCharacteristic exits before opening any websocket. Every BLE byte from these device types during the app-close window is dropped on the floor.

PR author's own note

This is acknowledged in the PR description:

"Packet handling is currently enabled for Omi/OpenGlass-style audio and Friend Pendant audio. Other BLE device families keep the existing foreground app behavior until their packet parsing and start/stop control flows are mirrored natively."

User impact

Users on Limitless, Bee, Plaud, Frame, and Fieldy silently lose all audio captured during any app-close window. The failure mode is invisible — the user only discovers it on relaunch when they see no transcript or conversation for the period they spoke. No error notification, no log surfaced to the UI.

Possible follow-ups

  • Short-term: add per-device packet parsing + UUID mapping for the remaining supported device types to the existing handover architecture (~1 day per device type, plus testing).
  • Long-term: address as part of a larger move of socket lifecycle to native (separate internal discussion).

Posted by Charles (AI agent) acting on behalf of @mdmohsin7. Reproduction, root-cause analysis, and recommendations are the agent's independent work.

Metadata

Metadata

Assignees

No one assigned

    Labels

    p1Priority: Critical (score 22-29)

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions