From bf7d12a1714fb876e0fbb8d62f47b177f37cea93 Mon Sep 17 00:00:00 2001 From: Joshua Lin Date: Tue, 26 Dec 2023 15:30:06 +0800 Subject: [PATCH] throw exception if calling finish before pollTag done --- .../flutter_nfc_kit/FlutterNfcKitPlugin.kt | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/android/src/main/kotlin/im/nfc/flutter_nfc_kit/FlutterNfcKitPlugin.kt b/android/src/main/kotlin/im/nfc/flutter_nfc_kit/FlutterNfcKitPlugin.kt index 6870842..1b29f8b 100644 --- a/android/src/main/kotlin/im/nfc/flutter_nfc_kit/FlutterNfcKitPlugin.kt +++ b/android/src/main/kotlin/im/nfc/flutter_nfc_kit/FlutterNfcKitPlugin.kt @@ -43,6 +43,8 @@ class FlutterNfcKitPlugin : FlutterPlugin, MethodCallHandler, ActivityAware { private var ndefTechnology: Ndef? = null private var mifareInfo: MifareInfo? = null + private var onUserCancelled: (() -> Unit)? = null + private fun TagTechnology.transceive(data: ByteArray, timeout: Int?): ByteArray { if (timeout != null) { try { @@ -119,7 +121,10 @@ class FlutterNfcKitPlugin : FlutterPlugin, MethodCallHandler, ActivityAware { } "finish" -> { - pollingTimeoutTask?.cancel() + val isPolling = pollingTimeoutTask?.cancel() + if (isPolling == true) { + onUserCancelled?.invoke() + } thread { try { val tagTech = tagTechnology @@ -427,7 +432,10 @@ class FlutterNfcKitPlugin : FlutterPlugin, MethodCallHandler, ActivityAware { } override fun onDetachedFromActivity() { - pollingTimeoutTask?.cancel() + val isPolling = pollingTimeoutTask?.cancel() + if (isPolling == true) { + onUserCancelled?.invoke() + } pollingTimeoutTask = null tagTechnology = null ndefTechnology = null @@ -444,9 +452,18 @@ class FlutterNfcKitPlugin : FlutterPlugin, MethodCallHandler, ActivityAware { if (activity.get() != null) { nfcAdapter.disableReaderMode(activity.get()) } + onUserCancelled = null result.error("408", "Polling tag timeout", null) } + onUserCancelled = { + if (activity.get() != null) { + nfcAdapter.disableReaderMode(activity.get()) + } + onUserCancelled = null + result.error("600", "User cancelled", null) + } + nfcAdapter.enableReaderMode(activity.get(), { tag -> pollingTimeoutTask?.cancel()