diff --git a/.changes/barcode-scanner-cancel-settles-scan.md b/.changes/barcode-scanner-cancel-settles-scan.md new file mode 100644 index 000000000..8d51ff25f --- /dev/null +++ b/.changes/barcode-scanner-cancel-settles-scan.md @@ -0,0 +1,6 @@ +--- +"barcode-scanner": patch +"barcode-scanner-js": patch +--- + +Fix `cancel()` on Android leaving the pending `scan()` promise unsettled: `destroy()` cleared the saved invoke before it was rejected, so the `"cancelled"` rejection never reached the caller. The pending scan is now rejected before the camera is torn down, matching iOS. diff --git a/plugins/barcode-scanner/android/src/main/java/BarcodeScannerPlugin.kt b/plugins/barcode-scanner/android/src/main/java/BarcodeScannerPlugin.kt index 957240d50..4ac921943 100644 --- a/plugins/barcode-scanner/android/src/main/java/BarcodeScannerPlugin.kt +++ b/plugins/barcode-scanner/android/src/main/java/BarcodeScannerPlugin.kt @@ -332,8 +332,10 @@ class BarcodeScannerPlugin(private val activity: Activity) : Plugin(activity), @Command fun cancel(invoke: Invoke) { - destroy() + // Reject the pending scan before destroy() clears savedInvoke, otherwise the + // scan() promise is never settled. Mirrors the iOS implementation. savedInvoke?.reject("cancelled") + destroy() invoke.resolve() }