Started to work on better permissions handling

This commit is contained in:
Juha Heinanen
2021-11-09 15:15:46 +02:00
parent b79d10770c
commit 801c232793
10 changed files with 467 additions and 314 deletions
@@ -12,6 +12,7 @@ import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.graphics.Matrix
import android.graphics.drawable.BitmapDrawable
import android.os.Build
import android.os.Bundle
import android.provider.ContactsContract
import android.provider.ContactsContract.CommonDataKinds
@@ -20,10 +21,14 @@ import android.view.Menu
import android.view.MenuItem
import android.view.View
import android.widget.*
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatActivity
import androidx.cardview.widget.CardView
import androidx.core.app.ActivityCompat
import androidx.exifinterface.media.ExifInterface
import com.google.android.material.snackbar.Snackbar
import com.tutpro.baresip.Utils.showSnackBar
import com.tutpro.baresip.databinding.ActivityContactBinding
import java.io.ByteArrayOutputStream
import java.io.File
@@ -31,6 +36,7 @@ import java.io.File
class ContactActivity : AppCompatActivity() {
private lateinit var binding: ActivityContactBinding
private lateinit var layout: LinearLayout
private lateinit var textAvatarView: TextView
private lateinit var cardAvatarView: CardView
private lateinit var cardImageAvatarView: ImageView
@@ -38,6 +44,7 @@ class ContactActivity : AppCompatActivity() {
private lateinit var uriView: EditText
private lateinit var androidCheck: CheckBox
private lateinit var menu: Menu
private lateinit var requestPermissionsLauncher: ActivityResultLauncher<Array<String>>
private var newContact = false
private var newAvatar = ""
@@ -48,11 +55,15 @@ class ContactActivity : AppCompatActivity() {
private var id: Long = 0
private var oldAndroid = false
private val permissions =
arrayOf(Manifest.permission.READ_CONTACTS, Manifest.permission.WRITE_CONTACTS)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityContactBinding.inflate(layoutInflater)
setContentView(binding.root)
layout = binding.ContactView
textAvatarView = binding.TextAvatar
cardAvatarView = binding.CardAvatar
@@ -166,10 +177,22 @@ class ContactActivity : AppCompatActivity() {
getString(R.string.android_contact_help))
}
androidCheck.setOnClickListener{
if (Build.VERSION.SDK_INT >= 23)
if (!Utils.checkPermissions(this, permissions))
requestPermissions(permissions, CONTACT_PERMISSION_REQUEST_CODE)
}
Utils.addActivity("contact,$newContact,$uOrI")
}
override fun onStart() {
super.onStart()
requestPermissionsLauncher =
registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) {}
}
override fun onCreateOptionsMenu(optionsMenu: Menu): Boolean {
super.onCreateOptionsMenu(optionsMenu)
@@ -181,6 +204,47 @@ class ContactActivity : AppCompatActivity() {
}
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>,
grandResults: IntArray) {
super.onRequestPermissionsResult(requestCode, permissions, grandResults)
var allowed = true
when (requestCode) {
CONTACT_PERMISSION_REQUEST_CODE ->
for (res in grandResults)
allowed = allowed && res == PackageManager.PERMISSION_GRANTED
}
if (!allowed) {
androidCheck.isChecked = oldAndroid
if (ActivityCompat.shouldShowRequestPermissionRationale(
this,
Manifest.permission.READ_CONTACTS
))
{
layout.showSnackBar(
binding.root,
getString(R.string.no_android_contacts),
Snackbar.LENGTH_INDEFINITE,
getString(R.string.ok)
) {
requestPermissionsLauncher.launch(permissions)
}
} else if (ActivityCompat.shouldShowRequestPermissionRationale(
this,
Manifest.permission.WRITE_CONTACTS
))
{
layout.showSnackBar(
binding.root,
getString(R.string.no_android_contacts),
Snackbar.LENGTH_INDEFINITE,
getString(R.string.ok)
) {
requestPermissionsLauncher.launch(permissions)
}
}
}
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
if (BaresipService.activities.indexOf("contact,$newContact,$uOrI") == -1) return true
@@ -260,20 +324,13 @@ class ContactActivity : AppCompatActivity() {
Contact.contacts().sortBy { Contact -> Contact.name }
if (Utils.checkPermission(this, Manifest.permission.READ_CONTACTS +
"|" + Manifest.permission.WRITE_CONTACTS)) {
if (Utils.checkPermissions(this, permissions)) {
if (contact.androidContact)
addOrUpdateAndroidContact(this, contact)
else
if (oldAndroid)
deleteAndroidContact(this, contact)
else if (oldAndroid)
deleteAndroidContact(this, contact)
} else {
if (contact.androidContact) {
Utils.requestPermission(this, Manifest.permission.READ_CONTACTS +
"|" + Manifest.permission.WRITE_CONTACTS,
CONTACTS_PERMISSION_REQUEST_CODE)
return false
}
contact.androidContact = oldAndroid
}
Contact.save()
@@ -298,23 +355,6 @@ class ContactActivity : AppCompatActivity() {
}
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>,
grantResults: IntArray) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
when (requestCode) {
CONTACTS_PERMISSION_REQUEST_CODE ->
if (grantResults.isNotEmpty() && permissions.size == grantResults.size) {
for (res in grantResults)
if (res != PackageManager.PERMISSION_GRANTED)
return
menu.performIdentifierAction(R.id.checkIcon, 0)
}
}
}
override fun onBackPressed() {
BaresipService.activities.remove("contact,$newContact,$uOrI")