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 79401434..49751bfe 100644 --- a/quickie/src/main/kotlin/io/github/g00fy2/quickie/QRScannerActivity.kt +++ b/quickie/src/main/kotlin/io/github/g00fy2/quickie/QRScannerActivity.kt @@ -27,9 +27,11 @@ import androidx.core.view.ViewCompat import androidx.core.view.WindowCompat import androidx.core.view.WindowInsetsCompat import com.google.mlkit.vision.barcode.common.Barcode +import io.github.g00fy2.quickie.config.ContinuesScanning import io.github.g00fy2.quickie.config.ParcelableScannerConfig import io.github.g00fy2.quickie.databinding.QuickieScannerActivityBinding import io.github.g00fy2.quickie.extensions.toParcelableContentType +import io.github.g00fy2.quickie.extensions.toQuickieContentType import io.github.g00fy2.quickie.utils.MlKitErrorHandler import java.util.concurrent.ExecutorService import java.util.concurrent.Executors @@ -43,6 +45,7 @@ internal class QRScannerActivity : AppCompatActivity() { private var showTorchToggle = false private var showCloseButton = false private var useFrontCamera = false + private var continuousScanning: ContinuesScanning? = null internal var errorDialog: Dialog? = null set(value) { field = value @@ -119,8 +122,19 @@ internal class QRScannerActivity : AppCompatActivity() { QRCodeAnalyzer( barcodeFormats = barcodeFormats, onSuccess = { barcode -> - it.clearAnalyzer() - onSuccess(barcode) + if (continuousScanning!=null){ + if (continuousScanning?.processResult( + QRResult.QRSuccess(Intent().apply { + putExtra(EXTRA_RESULT_BYTES, barcode.rawBytes) + putExtra(EXTRA_RESULT_VALUE, barcode.rawValue) + putExtra(EXTRA_RESULT_TYPE, barcode.valueType) + putExtra(EXTRA_RESULT_PARCELABLE, barcode.toParcelableContentType()) + }.toQuickieContentType()))==true) + onSuccess(barcode) + }else{ + it.clearAnalyzer() + onSuccess(barcode) + } }, onFailure = { exception -> onFailure(exception) }, onPassCompleted = { failureOccurred -> onPassCompleted(failureOccurred) } @@ -166,7 +180,7 @@ internal class QRScannerActivity : AppCompatActivity() { putExtra(EXTRA_RESULT_PARCELABLE, result.toParcelableContentType()) } ) - finish() + if (continuousScanning == null) finish() } private fun onFailure(exception: Exception) { @@ -189,6 +203,10 @@ internal class QRScannerActivity : AppCompatActivity() { private fun applyScannerConfig() { intent?.let { IntentCompat.getParcelableExtra(it, EXTRA_CONFIG, ParcelableScannerConfig::class.java) }?.let { barcodeFormats = it.formats + if (it.continuousScanningId != -1) { + continuousScanning = ParcelableScannerConfig.continuousScanning[it.continuousScanningId] + ParcelableScannerConfig.continuousScanning.remove(it.continuousScanningId) + } binding.overlayView.setCustomText(it.stringRes) binding.overlayView.setCustomIcon(it.drawableRes) binding.overlayView.setHorizontalFrameRatio(it.horizontalFrameRatio) diff --git a/quickie/src/main/kotlin/io/github/g00fy2/quickie/config/ContinuesScanning.kt b/quickie/src/main/kotlin/io/github/g00fy2/quickie/config/ContinuesScanning.kt new file mode 100644 index 00000000..3562f1f1 --- /dev/null +++ b/quickie/src/main/kotlin/io/github/g00fy2/quickie/config/ContinuesScanning.kt @@ -0,0 +1,19 @@ +package io.github.g00fy2.quickie.config + +import io.github.g00fy2.quickie.QRResult + +data class ContinuesScanning(val onSuccess :(QRResult.QRSuccess)->Unit, val cooldown: Int) { + private var lastSuccess: Long = cooldown.toLong() + fun updateCooldown() { + lastSuccess = System.currentTimeMillis() + } + fun processResult(result :QRResult.QRSuccess):Boolean { + if (isInCooldown()) return false + updateCooldown() + onSuccess(result) + return true + } + fun isInCooldown(): Boolean { + return System.currentTimeMillis() - lastSuccess < cooldown + } +} \ No newline at end of file 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 3f9d34b0..8aba4c46 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 @@ -14,4 +14,9 @@ internal class ParcelableScannerConfig( val useFrontCamera: Boolean, val showCloseButton: Boolean, val keepScreenOn: Boolean, -) : Parcelable \ No newline at end of file + val continuousScanningId: Int +): Parcelable { + companion object { + val continuousScanning = mutableMapOf() + } +} \ 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 dc4f2945..90aca8a6 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 @@ -17,6 +17,7 @@ public class ScannerConfig internal constructor( internal val useFrontCamera: Boolean, internal val showCloseButton: Boolean, internal val keepScreenOn: Boolean, + internal val continuousScanning: ContinuesScanning?, ) { public class Builder { @@ -29,6 +30,7 @@ public class ScannerConfig internal constructor( private var useFrontCamera: Boolean = false private var showCloseButton: Boolean = false private var keepScreenOn: Boolean = false + private var continuousScanning: ContinuesScanning ? =null /** * Set a list of interested barcode formats. List must not be empty. @@ -78,6 +80,12 @@ public class ScannerConfig internal constructor( */ public fun setKeepScreenOn(enable: Boolean): Builder = apply { keepScreenOn = enable } + /** + * Set the continuous scan mode. + * `null` to disable continuous scan mode. + */ + public fun setContinuesMode(continuesScanning: ContinuesScanning?): Builder = apply { continuousScanning = continuesScanning } + /** * Build the BarcodeConfig required by the ScanBarcode ActivityResultContract. */ @@ -92,6 +100,7 @@ public class ScannerConfig internal constructor( useFrontCamera = useFrontCamera, showCloseButton = showCloseButton, keepScreenOn = keepScreenOn, + continuousScanning = continuousScanning ) } 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 b2cfc837..35ed338d 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 @@ -3,8 +3,13 @@ package io.github.g00fy2.quickie.extensions import io.github.g00fy2.quickie.config.ParcelableScannerConfig import io.github.g00fy2.quickie.config.ScannerConfig -internal fun ScannerConfig.toParcelableConfig() = - ParcelableScannerConfig( +internal fun ScannerConfig.toParcelableConfig(): ParcelableScannerConfig { + var continuesScanningId = -1 + if (continuousScanning != null) { + continuesScanningId = ParcelableScannerConfig.continuousScanning.size + ParcelableScannerConfig.continuousScanning[continuesScanningId] = this.continuousScanning + } + return ParcelableScannerConfig( formats = formats, stringRes = stringRes, drawableRes = drawableRes, @@ -14,4 +19,6 @@ internal fun ScannerConfig.toParcelableConfig() = useFrontCamera = useFrontCamera, showCloseButton = showCloseButton, keepScreenOn = keepScreenOn, - ) \ No newline at end of file + continuesScanningId + ) +} \ No newline at end of file