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"
/>
+
+
\ No newline at end of file