From 7782ac57f17cd8201cc748ff44463aa4b08b64aa Mon Sep 17 00:00:00 2001 From: Shihaam Abdul Rahman Date: Sun, 17 May 2026 19:11:26 +0500 Subject: [PATCH] show notice when camera permission rejected --- .../basedbank/ui/home/QrScannerActivity.kt | 31 ++++++++++++++++++- app/src/main/res/values/strings.xml | 3 ++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/sh/sar/basedbank/ui/home/QrScannerActivity.kt b/app/src/main/java/sh/sar/basedbank/ui/home/QrScannerActivity.kt index 2c7d99d..1b97514 100644 --- a/app/src/main/java/sh/sar/basedbank/ui/home/QrScannerActivity.kt +++ b/app/src/main/java/sh/sar/basedbank/ui/home/QrScannerActivity.kt @@ -7,7 +7,9 @@ import android.content.pm.PackageManager import android.graphics.Bitmap import android.graphics.BitmapFactory import android.graphics.Rect +import android.net.Uri import android.os.Bundle +import android.provider.Settings import android.widget.Toast import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AppCompatActivity @@ -19,12 +21,14 @@ import androidx.camera.core.resolutionselector.ResolutionSelector import androidx.camera.core.resolutionselector.ResolutionStrategy import androidx.camera.lifecycle.ProcessCameraProvider import androidx.core.content.ContextCompat +import com.google.android.material.dialog.MaterialAlertDialogBuilder import de.markusfisch.android.zxingcpp.ZxingCpp import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import kotlinx.coroutines.launch import kotlinx.coroutines.withContext +import sh.sar.basedbank.R import sh.sar.basedbank.databinding.ActivityQrScannerBinding import java.util.concurrent.Executors @@ -45,9 +49,11 @@ class QrScannerActivity : AppCompatActivity() { textMode = ZxingCpp.TextMode.PLAIN ) + private var cameraStarted = false + private val permissionLauncher = registerForActivityResult( ActivityResultContracts.RequestPermission() - ) { granted -> if (granted) startCamera() else finish() } + ) { granted -> if (granted) startCamera() else showPermissionRationale() } private val pickImageLauncher = registerForActivityResult( ActivityResultContracts.GetContent() @@ -89,7 +95,30 @@ class QrScannerActivity : AppCompatActivity() { else permissionLauncher.launch(Manifest.permission.CAMERA) } + override fun onResume() { + super.onResume() + if (!cameraStarted && ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) + == PackageManager.PERMISSION_GRANTED + ) startCamera() + } + + private fun showPermissionRationale() { + MaterialAlertDialogBuilder(this) + .setTitle(R.string.qr_camera_permission_title) + .setMessage(R.string.qr_camera_permission_message) + .setNegativeButton(R.string.cancel) { dialog, _ -> dialog.dismiss() } + .setPositiveButton(R.string.go_to_settings) { _, _ -> + startActivity( + Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).apply { + data = Uri.fromParts("package", packageName, null) + } + ) + } + .show() + } + private fun startCamera() { + cameraStarted = true val future = ProcessCameraProvider.getInstance(this) future.addListener({ val provider = try { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 98f1a8e..c35920e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -159,6 +159,9 @@ Scan QR Pick image Invalid or unsupported QR code + Camera permission required + Camera access is needed to scan QR codes. Please grant the permission in Settings. + Go to Settings Select a source account first Enter an account number first Account not found