diff --git a/vector/src/main/AndroidManifest.xml b/vector/src/main/AndroidManifest.xml index da537d312c..396066a608 100644 --- a/vector/src/main/AndroidManifest.xml +++ b/vector/src/main/AndroidManifest.xml @@ -12,7 +12,7 @@ + tools:targetApi="tiramisu" /> diff --git a/vector/src/main/java/im/vector/app/features/widgets/WidgetFragment.kt b/vector/src/main/java/im/vector/app/features/widgets/WidgetFragment.kt index 3b91774f08..0eecedd433 100644 --- a/vector/src/main/java/im/vector/app/features/widgets/WidgetFragment.kt +++ b/vector/src/main/java/im/vector/app/features/widgets/WidgetFragment.kt @@ -20,6 +20,8 @@ import android.app.Activity import android.bluetooth.BluetoothDevice import android.content.Intent import android.content.pm.PackageManager +import android.media.AudioDeviceInfo +import android.media.AudioManager import android.net.Uri import android.os.Build import android.os.Bundle @@ -32,8 +34,10 @@ import android.view.ViewGroup import android.webkit.PermissionRequest import android.webkit.WebMessage import androidx.activity.result.contract.ActivityResultContracts +import androidx.annotation.RequiresApi import androidx.appcompat.app.AlertDialog import androidx.core.content.ContextCompat +import androidx.core.content.getSystemService import androidx.core.view.isInvisible import androidx.core.view.isVisible import com.airbnb.mvrx.Fail @@ -120,6 +124,9 @@ class WidgetFragment : if (checkPermissions(PERMISSIONS_FOR_BLUETOOTH, requireActivity(), scanBluetoothResultLauncher)) { startBluetoothScanning() } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + configureAudioDevice() + } } viewModel.observeViewEvents { @@ -136,6 +143,18 @@ class WidgetFragment : viewModel.handle(WidgetAction.LoadFormattedUrl) } + @RequiresApi(Build.VERSION_CODES.S) + private fun configureAudioDevice() { + requireContext().getSystemService()?.let { audioManager -> + audioManager + .availableCommunicationDevices + .find { it.type == AudioDeviceInfo.TYPE_BLUETOOTH_SCO } + ?.let { bluetoothAudioDevice -> + audioManager.setCommunicationDevice(bluetoothAudioDevice) + } + } + } + private val termsActivityResultLauncher = registerStartForActivityResult { Timber.v("On terms results") if (it.resultCode == Activity.RESULT_OK) { @@ -444,6 +463,7 @@ class WidgetFragment : activity?.let { val widgetUri = Uri.parse(fragmentArgs.baseUrl) + Timber.d("### WidgetFragment.handleBluetoothDeviceData: $event") if (event.data contentEquals byteArrayOf(0x00)) { views.widgetWebView.postWebMessage(WebMessage("pttr"), widgetUri) } else if (event.data contentEquals byteArrayOf(0x01)) { diff --git a/vector/src/main/java/im/vector/app/features/widgets/ptt/BluetoothLowEnergyService.kt b/vector/src/main/java/im/vector/app/features/widgets/ptt/BluetoothLowEnergyService.kt index 2bb834b51a..5d7f53675f 100644 --- a/vector/src/main/java/im/vector/app/features/widgets/ptt/BluetoothLowEnergyService.kt +++ b/vector/src/main/java/im/vector/app/features/widgets/ptt/BluetoothLowEnergyService.kt @@ -141,7 +141,7 @@ class BluetoothLowEnergyService : VectorAndroidService() { private fun onCharacteristicRead(characteristic: BluetoothGattCharacteristic) { @Suppress("DEPRECATION") val data = characteristic.value - Timber.d("### BluetoothLowEnergyService. $data") + Timber.d("### BluetoothLowEnergyService.onCharacteristicRead ${String(data)}") if (data.isNotEmpty()) { callback?.onCharacteristicRead(data) }