From d3162b82eda3dc051acf5f5a78d10aad51dbc3ec Mon Sep 17 00:00:00 2001 From: Juha Heinanen Date: Fri, 15 Nov 2019 15:11:41 +0200 Subject: [PATCH] - Improved asking of permissions and acting on the answers. --- .../com/tutpro/baresip/BaresipService.kt | 5 +- .../com/tutpro/baresip/ConfigActivity.kt | 42 +++++++++-- .../kotlin/com/tutpro/baresip/MainActivity.kt | 74 ++++++++++++------- .../main/kotlin/com/tutpro/baresip/Utils.kt | 10 ++- app/src/main/res/values-bg/strings.xml | 1 - app/src/main/res/values-es/strings.xml | 1 - app/src/main/res/values-fi/strings.xml | 17 +++-- app/src/main/res/values-nb-rNO/strings.xml | 1 - app/src/main/res/values-ro/strings.xml | 1 - app/src/main/res/values/strings.xml | 7 +- 10 files changed, 108 insertions(+), 51 deletions(-) diff --git a/app/src/main/kotlin/com/tutpro/baresip/BaresipService.kt b/app/src/main/kotlin/com/tutpro/baresip/BaresipService.kt index ab4730e9..794610b2 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/BaresipService.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/BaresipService.kt @@ -529,7 +529,10 @@ class BaresipService: Service() { } "call incoming" -> { val peerUri = Api.call_peeruri(callp) - if ((Call.calls().size > 0) || (tm.callState != TelephonyManager.CALL_STATE_IDLE)) { + if ((Call.calls().size > 0) || + (tm.callState != TelephonyManager.CALL_STATE_IDLE) || + !Utils.checkPermission(applicationContext, + android.Manifest.permission.RECORD_AUDIO)) { Log.d(LOG_TAG, "Auto-rejecting incoming call $uap/$callp/$peerUri") Api.ua_hangup(uap, callp, 486, "Busy Here") if (ua.account.callHistory) { diff --git a/app/src/main/kotlin/com/tutpro/baresip/ConfigActivity.kt b/app/src/main/kotlin/com/tutpro/baresip/ConfigActivity.kt index 4f71b91b..93bb5e57 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/ConfigActivity.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/ConfigActivity.kt @@ -1,11 +1,9 @@ package com.tutpro.baresip import android.app.Activity -import android.content.Context import android.content.Intent +import android.content.pm.PackageManager import android.graphics.Color -import android.net.ConnectivityManager -import android.os.Build import android.os.Bundle import android.support.v7.app.AppCompatActivity import android.util.TypedValue @@ -48,6 +46,10 @@ class ConfigActivity : AppCompatActivity() { private var save = false private var restart = false private val audioModules = listOf("opus", "amr", "ilbc", "g722", "g7221", "g726", "g711") + private var menu: Menu? = null + + private val READ_CERT_PERMISSION_CODE = 1 + private val READ_CA_PERMISSION_CODE = 2 override fun onCreate(savedInstanceState: Bundle?) { @@ -182,6 +184,9 @@ class ConfigActivity : AppCompatActivity() { val inflater = menuInflater inflater.inflate(R.menu.check_icon, menu) + + this.menu = menu + return true } @@ -253,7 +258,8 @@ class ConfigActivity : AppCompatActivity() { if (certificateFile.isChecked != oldCertificateFile) { if (certificateFile.isChecked) { if (!Utils.requestPermission(this, - android.Manifest.permission.READ_EXTERNAL_STORAGE)) + android.Manifest.permission.READ_EXTERNAL_STORAGE, + READ_CERT_PERMISSION_CODE)) return false val content = Utils.getFileContents(BaresipService.downloadsPath + "/cert.pem") if (content == null) { @@ -275,9 +281,11 @@ class ConfigActivity : AppCompatActivity() { if (caFile.isChecked != oldCAFile) { if (caFile.isChecked) { if (!Utils.requestPermission(this, - android.Manifest.permission.READ_EXTERNAL_STORAGE)) + android.Manifest.permission.READ_EXTERNAL_STORAGE, + READ_CA_PERMISSION_CODE)) return false - val content = Utils.getFileContents(BaresipService.downloadsPath + "/ca_certs.crt") + val content = Utils.getFileContents(BaresipService.downloadsPath + + "/ca_certs.crt") if (content == null) { Utils.alertView(this, getString(R.string.error), getString(R.string.read_ca_certs_error)) @@ -414,6 +422,28 @@ class ConfigActivity : AppCompatActivity() { } + override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, + grantResults: IntArray) { + + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + + when (requestCode) { + READ_CERT_PERMISSION_CODE -> + if (grantResults.isNotEmpty() && (grantResults[0] == + PackageManager.PERMISSION_GRANTED)) + menu!!.performIdentifierAction(R.id.checkIcon, 0) + else + certificateFile.isChecked = false + READ_CA_PERMISSION_CODE -> + if ((grantResults.size > 0) && (grantResults[0] == + PackageManager.PERMISSION_GRANTED)) + menu!!.performIdentifierAction(R.id.checkIcon, 0) + else + caFile.isChecked = false + } + + } + override fun onBackPressed() { BaresipService.activities.removeAt(0) diff --git a/app/src/main/kotlin/com/tutpro/baresip/MainActivity.kt b/app/src/main/kotlin/com/tutpro/baresip/MainActivity.kt index c5cb73e6..980a06e4 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/MainActivity.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/MainActivity.kt @@ -6,8 +6,6 @@ import android.app.NotificationManager import android.app.AlarmManager import android.app.PendingIntent import android.content.* -import android.support.v4.app.ActivityCompat -import android.support.v4.content.ContextCompat import android.support.v7.app.AlertDialog import android.support.v7.app.AppCompatActivity import android.content.pm.PackageManager @@ -110,7 +108,6 @@ class MainActivity : AppCompatActivity() { override fun onTick(millisUntilFinished: Long) { Log.d("Baresip", "Seconds remaining: ${millisUntilFinished / 1000}") } - override fun onFinish() { when (stopState) { "initial" -> { @@ -129,13 +126,6 @@ class MainActivity : AppCompatActivity() { } } - if (ContextCompat.checkSelfPermission(this, - Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) { - Log.w("Baresip", "Baresip does not have RECORD_AUDIO permission") - ActivityCompat.requestPermissions(this, - arrayOf(Manifest.permission.RECORD_AUDIO), PERMISSION_REQUEST_CODE) - } - uaAdapter = UaSpinnerAdapter(applicationContext, BaresipService.uas, BaresipService.status) aorSpinner.adapter = uaAdapter aorSpinner.setSelection(-1) @@ -150,7 +140,6 @@ class MainActivity : AppCompatActivity() { showCall(ua) updateIcons(acc) } - override fun onNothingSelected(parent: AdapterView<*>) { Log.d("Baresip", "Nothing selected") } @@ -433,6 +422,8 @@ class MainActivity : AppCompatActivity() { if (!BaresipService.isServiceRunning) { baresipService.setAction("Start") startService(baresipService) + Utils.requestPermission(this, Manifest.permission.RECORD_AUDIO, + RECORD_PERMISSION_REQUEST_CODE) } if (intent.hasExtra("onStartup")) @@ -649,12 +640,7 @@ class MainActivity : AppCompatActivity() { } "call incoming" -> { val callp = params[1] - if (ContextCompat.checkSelfPermission(applicationContext, - Manifest.permission.RECORD_AUDIO) == - PackageManager.PERMISSION_DENIED) { - Toast.makeText(applicationContext, - getString(R.string.no_microphone_permission), - Toast.LENGTH_SHORT).show() + if (!Utils.checkPermission(this, Manifest.permission.RECORD_AUDIO)) { Api.ua_hangup(uap, callp, 486, "Busy Here") return } @@ -895,13 +881,13 @@ class MainActivity : AppCompatActivity() { startActivityForResult(i, ACCOUNTS_CODE) } R.id.backup -> { - if (Utils.requestPermission(this, - android.Manifest.permission.WRITE_EXTERNAL_STORAGE)) - askPassword(getString(R.string.encrypt_password)) + if (Utils.requestPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE, + BACKUP_PERMISSION_REQUEST_CODE)) + askPassword(getString(R.string.encrypt_password)) } R.id.restore -> { - if (Utils.requestPermission(this, - android.Manifest.permission.READ_EXTERNAL_STORAGE)) + if (Utils.requestPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE, + RESTORE_PERMISSION_REQUEST_CODE)) askPassword(getString(R.string.decrypt_password)) } R.id.about -> { @@ -915,6 +901,36 @@ class MainActivity : AppCompatActivity() { return true } + override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, + grantResults: IntArray) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + + when (requestCode) { + + RECORD_PERMISSION_REQUEST_CODE -> + if ((grantResults.size > 0) && (grantResults[0] != PackageManager.PERMISSION_GRANTED)) + Toast.makeText(applicationContext, getString(R.string.no_calls), + Toast.LENGTH_LONG).show() + else + Utils.requestPermission(this, Manifest.permission.READ_PHONE_STATE, + PHONE_PERMISSION_REQUEST_CODE) + + PHONE_PERMISSION_REQUEST_CODE -> + if ((grantResults.size > 0) && (grantResults[0] != PackageManager.PERMISSION_GRANTED)) + Toast.makeText(applicationContext, getString(R.string.no_call_awareness), + Toast.LENGTH_LONG).show() + + BACKUP_PERMISSION_REQUEST_CODE -> + if ((grantResults.size > 0) && (grantResults[0] == PackageManager.PERMISSION_GRANTED)) + askPassword(getString(R.string.encrypt_password)) + + RESTORE_PERMISSION_REQUEST_CODE -> + if ((grantResults.size > 0) && (grantResults[0] == PackageManager.PERMISSION_GRANTED)) + askPassword(getString(R.string.decrypt_password)) + + } + } + private fun quitRestart(reStart: Boolean) { if (stopState == "initial") { Log.d("Baresip", "quitRestart Restart = $restart") @@ -1086,10 +1102,9 @@ class MainActivity : AppCompatActivity() { } private fun call(ua: UserAgent, uri: String, status: String): Boolean { - if (ContextCompat.checkSelfPermission(applicationContext, Manifest.permission.RECORD_AUDIO) - == PackageManager.PERMISSION_DENIED) { - Toast.makeText(applicationContext, - getString(R.string.no_microphone_permission), Toast.LENGTH_SHORT).show() + if (Utils.checkPermission(this, Manifest.permission.RECORD_AUDIO)) { + Toast.makeText(applicationContext, getString(R.string.no_calls), + Toast.LENGTH_LONG).show() return false } if (ua != UserAgent.uas()[aorSpinner.selectedItemPosition]) spinToAor(ua.account.aor) @@ -1361,8 +1376,11 @@ class MainActivity : AppCompatActivity() { const val CHATS_CODE = 8 const val CHAT_CODE = 9 - const val PERMISSION_REQUEST_CODE = 1 - const val RESTART_REQUEST_CODE = 2 + const val BACKUP_PERMISSION_REQUEST_CODE = 1 + const val RESTORE_PERMISSION_REQUEST_CODE = 2 + const val RECORD_PERMISSION_REQUEST_CODE = 3 + const val PHONE_PERMISSION_REQUEST_CODE = 4 + const val RESTART_REQUEST_CODE = 5 } diff --git a/app/src/main/kotlin/com/tutpro/baresip/Utils.kt b/app/src/main/kotlin/com/tutpro/baresip/Utils.kt index 7244ec0c..63ef5539 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/Utils.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/Utils.kt @@ -307,11 +307,15 @@ object Utils { } } - fun requestPermission(ctx: Context, permission: String) : Boolean { + + fun checkPermission(ctx: Context, permission: String) : Boolean { + return ContextCompat.checkSelfPermission(ctx, permission) == PackageManager.PERMISSION_GRANTED + } + + fun requestPermission(ctx: Context, permission: String, requestCode: Int) : Boolean { if (ContextCompat.checkSelfPermission(ctx, permission) != PackageManager.PERMISSION_GRANTED) { Log.w("Baresip", "Baresip does not have $permission permission") - ActivityCompat.requestPermissions(ctx as Activity, arrayOf(permission), - MainActivity.PERMISSION_REQUEST_CODE) + ActivityCompat.requestPermissions(ctx as Activity, arrayOf(permission), requestCode) return false } return true diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index c8f90f0a..38898262 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -271,7 +271,6 @@ Те са нулирани. Рестартирайте baresip. Регистрация на \`%1$s\` се провали. - Не сте дали разрешение за микрофон. Потвърди Искате ли да потвърдите <%1$s> <%2$s>? Приемате ли да прехвърлите обаждане до \'%1$s\'? diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 255f6c2e..52add6ab 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -268,7 +268,6 @@ Baresip no pudo iniciar. Esto puede deberse a una dirección de escucha no válida o archivo TLS. Han sido reiniciados. Reiniciar baresip. Registro de \`%1$s\` ha fallado. - No ha otorgado permiso de micrófono. Verificar ¿Quieres verificar SAS <%1$s> <%2$s>? ¿Aceptas transferir la llamada a \'%1$s\'? diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index b9944dba..82cdd609 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -105,11 +105,9 @@ "Uuden tilin luonti epäonnistui. - Salasana - Salasana - Haluatko poistaa tilin - \'%1$s\'? - + Tallenna salasanalla + Palauta salasanalla + Haluatko poistaa tilin \'%1$s\'? Vastaa Hylkää @@ -296,9 +294,6 @@ baresip uudelleen. Tilin \'%1$s\' rekisteröinti epäonnistui. - Et ole sallinut mikrofonin - käyttöä. - Todenna Todennatko SAS:n <%1$s> <%2$s>? @@ -327,4 +322,10 @@ Tarkista Asetukset → Sovellukset → baresip → Käyttöluvat → Tallennustila ja että tallennettu tiedosto \'baresip.bs\' on kansiossa ja (jos on) että annoit oikean salasanan. + Et voi soittaa puheluita tai vastata niihin + ilman Mikrofoni-käyttöoikeutta. + + Ilman Puhelin-käyttöoikeutta baresip ei voi tietää, onko + toinen puhelu parhaillaan jo käynnissä. + diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index 4fd60e76..3a1b5084 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -163,7 +163,6 @@ Du har allerede et aktivt anrop. Baresip kunne ikke starte. Lytteadressen ble tilbakestilt. Start programmet på ny. Registrering av %1$s mislyktes. - Du har ikke innvilget mikrofontilgang. Ønsker du å bekrefte SAS <%1$s> <%2$s>\? Godtar du å overføre samtalen til \"%1$s\"\? Anrop mislyktes diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 3a3bb397..53715e35 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -130,7 +130,6 @@ Tastatura virtuală Aveți deja un apel activ. Înregistrarea %1$s a eșuat. - Nu ați acordat permisiunea de acces la microfon. Verificare Doriți să verificați SAS <%1$s> <%2$s>\? Acceptați să transferați apelul către \'%1$s\'\? diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c11aa624..d9fcfe81 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -277,7 +277,6 @@ or TLS file. They have been reset. Restart baresip. Registering of \`%1$s\` failed. - You have not granted microphone permission. Verify Do you want to verify SAS <%1$s> <%2$s>? Do you accept to transfer call to \'%1$s\'? @@ -299,5 +298,11 @@ baresip → Permissions → Storage and that backup file \'baresip.bs\' exists in the folder and, if so, you gave correct Decrypt Password. + You are not able to place or answer calls without Record Audio + permission. + + Without Phone permission, baresip cannot be aware if another + phone call has already been established. +