From cfc89d2a74bc4ed7e6f4f75fa0e1b64facdbd5a6 Mon Sep 17 00:00:00 2001 From: Nicholas Tinsley Date: Wed, 7 Jun 2023 11:24:22 -0400 Subject: [PATCH] Gracefully handle invalid audio device selection during calls. --- .../webrtc/audio/AudioManagerCompat.java | 7 ++++++- .../webrtc/audio/FullSignalAudioManagerApi31.kt | 16 ++++++++++++---- 2 files changed, 18 insertions(+), 5 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 2b612a3251..ff68327692 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 @@ -130,7 +130,12 @@ public abstract class AudioManagerCompat { @RequiresApi(31) public boolean setCommunicationDevice(@NonNull AudioDeviceInfo device) { - return audioManager.setCommunicationDevice(device); + try { + return audioManager.setCommunicationDevice(device); + } catch (IllegalArgumentException e) { + Log.w(TAG, "Invalid device chosen.", e); + return false; + } } @RequiresApi(31) diff --git a/app/src/main/java/org/thoughtcrime/securesms/webrtc/audio/FullSignalAudioManagerApi31.kt b/app/src/main/java/org/thoughtcrime/securesms/webrtc/audio/FullSignalAudioManagerApi31.kt index 1b212ac320..b5c5c3b7d0 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/webrtc/audio/FullSignalAudioManagerApi31.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/webrtc/audio/FullSignalAudioManagerApi31.kt @@ -168,8 +168,12 @@ class FullSignalAudioManagerApi31(context: Context, eventListener: EventListener val availableCommunicationDevices: List = androidAudioManager.availableCommunicationDevices var candidate: AudioDeviceInfo? = userSelectedAudioDevice if (candidate != null && candidate.id != 0) { - androidAudioManager.setCommunicationDevice(candidate) - eventListener?.onAudioDeviceChanged(AudioDeviceMapping.fromPlatformType(candidate.type), availableCommunicationDevices.map { AudioDeviceMapping.fromPlatformType(it.type) }.toSet()) + val result = androidAudioManager.setCommunicationDevice(candidate) + if (result) { + eventListener?.onAudioDeviceChanged(AudioDeviceMapping.fromPlatformType(candidate.type), availableCommunicationDevices.map { AudioDeviceMapping.fromPlatformType(it.type) }.toSet()) + } else { + Log.w(TAG, "Failed to set ${candidate.id} as communication device.") + } } else { val searchOrder: List = listOf(AudioDevice.BLUETOOTH, AudioDevice.WIRED_HEADSET, defaultAudioDevice, AudioDevice.EARPIECE, AudioDevice.SPEAKER_PHONE, AudioDevice.NONE).distinct() for (deviceType in searchOrder) { @@ -186,8 +190,12 @@ class FullSignalAudioManagerApi31(context: Context, eventListener: EventListener } else -> { Log.d(TAG, "Switching to new device of type ${candidate.type} from ${currentAudioDevice?.type}") - androidAudioManager.setCommunicationDevice(candidate) - eventListener?.onAudioDeviceChanged(AudioDeviceMapping.fromPlatformType(candidate.type), availableCommunicationDevices.map { AudioDeviceMapping.fromPlatformType(it.type) }.toSet()) + val result = androidAudioManager.setCommunicationDevice(candidate) + if (result) { + eventListener?.onAudioDeviceChanged(AudioDeviceMapping.fromPlatformType(candidate.type), availableCommunicationDevices.map { AudioDeviceMapping.fromPlatformType(it.type) }.toSet()) + } else { + Log.w(TAG, "Failed to set ${candidate.id} as communication device.") + } } } }