mirror of
https://github.com/signalapp/Signal-Android.git
synced 2025-12-23 20:48:43 +00:00
Gracefully handle invalid audio device selection during calls.
This commit is contained in:
@@ -130,7 +130,12 @@ public abstract class AudioManagerCompat {
|
|||||||
|
|
||||||
@RequiresApi(31)
|
@RequiresApi(31)
|
||||||
public boolean setCommunicationDevice(@NonNull AudioDeviceInfo device) {
|
public boolean setCommunicationDevice(@NonNull AudioDeviceInfo device) {
|
||||||
|
try {
|
||||||
return audioManager.setCommunicationDevice(device);
|
return audioManager.setCommunicationDevice(device);
|
||||||
|
} catch (IllegalArgumentException e) {
|
||||||
|
Log.w(TAG, "Invalid device chosen.", e);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@RequiresApi(31)
|
@RequiresApi(31)
|
||||||
|
|||||||
@@ -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)
|
||||||
|
if (result) {
|
||||||
eventListener?.onAudioDeviceChanged(AudioDeviceMapping.fromPlatformType(candidate.type), availableCommunicationDevices.map { AudioDeviceMapping.fromPlatformType(it.type) }.toSet())
|
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)
|
||||||
|
if (result) {
|
||||||
eventListener?.onAudioDeviceChanged(AudioDeviceMapping.fromPlatformType(candidate.type), availableCommunicationDevices.map { AudioDeviceMapping.fromPlatformType(it.type) }.toSet())
|
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.")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user