From 58d2fbc94e5a5e01c526c1e303325a59196ae53c Mon Sep 17 00:00:00 2001 From: Alex Hart Date: Wed, 13 Aug 2025 12:39:02 -0300 Subject: [PATCH] Fix proximity locking during voice calls. --- .../webrtc/audio/AudioManagerCompat.java | 29 +++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/webrtc/audio/AudioManagerCompat.java b/app/src/main/java/org/thoughtcrime/securesms/webrtc/audio/AudioManagerCompat.java index f69eff5ab4..16c95fc44b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/webrtc/audio/AudioManagerCompat.java +++ b/app/src/main/java/org/thoughtcrime/securesms/webrtc/audio/AudioManagerCompat.java @@ -97,11 +97,36 @@ public abstract class AudioManagerCompat { } public boolean isSpeakerphoneOn() { - return audioManager.isSpeakerphoneOn(); + if (Build.VERSION.SDK_INT >= 31) { + AudioDeviceInfo audioDeviceInfo = getCommunicationDevice(); + if (audioDeviceInfo == null) { + Log.w(TAG, "isSpeakerphoneOn: Failed to find communication device."); + return false; + } else { + return audioDeviceInfo.getType() == AudioDeviceInfo.TYPE_BUILTIN_SPEAKER; + } + } else { + return audioManager.isSpeakerphoneOn(); + } } public void setSpeakerphoneOn(boolean on) { - audioManager.setSpeakerphoneOn(on); + if (Build.VERSION.SDK_INT >= 31) { + int desiredType = on ? AudioDeviceInfo.TYPE_BUILTIN_SPEAKER : AudioDeviceInfo.TYPE_BUILTIN_EARPIECE; + AudioDeviceInfo candidate = getAvailableCommunicationDevices().stream() + .filter(audioDeviceInfo -> audioDeviceInfo.getType() == desiredType) + .findFirst() + .orElse(null); + + if (candidate != null) { + setCommunicationDevice(candidate); + } else { + Log.w(TAG, "setSpeakerphoneOn: Failed to find candidate for device type {" + desiredType + "}. Falling back on deprecated method."); + audioManager.setSpeakerphoneOn(on); + } + } else { + audioManager.setSpeakerphoneOn(on); + } } public boolean isMicrophoneMute() {