diff --git a/sample-app/shared/src/commonMain/kotlin/MainView.kt b/sample-app/shared/src/commonMain/kotlin/MainView.kt index 8d3add2..92e5e28 100644 --- a/sample-app/shared/src/commonMain/kotlin/MainView.kt +++ b/sample-app/shared/src/commonMain/kotlin/MainView.kt @@ -16,10 +16,15 @@ import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp +import kotlinx.coroutines.Job import kotlinx.coroutines.launch import org.publicvalue.multiplatform.qrcode.CameraPosition import org.publicvalue.multiplatform.qrcode.CodeType import org.publicvalue.multiplatform.qrcode.ScannerWithPermissions +import kotlin.time.Duration.Companion.minutes +import kotlin.time.Duration.Companion.seconds +import kotlin.time.TimeMark +import kotlin.time.TimeSource @Composable fun MainView() { @@ -39,14 +44,27 @@ fun MainView() { }) { Text("Toggle scanner (visible: $scannerVisible)") } + var lastCode by remember { mutableStateOf(null)} + var snackbarJob by remember { mutableStateOf(null)} + var lastSnackbar by remember { mutableStateOf(TimeSource.Monotonic.markNow().minus(1.minutes))} if (scannerVisible) { val scope = rememberCoroutineScope() ScannerWithPermissions( modifier = Modifier.padding(16.dp), onScanned = { - scope.launch { + if (lastCode == it) { return@ScannerWithPermissions false } + if (TimeSource.Monotonic.markNow().minus(lastSnackbar) < 1.seconds) { + return@ScannerWithPermissions false + } + snackbarJob?.cancel() + lastSnackbar = TimeSource.Monotonic.markNow() + snackbarJob = scope.launch { snackbarHostState.showSnackbar(it, duration = SnackbarDuration.Short) + if (lastCode == it) { + lastCode = null + } } + lastCode = it false // continue scanning }, types = listOf(CodeType.QR), diff --git a/scanner/src/iosMain/kotlin/ScannerView.kt b/scanner/src/iosMain/kotlin/ScannerView.kt index a2b84b1..8459e41 100644 --- a/scanner/src/iosMain/kotlin/ScannerView.kt +++ b/scanner/src/iosMain/kotlin/ScannerView.kt @@ -197,7 +197,6 @@ class ScannerCameraCoordinator( } } - fun setCurrentOrientation(newOrientation: UIDeviceOrientation) { when(newOrientation) { UIDeviceOrientation.UIDeviceOrientationLandscapeLeft -> @@ -219,11 +218,9 @@ class ScannerCameraCoordinator( } fun onFound(code: String) { - captureSession.stopRunning() - if (!onScanned(code)) { - GlobalScope.launch(Dispatchers.Default) { - captureSession.startRunning() - } + val stopScanning = onScanned(code) + if (stopScanning) { + captureSession.stopRunning() } }