diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7acfac69..64532f5a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -31,11 +31,6 @@ android:windowSoftInputMode="adjustResize" tools:targetApi="33"> - - - if (isGranted) { - setupScanner() - } else { - Toast.makeText(this, "Camera permission denied.", Toast.LENGTH_SHORT).show() - sendResultAndFinish(null) - } - } - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - - if (hasCameraPermission()) { - setupScanner() - } else { - cameraPermissionLauncher.launch(Manifest.permission.CAMERA) - } - } - - private fun hasCameraPermission(): Boolean { - return checkSelfPermission(Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED - } - - private fun setupScanner() { - barcodeView = DecoratedBarcodeView(this).apply { - barcodeView.decoderFactory = DefaultDecoderFactory(listOf(BarcodeFormat.QR_CODE)) - initializeFromIntent(intent) - decodeContinuous(object : BarcodeCallback { - override fun barcodeResult(result: BarcodeResult?) { - result?.text?.let { - sendResultAndFinish(it) - } - } - - override fun possibleResultPoints(resultPoints: MutableList?) {} - }) - } - - setContentView(barcodeView) - safeResumeScanner() - } - - private fun safeResumeScanner() { - try { - barcodeView.resume() - } catch (e: Exception) { - Log.e("QrScanner", "Camera resume failed: ${e.message}") - if (!hasFailedToResumeCamera) { - hasFailedToResumeCamera = true - Toast.makeText(this, "Camera is in use by another app.", Toast.LENGTH_LONG).show() - barcodeView.postDelayed({ - sendResultAndFinish(null) - }, 1500) - } - } - } - - override fun onResume() { - super.onResume() - if (::barcodeView.isInitialized && hasWindowFocus()) { - safeResumeScanner() - } - } - - override fun onPause() { - super.onPause() - if (::barcodeView.isInitialized) { - barcodeView.pause() - } - } - - override fun onWindowFocusChanged(hasFocus: Boolean) { - super.onWindowFocusChanged(hasFocus) - if (::barcodeView.isInitialized) { - if (hasFocus) safeResumeScanner() else barcodeView.pause() - } - } - - private fun sendResultAndFinish(result: String?) { - setResult(RESULT_OK, Intent().putExtra("qr_result", result)) - finish() - } -} diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/ui/QrCodeScanner.kt b/app/src/main/java/com/greenart7c3/nostrsigner/ui/QrCodeScanner.kt index d61f5302..823f7522 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/ui/QrCodeScanner.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/ui/QrCodeScanner.kt @@ -1,27 +1,37 @@ package com.greenart7c3.nostrsigner.ui -import android.content.Intent import androidx.activity.compose.rememberLauncherForActivityResult -import androidx.activity.result.contract.ActivityResultContracts import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect -import androidx.compose.ui.platform.LocalContext -import com.greenart7c3.nostrsigner.QrCodeScannerActivity +import androidx.compose.runtime.DisposableEffect +import androidx.lifecycle.compose.LocalLifecycleOwner +import com.google.zxing.client.android.Intents +import com.journeyapps.barcodescanner.ScanContract +import com.journeyapps.barcodescanner.ScanOptions @Composable -fun SimpleQrCodeScanner( - onScan: (String?) -> Unit, -) { - val context = LocalContext.current - val launcher = rememberLauncherForActivityResult( - contract = ActivityResultContracts.StartActivityForResult(), - ) { result -> - val text = result.data?.getStringExtra("qr_result") - onScan(text) - } +fun SimpleQrCodeScanner(onScan: (String?) -> Unit) { + val lifecycleOwner = LocalLifecycleOwner.current - LaunchedEffect(Unit) { - val intent = Intent(context, QrCodeScannerActivity::class.java) - launcher.launch(intent) + val qrLauncher = + rememberLauncherForActivityResult(ScanContract()) { + if (it.contents != null) { + onScan(it.contents) + } else { + onScan(null) + } + } + + val scanOptions = + ScanOptions().apply { + setDesiredBarcodeFormats(ScanOptions.QR_CODE) + setPrompt("Point to the QR Code") + setBeepEnabled(false) + setOrientationLocked(false) + addExtra(Intents.Scan.SCAN_TYPE, Intents.Scan.MIXED_SCAN) + } + + DisposableEffect(lifecycleOwner) { + qrLauncher.launch(scanOptions) + onDispose { } } }