From 1412dd789e98fd90f08c05d9bbf396ae712b5f39 Mon Sep 17 00:00:00 2001 From: vmfunc Date: Thu, 12 Feb 2026 18:22:58 +0100 Subject: [PATCH] add RecordVoiceMessage audio focus requester for recording separates recording from playback focus - willPausedWhenDucked is false for recording so notification sounds don't interrupt mid-recording Signed-off-by: vmfunc --- .../composer/DefaultVoiceMessageComposerPresenter.kt | 2 +- .../io/element/android/libraries/audio/api/AudioFocus.kt | 1 + .../android/libraries/audio/impl/DefaultAudioFocus.kt | 9 +++++++-- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/voicemessages/composer/DefaultVoiceMessageComposerPresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/voicemessages/composer/DefaultVoiceMessageComposerPresenter.kt index 88d778a955..ad2901fa53 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/voicemessages/composer/DefaultVoiceMessageComposerPresenter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/voicemessages/composer/DefaultVoiceMessageComposerPresenter.kt @@ -249,7 +249,7 @@ class DefaultVoiceMessageComposerPresenter( private fun CoroutineScope.startRecording() = launch { try { - audioFocus.requestAudioFocus(AudioFocusRequester.VoiceMessage) {} + audioFocus.requestAudioFocus(AudioFocusRequester.RecordVoiceMessage) {} voiceRecorder.startRecord() } catch (e: SecurityException) { audioFocus.releaseAudioFocus() diff --git a/libraries/audio/api/src/main/kotlin/io/element/android/libraries/audio/api/AudioFocus.kt b/libraries/audio/api/src/main/kotlin/io/element/android/libraries/audio/api/AudioFocus.kt index 9a3c178b9c..aeccaa9b8a 100644 --- a/libraries/audio/api/src/main/kotlin/io/element/android/libraries/audio/api/AudioFocus.kt +++ b/libraries/audio/api/src/main/kotlin/io/element/android/libraries/audio/api/AudioFocus.kt @@ -11,6 +11,7 @@ package io.element.android.libraries.audio.api enum class AudioFocusRequester { ElementCall, VoiceMessage, + RecordVoiceMessage, MediaViewer, } 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 aa945ea507..28c2f14d81 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 @@ -81,7 +81,8 @@ class DefaultAudioFocus( private fun AudioFocusRequester.toAudioUsage(): Int { return when (this) { AudioFocusRequester.ElementCall, - AudioFocusRequester.VoiceMessage -> AudioAttributes.USAGE_VOICE_COMMUNICATION + AudioFocusRequester.VoiceMessage, + AudioFocusRequester.RecordVoiceMessage -> AudioAttributes.USAGE_VOICE_COMMUNICATION AudioFocusRequester.MediaViewer -> AudioAttributes.USAGE_MEDIA } } @@ -89,7 +90,8 @@ private fun AudioFocusRequester.toAudioUsage(): Int { private fun AudioFocusRequester.toAudioStream(): Int { return when (this) { AudioFocusRequester.ElementCall, - AudioFocusRequester.VoiceMessage -> AudioManager.STREAM_VOICE_CALL + AudioFocusRequester.VoiceMessage, + AudioFocusRequester.RecordVoiceMessage -> AudioManager.STREAM_VOICE_CALL AudioFocusRequester.MediaViewer -> AudioManager.STREAM_MUSIC } } @@ -99,6 +101,9 @@ private fun AudioFocusRequester.willPausedWhenDucked(): Boolean { // (note that for Element Call, there is no action when the focus is lost) AudioFocusRequester.ElementCall, AudioFocusRequester.VoiceMessage -> true + // no audio output to duck when recording, and we don't want notification + // sounds to interrupt a recording via transient focus loss + AudioFocusRequester.RecordVoiceMessage -> false // For the MediaViewer, we let the system automatically handle the ducking // https://developer.android.com/media/optimize/audio-focus#automatic-ducking AudioFocusRequester.MediaViewer -> false