diff --git a/app/src/main/java/sh/sar/basedbank/ui/home/SettingsLoginsFragment.kt b/app/src/main/java/sh/sar/basedbank/ui/home/SettingsLoginsFragment.kt index ce60267..f8080f6 100644 --- a/app/src/main/java/sh/sar/basedbank/ui/home/SettingsLoginsFragment.kt +++ b/app/src/main/java/sh/sar/basedbank/ui/home/SettingsLoginsFragment.kt @@ -1,7 +1,10 @@ package sh.sar.basedbank.ui.home +import android.Manifest import android.content.Context import android.content.Intent +import android.content.pm.PackageManager +import android.provider.Settings as AndroidSettings import android.graphics.Bitmap import android.graphics.BitmapFactory import android.net.Uri @@ -15,6 +18,7 @@ import android.widget.ImageView import android.widget.LinearLayout import android.widget.TextView import androidx.activity.result.contract.ActivityResultContracts +import androidx.core.content.ContextCompat import androidx.core.content.FileProvider import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels @@ -77,6 +81,29 @@ class SettingsLoginsFragment : Fragment() { handlePickedImage(bitmap) } + private val cameraPermissionLauncher = registerForActivityResult( + ActivityResultContracts.RequestPermission() + ) { granted -> + if (granted) cameraLauncher.launch(cameraPhotoUri ?: return@registerForActivityResult) + else showCameraPermissionRationale() + } + + private fun showCameraPermissionRationale() { + val ctx = requireContext() + MaterialAlertDialogBuilder(ctx) + .setTitle(R.string.qr_camera_permission_title) + .setMessage(R.string.camera_permission_profile_message) + .setNegativeButton(R.string.cancel) { dialog, _ -> dialog.dismiss() } + .setPositiveButton(R.string.go_to_settings) { _, _ -> + startActivity( + Intent(AndroidSettings.ACTION_APPLICATION_DETAILS_SETTINGS).apply { + data = Uri.fromParts("package", ctx.packageName, null) + } + ) + } + .show() + } + private fun loadAndScaleBitmap(uri: Uri): Bitmap? { return try { val ctx = requireContext() @@ -159,7 +186,11 @@ class SettingsLoginsFragment : Fragment() { val photoFile = File(ctx.cacheDir, "profile_photo_tmp.jpg") val uri = FileProvider.getUriForFile(ctx, "${ctx.packageName}.fileprovider", photoFile) cameraPhotoUri = uri - cameraLauncher.launch(uri) + if (ContextCompat.checkSelfPermission(ctx, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) { + cameraLauncher.launch(uri) + } else { + cameraPermissionLauncher.launch(Manifest.permission.CAMERA) + } } if (target is PendingImageTarget.Mib || currentBitmap != null || hasSavedImage(ctx, target)) { items += Triple(R.drawable.ic_delete, getString(R.string.profile_image_remove)) { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8474159..b7f8007 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -243,6 +243,7 @@ Invalid or unsupported QR code Camera permission required Camera access is needed to scan QR codes. Please grant the permission in Settings. + Camera access is needed to take a photo. Please grant the permission in Settings. Go to Settings Select a source account first Enter an account number first