diff --git a/quickie/src/main/AndroidManifest.xml b/quickie/src/main/AndroidManifest.xml index cf62fb9d..8bb37728 100644 --- a/quickie/src/main/AndroidManifest.xml +++ b/quickie/src/main/AndroidManifest.xml @@ -7,7 +7,7 @@ android:required="false"/> - + + uri?.let { analyzeImageFromGallery(it) } + } internal var errorDialog: Dialog? = null set(value) { field = value @@ -65,9 +77,11 @@ internal class QRScannerActivity : AppCompatActivity() { } binding = QuickieScannerActivityBinding.inflate(appThemeLayoutInflater) setContentView(binding.root) - + showGalleryButton = intent.getBooleanExtra(EXTRA_SHOW_GALLERY_BUTTON, false) setupEdgeToEdgeUI() applyScannerConfig() + binding.selectFromGalleryButton.visibility = if (showGalleryButton) View.VISIBLE else View.GONE + setupGalleryButton() analysisExecutor = Executors.newSingleThreadExecutor() @@ -81,6 +95,49 @@ internal class QRScannerActivity : AppCompatActivity() { } } + private fun setupGalleryButton() { + binding.selectFromGalleryButton.setOnClickListener { + launchGalleryPicker() + } + } + private fun launchGalleryPicker() { + galleryLauncher.launch(IMAGE_MIME_TYPE) + } + + @SuppressLint("Range") + private fun analyzeImageFromGallery(imageUri: Uri) { + try { + val cursor = contentResolver.query(imageUri, null, null, null, null) + cursor?.use { + if (it.moveToFirst()) { + val inputImage = InputImage.fromFilePath(this, imageUri) + + val scanner = BarcodeScanning.getClient( + BarcodeScannerOptions.Builder() + .setBarcodeFormats(Barcode.FORMAT_QR_CODE) + .build() + ) + + scanner.process(inputImage) + .addOnSuccessListener { barcodes -> + if (barcodes.isNotEmpty()) { + onSuccess(barcodes[0]) + } else { + onFailure(Exception("No barcode found")) + } + } + .addOnFailureListener { e -> + onFailure(e) + } + } else { + onFailure(Exception("No metadata found")) + } + } ?: onFailure(Exception("Unable to query image metadata")) + } catch (e: Exception) { + onFailure(e) + } + } + override fun onDestroy() { super.onDestroy() analysisExecutor.shutdown() @@ -214,8 +271,10 @@ internal class QRScannerActivity : AppCompatActivity() { const val EXTRA_RESULT_BYTES = "quickie-bytes" const val EXTRA_RESULT_VALUE = "quickie-value" const val EXTRA_RESULT_TYPE = "quickie-type" + const val EXTRA_SHOW_GALLERY_BUTTON = "show-gallery-button" const val EXTRA_RESULT_PARCELABLE = "quickie-parcelable" const val EXTRA_RESULT_EXCEPTION = "quickie-exception" + const val IMAGE_MIME_TYPE="image/*" const val RESULT_MISSING_PERMISSION = RESULT_FIRST_USER + 1 const val RESULT_ERROR = RESULT_FIRST_USER + 2 } diff --git a/quickie/src/main/kotlin/io/github/g00fy2/quickie/ScanQRCode.kt b/quickie/src/main/kotlin/io/github/g00fy2/quickie/ScanQRCode.kt index 7481ed8f..0f8bd35d 100644 --- a/quickie/src/main/kotlin/io/github/g00fy2/quickie/ScanQRCode.kt +++ b/quickie/src/main/kotlin/io/github/g00fy2/quickie/ScanQRCode.kt @@ -17,7 +17,9 @@ import io.github.g00fy2.quickie.extensions.toQuickieContentType public class ScanQRCode : ActivityResultContract() { override fun createIntent(context: Context, input: Nothing?): Intent = - Intent(context, QRScannerActivity::class.java) + Intent(context, QRScannerActivity::class.java).apply { + putExtra(QRScannerActivity.EXTRA_SHOW_GALLERY_BUTTON, true) + } override fun parseResult(resultCode: Int, intent: Intent?): QRResult { return when (resultCode) { diff --git a/quickie/src/main/res/drawable/quickie_rounded_rectangle_button.xml b/quickie/src/main/res/drawable/quickie_rounded_rectangle_button.xml new file mode 100644 index 00000000..d2cc4b54 --- /dev/null +++ b/quickie/src/main/res/drawable/quickie_rounded_rectangle_button.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/quickie/src/main/res/layout/quickie_scanner_activity.xml b/quickie/src/main/res/layout/quickie_scanner_activity.xml index 9b379f8d..85a3260d 100644 --- a/quickie/src/main/res/layout/quickie_scanner_activity.xml +++ b/quickie/src/main/res/layout/quickie_scanner_activity.xml @@ -19,4 +19,15 @@ android:visibility="invisible" tools:visibility="visible" /> +