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