From 3a39f405a286262a66d1c526300a34bf4fee87e1 Mon Sep 17 00:00:00 2001 From: Thomas Wirth Date: Sun, 8 Jan 2023 17:17:32 +0100 Subject: [PATCH] Add optional close button to scanner view --- .../io/github/g00fy2/quickie/QROverlayView.kt | 6 +++++ .../g00fy2/quickie/QRScannerActivity.kt | 3 +++ .../quickie/config/ParcelableScannerConfig.kt | 1 + .../g00fy2/quickie/config/ScannerConfig.kt | 9 +++++++ .../extensions/ScannerConfigExtensions.kt | 1 + ...ckie_bg_torch.xml => quickie_bg_round.xml} | 0 .../main/res/drawable/quickie_ic_close.xml | 26 +++++++++++++++++++ .../main/res/layout/quickie_overlay_view.xml | 15 ++++++++++- .../g00fy2/quickiesample/MainActivity.kt | 1 + 9 files changed, 61 insertions(+), 1 deletion(-) rename quickie/src/main/res/drawable/{quickie_bg_torch.xml => quickie_bg_round.xml} (100%) create mode 100644 quickie/src/main/res/drawable/quickie_ic_close.xml diff --git a/quickie/src/main/kotlin/io/github/g00fy2/quickie/QROverlayView.kt b/quickie/src/main/kotlin/io/github/g00fy2/quickie/QROverlayView.kt index c4df41b1..ce2446cb 100644 --- a/quickie/src/main/kotlin/io/github/g00fy2/quickie/QROverlayView.kt +++ b/quickie/src/main/kotlin/io/github/g00fy2/quickie/QROverlayView.kt @@ -119,6 +119,12 @@ internal class QROverlayView @JvmOverloads constructor( } } + fun setCloseVisibilityAndOnClick(visible: Boolean, action: () -> Unit = {}) { + binding.closeImageView.visibility = if (visible) View.VISIBLE else View.GONE + binding.closeImageView.setOnClickListener { action() } + if (visible) binding.closeImageView.setTintAndStateAwareBackground() + } + fun setTorchVisibilityAndOnClick(visible: Boolean, action: (Boolean) -> Unit = {}) { binding.torchImageView.visibility = if (visible) View.VISIBLE else View.GONE binding.torchImageView.setOnClickListener { action(!it.isSelected) } diff --git a/quickie/src/main/kotlin/io/github/g00fy2/quickie/QRScannerActivity.kt b/quickie/src/main/kotlin/io/github/g00fy2/quickie/QRScannerActivity.kt index 70656a9b..98ed1811 100644 --- a/quickie/src/main/kotlin/io/github/g00fy2/quickie/QRScannerActivity.kt +++ b/quickie/src/main/kotlin/io/github/g00fy2/quickie/QRScannerActivity.kt @@ -37,6 +37,7 @@ internal class QRScannerActivity : AppCompatActivity() { private var barcodeFormats = intArrayOf(Barcode.FORMAT_QR_CODE) private var hapticFeedback = true private var showTorchToggle = false + private var showCloseButton = false private var useFrontCamera = false internal var errorDialog: Dialog? = null set(value) { @@ -124,6 +125,7 @@ internal class QRScannerActivity : AppCompatActivity() { try { val camera = cameraProvider.bindToLifecycle(this, cameraSelector, preview, imageAnalysis) binding.overlayView.visibility = View.VISIBLE + binding.overlayView.setCloseVisibilityAndOnClick(showCloseButton) { finish() } if (showTorchToggle && camera.cameraInfo.hasFlashUnit()) { binding.overlayView.setTorchVisibilityAndOnClick(true) { camera.cameraControl.enableTorch(it) } camera.cameraInfo.torchState.observe(this) { binding.overlayView.setTorchState(it == TorchState.ON) } @@ -184,6 +186,7 @@ internal class QRScannerActivity : AppCompatActivity() { hapticFeedback = it.hapticFeedback showTorchToggle = it.showTorchToggle useFrontCamera = it.useFrontCamera + showCloseButton = it.showCloseButton } } diff --git a/quickie/src/main/kotlin/io/github/g00fy2/quickie/config/ParcelableScannerConfig.kt b/quickie/src/main/kotlin/io/github/g00fy2/quickie/config/ParcelableScannerConfig.kt index 2b3433d6..78e1e427 100644 --- a/quickie/src/main/kotlin/io/github/g00fy2/quickie/config/ParcelableScannerConfig.kt +++ b/quickie/src/main/kotlin/io/github/g00fy2/quickie/config/ParcelableScannerConfig.kt @@ -12,4 +12,5 @@ internal class ParcelableScannerConfig( val showTorchToggle: Boolean, val horizontalFrameRatio: Float, val useFrontCamera: Boolean, + val showCloseButton: Boolean, ) : Parcelable \ No newline at end of file diff --git a/quickie/src/main/kotlin/io/github/g00fy2/quickie/config/ScannerConfig.kt b/quickie/src/main/kotlin/io/github/g00fy2/quickie/config/ScannerConfig.kt index a9c2d8cc..03e6bbb5 100644 --- a/quickie/src/main/kotlin/io/github/g00fy2/quickie/config/ScannerConfig.kt +++ b/quickie/src/main/kotlin/io/github/g00fy2/quickie/config/ScannerConfig.kt @@ -6,6 +6,7 @@ import androidx.annotation.StringRes /** * Builder for ScannerConfig used in ScanBarcode ActivityResultContract. */ +@Suppress("LongParameterList") public class ScannerConfig internal constructor( internal val formats: IntArray, internal val stringRes: Int, @@ -14,6 +15,7 @@ public class ScannerConfig internal constructor( internal val showTorchToggle: Boolean, internal val horizontalFrameRatio: Float, internal val useFrontCamera: Boolean, + internal val showCloseButton: Boolean, ) { public class Builder { @@ -24,6 +26,7 @@ public class ScannerConfig internal constructor( private var showTorchToggle: Boolean = false private var horizontalFrameRatio: Float = 1f private var useFrontCamera: Boolean = false + private var showCloseButton: Boolean = false /** * Set a list of interested barcode formats. List must not be empty. @@ -63,6 +66,11 @@ public class ScannerConfig internal constructor( */ public fun setUseFrontCamera(enable: Boolean): Builder = apply { useFrontCamera = enable } + /** + * Show or hide (default) close button. + */ + public fun setShowCloseButton(enable: Boolean): Builder = apply { showCloseButton = enable } + /** * Build the BarcodeConfig required by the ScanBarcode ActivityResultContract. */ @@ -75,6 +83,7 @@ public class ScannerConfig internal constructor( showTorchToggle, horizontalFrameRatio, useFrontCamera, + showCloseButton, ) } diff --git a/quickie/src/main/kotlin/io/github/g00fy2/quickie/extensions/ScannerConfigExtensions.kt b/quickie/src/main/kotlin/io/github/g00fy2/quickie/extensions/ScannerConfigExtensions.kt index 09912755..7d24d8d3 100644 --- a/quickie/src/main/kotlin/io/github/g00fy2/quickie/extensions/ScannerConfigExtensions.kt +++ b/quickie/src/main/kotlin/io/github/g00fy2/quickie/extensions/ScannerConfigExtensions.kt @@ -12,4 +12,5 @@ internal fun ScannerConfig.toParcelableConfig() = showTorchToggle = showTorchToggle, horizontalFrameRatio = horizontalFrameRatio, useFrontCamera = useFrontCamera, + showCloseButton = showCloseButton, ) \ No newline at end of file diff --git a/quickie/src/main/res/drawable/quickie_bg_torch.xml b/quickie/src/main/res/drawable/quickie_bg_round.xml similarity index 100% rename from quickie/src/main/res/drawable/quickie_bg_torch.xml rename to quickie/src/main/res/drawable/quickie_bg_round.xml diff --git a/quickie/src/main/res/drawable/quickie_ic_close.xml b/quickie/src/main/res/drawable/quickie_ic_close.xml new file mode 100644 index 00000000..8deb808e --- /dev/null +++ b/quickie/src/main/res/drawable/quickie_ic_close.xml @@ -0,0 +1,26 @@ + + + + + \ No newline at end of file diff --git a/quickie/src/main/res/layout/quickie_overlay_view.xml b/quickie/src/main/res/layout/quickie_overlay_view.xml index 5896816d..5324b000 100644 --- a/quickie/src/main/res/layout/quickie_overlay_view.xml +++ b/quickie/src/main/res/layout/quickie_overlay_view.xml @@ -26,13 +26,26 @@ app:drawableTopCompat="@drawable/quickie_ic_qrcode" /> + +