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 67e90a34ac..c2e2cdcb59 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 @@ -4,6 +4,7 @@ import android.content.Context import android.media.AudioDeviceCallback import android.media.AudioDeviceInfo import android.media.AudioManager +import android.media.MediaRouter import android.net.Uri import androidx.annotation.RequiresApi import org.signal.core.util.logging.Log @@ -25,7 +26,6 @@ class FullSignalAudioManagerApi31(context: Context, eventListener: EventListener private var savedIsSpeakerPhoneOn = false private var savedIsMicrophoneMute = false private var hasWiredHeadset = false - private var hasBluetoothHeadset = false private var autoSwitchToWiredHeadset = true private var autoSwitchToBluetooth = true @@ -175,7 +175,7 @@ class FullSignalAudioManagerApi31(context: Context, eventListener: EventListener } val availableCommunicationDevices: List = androidAudioManager.availableCommunicationDevices availableCommunicationDevices.forEach { Log.d(TAG, "Detected communication device of type: ${it.type}") } - hasBluetoothHeadset = availableCommunicationDevices.any { AudioDeviceMapping.fromPlatformType(it.type) == AudioDevice.BLUETOOTH } + val hasBluetoothHeadset = isBluetoothHeadsetConnected() hasWiredHeadset = availableCommunicationDevices.any { AudioDeviceMapping.fromPlatformType(it.type) == AudioDevice.WIRED_HEADSET } Log.i( TAG, @@ -245,4 +245,10 @@ class FullSignalAudioManagerApi31(context: Context, eventListener: EventListener } } } + + private fun isBluetoothHeadsetConnected(): Boolean { + val mediaRouter = context.getSystemService(Context.MEDIA_ROUTER_SERVICE) as MediaRouter + val liveAudioRoute = mediaRouter.getSelectedRoute(MediaRouter.ROUTE_TYPE_LIVE_AUDIO) + return liveAudioRoute.deviceType == MediaRouter.RouteInfo.DEVICE_TYPE_BLUETOOTH + } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/webrtc/audio/SignalAudioManager.kt b/app/src/main/java/org/thoughtcrime/securesms/webrtc/audio/SignalAudioManager.kt index 0544f69327..6722223108 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/webrtc/audio/SignalAudioManager.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/webrtc/audio/SignalAudioManager.kt @@ -14,7 +14,6 @@ import org.signal.core.util.logging.Log import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.dependencies.ApplicationDependencies import org.thoughtcrime.securesms.recipients.RecipientId -import org.thoughtcrime.securesms.service.webrtc.AndroidTelecomUtil import org.thoughtcrime.securesms.util.safeUnregisterReceiver import org.whispersystems.signalservice.api.util.Preconditions @@ -41,9 +40,7 @@ sealed class SignalAudioManager(protected val context: Context, protected val ev companion object { @JvmStatic fun create(context: Context, eventListener: EventListener?, isGroup: Boolean): SignalAudioManager { - return if (AndroidTelecomUtil.telecomSupported && !isGroup) { - TelecomAwareSignalAudioManager(context, eventListener) - } else if (Build.VERSION.SDK_INT >= 31) { + return if (Build.VERSION.SDK_INT >= 31) { FullSignalAudioManagerApi31(context, eventListener) } else { FullSignalAudioManager(context, eventListener) @@ -409,63 +406,3 @@ class FullSignalAudioManager(context: Context, eventListener: EventListener?) : } } } - -class TelecomAwareSignalAudioManager(context: Context, eventListener: EventListener?) : SignalAudioManager(context, eventListener) { - - override fun setDefaultAudioDevice(recipientId: RecipientId?, newDefaultDevice: AudioDevice, clearUserEarpieceSelection: Boolean) { - if (recipientId != null && AndroidTelecomUtil.getSelectedAudioDevice(recipientId) == AudioDevice.EARPIECE) { - selectAudioDevice(recipientId, newDefaultDevice) - } - } - - override fun initialize() { - val focusedGained = androidAudioManager.requestCallAudioFocus() - if (!focusedGained) { - handler.postDelayed({ androidAudioManager.requestCallAudioFocus() }, 500) - } - - state = State.PREINITIALIZED - } - - override fun start() { - incomingRinger.stop() - outgoingRinger.stop() - - val focusedGained = androidAudioManager.requestCallAudioFocus() - if (!focusedGained) { - handler.postDelayed({ androidAudioManager.requestCallAudioFocus() }, 500) - } - - state = State.RUNNING - } - - override fun stop(playDisconnect: Boolean) { - incomingRinger.stop() - outgoingRinger.stop() - - if (playDisconnect && state != State.UNINITIALIZED) { - val volume: Float = androidAudioManager.ringVolumeWithMinimum() - soundPool.play(disconnectedSoundId, volume, volume, 0, 0, 1.0f) - } - - state = State.UNINITIALIZED - - androidAudioManager.abandonCallAudioFocus() - } - - override fun selectAudioDevice(recipientId: RecipientId?, device: AudioDevice) { - if (recipientId != null) { - selectedAudioDevice = device - AndroidTelecomUtil.selectAudioDevice(recipientId, device) - handler.postDelayed({ AndroidTelecomUtil.selectAudioDevice(recipientId, selectedAudioDevice) }, 1000) - } - } - - override fun startIncomingRinger(ringtoneUri: Uri?, vibrate: Boolean) { - incomingRinger.start(ringtoneUri, vibrate) - } - - override fun startOutgoingRinger() { - outgoingRinger.start(OutgoingRinger.Type.RINGING) - } -}