From 9764d5d9d0de64ccbb325095273b3033f92c0402 Mon Sep 17 00:00:00 2001 From: Juha Heinanen Date: Mon, 20 Feb 2023 23:59:52 +0200 Subject: [PATCH] More bluetooth related fixes and improvements --- .../com/tutpro/baresip/BaresipService.kt | 44 ++++++---------- .../kotlin/com/tutpro/baresip/MainActivity.kt | 51 +++++++------------ app/src/main/res/values-fi/strings.xml | 26 +++++----- app/src/main/res/values/strings.xml | 6 ++- 4 files changed, 48 insertions(+), 79 deletions(-) diff --git a/app/src/main/kotlin/com/tutpro/baresip/BaresipService.kt b/app/src/main/kotlin/com/tutpro/baresip/BaresipService.kt index c4aa63c7..f81f6184 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/BaresipService.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/BaresipService.kt @@ -13,6 +13,7 @@ import android.content.IntentFilter import android.content.pm.PackageManager import android.database.ContentObserver import android.media.* +import android.media.AudioManager.MODE_IN_COMMUNICATION import android.media.AudioManager.MODE_NORMAL import android.media.AudioManager.RINGER_MODE_SILENT import android.net.* @@ -46,7 +47,6 @@ import java.util.* import kotlin.concurrent.schedule import kotlin.math.roundToInt - class BaresipService: Service() { internal lateinit var intent: Intent @@ -246,23 +246,13 @@ class BaresipService: Service() { when (state) { BluetoothHeadset.STATE_CONNECTED -> { Log.d(TAG, "Bluetooth headset is connected") - if (audioFocusRequest != null) { - //Handler(Looper.getMainLooper()).postDelayed({ - //am.startBluetoothSco() - startBluetoothSco(am, 1000L) - - //}, 1000) - } - //Timer("Sco", false).schedule(1000) { - // startBluetoothSco(am) - // } + if (audioFocusRequest != null) + startBluetoothSco(am, 1000L, 3) } BluetoothHeadset.STATE_DISCONNECTED -> { Log.d(TAG, "Bluetooth headset is disconnected") - if (isBluetoothScoOn(am)) { - Log.d(TAG, "Stopping Bluetooth SCO") + if (audioFocusRequest != null) stopBluetoothSco(am) - } } } @@ -276,9 +266,6 @@ class BaresipService: Service() { } BluetoothHeadset.STATE_AUDIO_DISCONNECTED -> { Log.d(TAG, "Bluetooth headset audio is disconnected") - if (isBluetoothScoOn(am)) { - stopBluetoothSco(am) - } } } } @@ -778,7 +765,9 @@ class BaresipService: Service() { } "call established" -> { nm.cancel(CALL_NOTIFICATION_ID) - Log.d(TAG, "AoR $aor call $callp established") + Log.d(TAG, "AoR $aor call $callp established in mode ${am.mode}") + if (am.mode != MODE_IN_COMMUNICATION) + am.mode = MODE_IN_COMMUNICATION call!!.status = "connected" call.onhold = false if (ua.account.callHistory) @@ -1571,7 +1560,7 @@ class BaresipService: Service() { isAudioFocused = true if (isBluetoothHeadsetConnected(ctx) /* && !am.isBluetoothScoOn */) { Log.d(TAG, "Starting Bluetooth SCO") - startBluetoothSco(am, 0L) + startBluetoothSco(am, 10L, 1) } am.mode = AudioManager.MODE_IN_COMMUNICATION //if (type == AudioAttributes.CONTENT_TYPE_SPEECH || isBluetoothHeadsetConnected(ctx)) @@ -1616,26 +1605,23 @@ class BaresipService: Service() { false } - private fun startBluetoothSco(am: AudioManager, delay: Long) { - Log.d(TAG, "Starting Bluetooth SCO") + private fun startBluetoothSco(am: AudioManager, delay: Long, count: Int) { + Log.d(TAG, "Starting Bluetooth SCO at count $count") Handler(Looper.getMainLooper()).postDelayed({ - if (VERSION.SDK_INT < 35) + if (VERSION.SDK_INT < 31) { am.startBluetoothSco() - else + } else { Utils.setCommunicationDevice(am, AudioDeviceInfo.TYPE_BLUETOOTH_SCO) - if (!isBluetoothScoOn(am)) { - Log.d(TAG, "Trying to start Bluetooth SCO again") - Handler(Looper.getMainLooper()).postDelayed({ - am.startBluetoothSco() - }, delay) } + if (!isBluetoothScoOn(am) && count > 1) + startBluetoothSco(am, delay, count - 1) }, delay) } private fun stopBluetoothSco(am: AudioManager) { Log.d(TAG, "Stopping Bluetooth SCO") Handler(Looper.getMainLooper()).postDelayed({ - if (VERSION.SDK_INT < 35) + if (VERSION.SDK_INT < 31) am.stopBluetoothSco() else am.clearCommunicationDevice() diff --git a/app/src/main/kotlin/com/tutpro/baresip/MainActivity.kt b/app/src/main/kotlin/com/tutpro/baresip/MainActivity.kt index 73375f0d..359354f5 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/MainActivity.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/MainActivity.kt @@ -680,18 +680,8 @@ class MainActivity : AppCompatActivity() { requestPermissionsLauncher = registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { isGranted: Map -> - Log.e(TAG, "********** isGranted $isGranted") - if (firstRun && isGranted.isEmpty()) { - with(MaterialAlertDialogBuilder(this, R.style.AlertDialogTheme)) { - setTitle("Permissions") - setMessage(getString(R.string.mic_and_bluetooth)) - setPositiveButton(getString(R.string.ok)) { dialog, _ -> - requestPermissionsLauncher.launch(arrayOf(RECORD_AUDIO, BLUETOOTH_CONNECT)) - dialog.dismiss() - } - show() - } - } + if (firstRun && isGranted.isEmpty()) + askMicAndBtPermissions() } if (Preferences(applicationContext).displayTheme != AppCompatDelegate.getDefaultNightMode()) { @@ -707,31 +697,12 @@ class MainActivity : AppCompatActivity() { if (!Utils.checkPermissions(this, arrayOf(RECORD_AUDIO, BLUETOOTH_CONNECT))) if (ActivityCompat.shouldShowRequestPermissionRationale(this, RECORD_AUDIO) || - ActivityCompat.shouldShowRequestPermissionRationale(this, BLUETOOTH_CONNECT)) { - layout.showSnackBar( - binding.root, - if (!Utils.checkPermissions(this, arrayOf(RECORD_AUDIO)) && - !Utils.checkPermissions(this, arrayOf(BLUETOOTH_CONNECT))) - getString(R.string.mic_and_bluetooth) - else if (!Utils.checkPermissions(this, arrayOf(RECORD_AUDIO))) - getString(R.string.no_calls) - else - getString(R.string.no_bluetooth), - Snackbar.LENGTH_INDEFINITE, - getString(R.string.ok) - ) { - requestPermissionsLauncher.launch(arrayOf(RECORD_AUDIO, BLUETOOTH_CONNECT)) - } + ActivityCompat.shouldShowRequestPermissionRationale(this, BLUETOOTH_CONNECT)) { + askMicAndBtPermissions() } else { - requestPermissionsLauncher.launch( - arrayOf( - RECORD_AUDIO, - BLUETOOTH_CONNECT - ) + requestPermissionsLauncher.launch(arrayOf(RECORD_AUDIO, BLUETOOTH_CONNECT) ) } - else - Log.e(TAG, "********** all permissions granted") val action = intent.getStringExtra("action") if (action != null) { @@ -845,6 +816,18 @@ class MainActivity : AppCompatActivity() { } } + private fun askMicAndBtPermissions() { + with(MaterialAlertDialogBuilder(this, R.style.AlertDialogTheme)) { + setTitle(getString(R.string.permissions_rationale)) + setMessage(getString(R.string.mic_and_bt_permissions)) + setPositiveButton(getString(R.string.ok)) { dialog, _ -> + requestPermissionsLauncher.launch(arrayOf(RECORD_AUDIO, BLUETOOTH_CONNECT)) + dialog.dismiss() + } + show() + } + } + private fun callAction(intent: Intent) { if (Call.calls().isNotEmpty() || BaresipService.uas.size == 0) return diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index d5cc8ab8..7fe3d1fb 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -503,8 +503,7 @@ Sinulla on jo puhelu käynnissä. Sovelluksen käynnistäminen epäonnistui. Tämä voi johtua virheellisestä Asetukset arvosta. Tarkista Kuunteluosoite, TLS-varmennintiedosto ja TLS CA-tiedosto. - Sen jälkeen käynnistä baresip uudelleen. - + Sen jälkeen käynnistä baresip uudelleen. Tilin \'%1$s\' rekisteröinti epäonnistui. Todennuspyyntö Todennatko SAS:n <%1$s>\? @@ -513,27 +512,22 @@ Puhelu epäonnistui Puhelu on päättynyt Tämä puhelu EI ole turvallinen! - Tämä puhelu on turvallinen, mutta - kohdetta ei ole todennettu! - + Tämä puhelu on turvallinen, mutta kohdetta ei ole + todennettu! Tämä pulelu on turvallinen ja kohde on todennettu! Haluatko poistaa todennuksen\? Poista todennus Sovelluksen tiedot talletettiin tiedostoon \'%1$s\'. Android - versioon 9 saakka tiedosto löytyy Download-kansiosta. - + versioon 9 saakka tiedosto löytyy Download-kansiosta. Sovelluksen tietojen talletus epäonnistui. Android versioon 9 saakka - Tarkista Asetukset → Sovellukset → baresip → Käyttöluvat → Tallennustila. - + Tarkista Asetukset → Sovellukset → baresip → Käyttöluvat → Tallennustila. Uudelleenkäynnistyspyyntö Sovelluksen tiedot palautettiin. baresip pitää käynnistää - uudelleen. Käynnistä uudelleen nyt\? - + uudelleen. Käynnistä uudelleen nyt\? Sovelluksen tietojen palauttaminen epäonnistui. Tarkista, että annoit oikean salasanan ja että palautustiedosto kuuluu tällä sovellukselle. Android versioon 9 saakka tarkista myös Asetukset → Sovellukset → baresip → Käyttöluvat → - Tallennustila ja että tiedosto \'%1$s\' on Download-kansiossa. - + Tallennustila ja että tiedosto \'%1$s\' on Download-kansiossa. Et voi käyttää tätä sovellusta ilman Ilmoitukset-lupaa. Et voi soittaa puheluita tai vastata niihin ilman Mikrofoni-lupaa. Salli Kamera-lupa jotta voit soittaa videopuheluita ja vastata niihin. @@ -544,6 +538,10 @@ Ei verkkoyhteyttä! Valitse puhelinpalvelun tarjoava tili Puhelutiedot - Et voi käyttää Androidin yhteystietoja ilman Yhteystiedot-sovelluslupaa. + Et voi käyttää Androidin yhteystietoja ilman Yhteystiedot-lupaa. Audio fokus evätty! + Tarvittavat luvat + baresip tarvitsee Mikrofoni-luvan puheluita varten ja + Lähellä olevat laitteet -luvan Bluetooth-mikrofonin/kaiuttimen havaitsemista varten, mikäli + sellaista halutaan käyttää. diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9c374c89..730d3855 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -520,6 +520,8 @@ Show Password No network connection! Audio focus denied! - baresip needs \"Microphone\" permission for calls and - \"Nearby devices\" permission for Bluetooth detection. + Permissions rationale + baresip needs \"Microphone\" permission for voice calls and + \"Nearby devices\" permission for Bluetooth microphone/speaker detection if you want to use + such a device.