Gracefully handle invalid audio device selection during calls.

This commit is contained in:
Nicholas Tinsley 2023-06-07 11:24:22 -04:00
parent c491c9dc8c
commit cfc89d2a74
2 changed files with 18 additions and 5 deletions

View file

@ -130,7 +130,12 @@ public abstract class AudioManagerCompat {
@RequiresApi(31) @RequiresApi(31)
public boolean setCommunicationDevice(@NonNull AudioDeviceInfo device) { 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) @RequiresApi(31)

View file

@ -168,8 +168,12 @@ class FullSignalAudioManagerApi31(context: Context, eventListener: EventListener
val availableCommunicationDevices: List<AudioDeviceInfo> = androidAudioManager.availableCommunicationDevices val availableCommunicationDevices: List<AudioDeviceInfo> = androidAudioManager.availableCommunicationDevices
var candidate: AudioDeviceInfo? = userSelectedAudioDevice var candidate: AudioDeviceInfo? = userSelectedAudioDevice
if (candidate != null && candidate.id != 0) { if (candidate != null && candidate.id != 0) {
androidAudioManager.setCommunicationDevice(candidate) val result = androidAudioManager.setCommunicationDevice(candidate)
eventListener?.onAudioDeviceChanged(AudioDeviceMapping.fromPlatformType(candidate.type), availableCommunicationDevices.map { AudioDeviceMapping.fromPlatformType(it.type) }.toSet()) 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 { } else {
val searchOrder: List<AudioDevice> = listOf(AudioDevice.BLUETOOTH, AudioDevice.WIRED_HEADSET, defaultAudioDevice, AudioDevice.EARPIECE, AudioDevice.SPEAKER_PHONE, AudioDevice.NONE).distinct() val searchOrder: List<AudioDevice> = listOf(AudioDevice.BLUETOOTH, AudioDevice.WIRED_HEADSET, defaultAudioDevice, AudioDevice.EARPIECE, AudioDevice.SPEAKER_PHONE, AudioDevice.NONE).distinct()
for (deviceType in searchOrder) { for (deviceType in searchOrder) {
@ -186,8 +190,12 @@ class FullSignalAudioManagerApi31(context: Context, eventListener: EventListener
} }
else -> { else -> {
Log.d(TAG, "Switching to new device of type ${candidate.type} from ${currentAudioDevice?.type}") Log.d(TAG, "Switching to new device of type ${candidate.type} from ${currentAudioDevice?.type}")
androidAudioManager.setCommunicationDevice(candidate) val result = androidAudioManager.setCommunicationDevice(candidate)
eventListener?.onAudioDeviceChanged(AudioDeviceMapping.fromPlatformType(candidate.type), availableCommunicationDevices.map { AudioDeviceMapping.fromPlatformType(it.type) }.toSet()) 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.")
}
} }
} }
} }