From 5f0d026225baac35c4e9c4553cdeb9987e811728 Mon Sep 17 00:00:00 2001 From: Gianluca Iavicoli Date: Tue, 24 Mar 2026 13:53:42 +0100 Subject: [PATCH] Fix voice recording being interrupted by notifications sounds (#6438) --- .../libraries/audio/impl/DefaultAudioFocus.kt | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/libraries/audio/impl/src/main/kotlin/io/element/android/libraries/audio/impl/DefaultAudioFocus.kt b/libraries/audio/impl/src/main/kotlin/io/element/android/libraries/audio/impl/DefaultAudioFocus.kt index ca1f7b35c4..faab73593e 100644 --- a/libraries/audio/impl/src/main/kotlin/io/element/android/libraries/audio/impl/DefaultAudioFocus.kt +++ b/libraries/audio/impl/src/main/kotlin/io/element/android/libraries/audio/impl/DefaultAudioFocus.kt @@ -39,10 +39,17 @@ class DefaultAudioFocus( AudioManager.AUDIOFOCUS_GAIN -> { // Do nothing } - AudioManager.AUDIOFOCUS_LOSS, + AudioManager.AUDIOFOCUS_LOSS -> { + // Permanent focus loss (e.g., phone call) — always stop/pause. + onFocusLost() + } AudioManager.AUDIOFOCUS_LOSS_TRANSIENT, AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK -> { - onFocusLost() + // For recording, ignore transient focus losses (e.g., notification sounds). + // The AudioRecord API keeps capturing regardless. + if (requester != AudioFocusRequester.RecordVoiceMessage) { + onFocusLost() + } } } } @@ -51,7 +58,12 @@ class DefaultAudioFocus( val audioAttributes = AudioAttributes.Builder() .setUsage(requester.toAudioUsage()) .build() - val request = AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN) + val focusGain = if (requester == AudioFocusRequester.RecordVoiceMessage) { + AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE + } else { + AudioManager.AUDIOFOCUS_GAIN + } + val request = AudioFocusRequest.Builder(focusGain) .setAudioAttributes(audioAttributes) .setOnAudioFocusChangeListener(listener) .setWillPauseWhenDucked(requester.willPausedWhenDucked())