From c777285ea701309a6de56cb66915585b73006724 Mon Sep 17 00:00:00 2001
From: okadan <46291090+okadan@users.noreply.github.com>
Date: Sun, 5 Mar 2023 10:50:25 +0900
Subject: [PATCH] Create v4.0.0 release
---
.metadata | 14 +-
CHANGELOG.md | 4 +
LICENSE | 2 +-
README.md | 75 -
android/build.gradle | 6 +-
android/src/main/AndroidManifest.xml | 2 +-
.../plugins/nfcmanager/NfcManagerPlugin.kt | 525 +++
.../flutter/plugins/nfcmanager/Pigeon.java | 2959 +++++++++++++++++
.../plugins/nfcmanager/NfcManagerPlugin.kt | 348 --
.../flutter/plugins/nfcmanager/Translator.kt | 150 -
example/README.md | 3 -
example/android/app/build.gradle | 4 +-
.../android/app/src/debug/AndroidManifest.xml | 2 +-
.../android/app/src/main/AndroidManifest.xml | 4 +-
.../plugins/nfcmanagerexample/MainActivity.kt | 6 +
.../plugins/nfcmanagerexample/MainActivity.kt | 21 -
.../app/src/profile/AndroidManifest.xml | 2 +-
example/android/build.gradle | 4 +-
.../gradle/wrapper/gradle-wrapper.properties | 2 +-
example/ios/Podfile.lock | 2 +-
example/ios/Runner.xcodeproj/project.pbxproj | 102 +-
.../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 564 -> 295 bytes
.../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 1283 -> 406 bytes
.../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 1588 -> 450 bytes
.../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 1025 -> 282 bytes
.../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 1716 -> 462 bytes
.../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 1920 -> 704 bytes
.../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 1283 -> 406 bytes
.../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 1895 -> 586 bytes
.../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 2665 -> 862 bytes
.../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 2665 -> 862 bytes
.../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 3831 -> 1674 bytes
.../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 1888 -> 762 bytes
.../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 3294 -> 1226 bytes
.../Icon-App-83.5x83.5@2x.png | Bin 3612 -> 1418 bytes
example/ios/Runner/Info.plist | 18 +-
example/ios/Runner/Runner.entitlements | 10 -
example/lib/main.dart | 129 +-
example/pubspec.lock | 85 +-
example/pubspec.yaml | 2 +-
ios/Classes/NfcManagerPlugin.h | 4 -
ios/Classes/NfcManagerPlugin.m | 15 -
ios/Classes/NfcManagerPlugin.swift | 663 ++++
ios/Classes/Pigeon.swift | 1527 +++++++++
ios/Classes/SwiftNfcManagerPlugin.swift | 767 -----
ios/Classes/Translator.swift | 161 -
lib/nfc_manager.dart | 1 -
lib/nfc_manager_android.dart | 11 +
lib/nfc_manager_ios.dart | 6 +
lib/nfc_manager_ndef.dart | 1 +
lib/nfc_manager_ndef_record.dart | 1 +
lib/platform_tags.dart | 12 -
lib/src/channel.dart | 3 -
lib/src/nfc_manager/nfc_manager.dart | 206 +-
lib/src/nfc_manager/nfc_manager_platform.dart | 11 +
lib/src/nfc_manager/nfc_ndef.dart | 297 --
lib/src/nfc_manager_android/nfc_manager.dart | 99 +
.../nfc_manager_platform.dart | 35 +
lib/src/nfc_manager_android/pigeon.dart | 60 +
lib/src/nfc_manager_android/pigeon.g.dart | 1886 +++++++++++
lib/src/nfc_manager_android/tags/iso_dep.dart | 49 +
.../tags/mifare_classic.dart | 103 +
.../tags/mifare_ultralight.dart | 60 +
lib/src/nfc_manager_android/tags/ndef.dart | 75 +
.../tags/ndef_formatable.dart | 40 +
lib/src/nfc_manager_android/tags/nfc_a.dart | 45 +
lib/src/nfc_manager_android/tags/nfc_b.dart | 37 +
.../nfc_manager_android/tags/nfc_barcode.dart | 29 +
lib/src/nfc_manager_android/tags/nfc_f.dart | 45 +
lib/src/nfc_manager_android/tags/nfc_v.dart | 37 +
lib/src/nfc_manager_ios/nfc_manager.dart | 79 +
.../nfc_manager_ios/nfc_manager_platform.dart | 32 +
lib/src/nfc_manager_ios/pigeon.dart | 87 +
lib/src/nfc_manager_ios/pigeon.g.dart | 1828 ++++++++++
lib/src/nfc_manager_ios/tags/felica.dart | 210 ++
lib/src/nfc_manager_ios/tags/iso15693.dart | 175 +
lib/src/nfc_manager_ios/tags/iso7816.dart | 84 +
lib/src/nfc_manager_ios/tags/mifare.dart | 79 +
lib/src/nfc_manager_ios/tags/ndef.dart | 91 +
lib/src/nfc_manager_ndef/ndef.dart | 34 +
lib/src/nfc_manager_ndef/ndef_platform.dart | 29 +
.../ndef_platform_android.dart | 42 +
.../nfc_manager_ndef/ndef_platform_ios.dart | 42 +
.../nfc_manager_ndef_record/ndef_record.dart | 264 ++
lib/src/platform_tags/felica.dart | 282 --
lib/src/platform_tags/iso15693.dart | 371 ---
lib/src/platform_tags/iso7816.dart | 97 -
lib/src/platform_tags/iso_dep.dart | 62 -
lib/src/platform_tags/mifare.dart | 97 -
lib/src/platform_tags/mifare_classic.dart | 173 -
lib/src/platform_tags/mifare_ultralight.dart | 81 -
lib/src/platform_tags/ndef_formatable.dart | 51 -
lib/src/platform_tags/nfc_a.dart | 58 -
lib/src/platform_tags/nfc_b.dart | 54 -
lib/src/platform_tags/nfc_f.dart | 58 -
lib/src/platform_tags/nfc_v.dart | 54 -
lib/src/translator.dart | 337 --
pigeon/pigeon_android.dart | 177 +
pigeon/pigeon_ios.dart | 217 ++
pubspec.yaml | 11 +-
100 files changed, 11964 insertions(+), 4059 deletions(-)
delete mode 100644 README.md
create mode 100644 android/src/main/kotlin/dev/flutter/plugins/nfcmanager/NfcManagerPlugin.kt
create mode 100644 android/src/main/kotlin/dev/flutter/plugins/nfcmanager/Pigeon.java
delete mode 100644 android/src/main/kotlin/io/flutter/plugins/nfcmanager/NfcManagerPlugin.kt
delete mode 100644 android/src/main/kotlin/io/flutter/plugins/nfcmanager/Translator.kt
delete mode 100644 example/README.md
create mode 100644 example/android/app/src/main/kotlin/dev/flutter/plugins/nfcmanagerexample/MainActivity.kt
delete mode 100644 example/android/app/src/main/kotlin/io/flutter/plugins/nfcmanagerexample/MainActivity.kt
delete mode 100644 example/ios/Runner/Runner.entitlements
delete mode 100644 ios/Classes/NfcManagerPlugin.h
delete mode 100644 ios/Classes/NfcManagerPlugin.m
create mode 100644 ios/Classes/NfcManagerPlugin.swift
create mode 100644 ios/Classes/Pigeon.swift
delete mode 100644 ios/Classes/SwiftNfcManagerPlugin.swift
delete mode 100644 ios/Classes/Translator.swift
create mode 100644 lib/nfc_manager_android.dart
create mode 100644 lib/nfc_manager_ios.dart
create mode 100644 lib/nfc_manager_ndef.dart
create mode 100644 lib/nfc_manager_ndef_record.dart
delete mode 100644 lib/platform_tags.dart
delete mode 100644 lib/src/channel.dart
create mode 100644 lib/src/nfc_manager/nfc_manager_platform.dart
delete mode 100644 lib/src/nfc_manager/nfc_ndef.dart
create mode 100644 lib/src/nfc_manager_android/nfc_manager.dart
create mode 100644 lib/src/nfc_manager_android/nfc_manager_platform.dart
create mode 100644 lib/src/nfc_manager_android/pigeon.dart
create mode 100644 lib/src/nfc_manager_android/pigeon.g.dart
create mode 100644 lib/src/nfc_manager_android/tags/iso_dep.dart
create mode 100644 lib/src/nfc_manager_android/tags/mifare_classic.dart
create mode 100644 lib/src/nfc_manager_android/tags/mifare_ultralight.dart
create mode 100644 lib/src/nfc_manager_android/tags/ndef.dart
create mode 100644 lib/src/nfc_manager_android/tags/ndef_formatable.dart
create mode 100644 lib/src/nfc_manager_android/tags/nfc_a.dart
create mode 100644 lib/src/nfc_manager_android/tags/nfc_b.dart
create mode 100644 lib/src/nfc_manager_android/tags/nfc_barcode.dart
create mode 100644 lib/src/nfc_manager_android/tags/nfc_f.dart
create mode 100644 lib/src/nfc_manager_android/tags/nfc_v.dart
create mode 100644 lib/src/nfc_manager_ios/nfc_manager.dart
create mode 100644 lib/src/nfc_manager_ios/nfc_manager_platform.dart
create mode 100644 lib/src/nfc_manager_ios/pigeon.dart
create mode 100644 lib/src/nfc_manager_ios/pigeon.g.dart
create mode 100644 lib/src/nfc_manager_ios/tags/felica.dart
create mode 100644 lib/src/nfc_manager_ios/tags/iso15693.dart
create mode 100644 lib/src/nfc_manager_ios/tags/iso7816.dart
create mode 100644 lib/src/nfc_manager_ios/tags/mifare.dart
create mode 100644 lib/src/nfc_manager_ios/tags/ndef.dart
create mode 100644 lib/src/nfc_manager_ndef/ndef.dart
create mode 100644 lib/src/nfc_manager_ndef/ndef_platform.dart
create mode 100644 lib/src/nfc_manager_ndef/ndef_platform_android.dart
create mode 100644 lib/src/nfc_manager_ndef/ndef_platform_ios.dart
create mode 100644 lib/src/nfc_manager_ndef_record/ndef_record.dart
delete mode 100644 lib/src/platform_tags/felica.dart
delete mode 100644 lib/src/platform_tags/iso15693.dart
delete mode 100644 lib/src/platform_tags/iso7816.dart
delete mode 100644 lib/src/platform_tags/iso_dep.dart
delete mode 100644 lib/src/platform_tags/mifare.dart
delete mode 100644 lib/src/platform_tags/mifare_classic.dart
delete mode 100644 lib/src/platform_tags/mifare_ultralight.dart
delete mode 100644 lib/src/platform_tags/ndef_formatable.dart
delete mode 100644 lib/src/platform_tags/nfc_a.dart
delete mode 100644 lib/src/platform_tags/nfc_b.dart
delete mode 100644 lib/src/platform_tags/nfc_f.dart
delete mode 100644 lib/src/platform_tags/nfc_v.dart
delete mode 100644 lib/src/translator.dart
create mode 100644 pigeon/pigeon_android.dart
create mode 100644 pigeon/pigeon_ios.dart
diff --git a/.metadata b/.metadata
index 044504e..c93e545 100644
--- a/.metadata
+++ b/.metadata
@@ -4,7 +4,7 @@
# This file should be version controlled.
version:
- revision: e3c29ec00c9c825c891d75054c63fcc46454dca1
+ revision: 7048ed95a5ad3e43d697e0c397464193991fc230
channel: stable
project_type: plugin
@@ -13,14 +13,14 @@ project_type: plugin
migration:
platforms:
- platform: root
- create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1
- base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1
+ create_revision: 7048ed95a5ad3e43d697e0c397464193991fc230
+ base_revision: 7048ed95a5ad3e43d697e0c397464193991fc230
- platform: android
- create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1
- base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1
+ create_revision: 7048ed95a5ad3e43d697e0c397464193991fc230
+ base_revision: 7048ed95a5ad3e43d697e0c397464193991fc230
- platform: ios
- create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1
- base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1
+ create_revision: 7048ed95a5ad3e43d697e0c397464193991fc230
+ base_revision: 7048ed95a5ad3e43d697e0c397464193991fc230
# User provided section
diff --git a/CHANGELOG.md b/CHANGELOG.md
index b58d6d2..047c194 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+# 4.0.0-dev
+
+**Has many breaking changes.**
+
# 3.2.0
* Fix build issues
diff --git a/LICENSE b/LICENSE
index 52f7a60..2b420f8 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,6 +1,6 @@
MIT License
-Copyright (c) 2019 Naoki Okada
+Copyright (c) 2019 okadan
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/README.md b/README.md
deleted file mode 100644
index e967bae..0000000
--- a/README.md
+++ /dev/null
@@ -1,75 +0,0 @@
-# nfc_manager
-
-Flutter plugin for accessing the NFC features on Android and iOS.
-
-Note: This plugin depends on `NFCTagReaderSession` (requires iOS 13.0 or later) and `NfcAdapter#enableReaderMode` (requires Android API level 19 or later).
-
-## Setup
-
-**Android Setup**
-
-* Add [android.permission.NFC](https://developer.android.com/reference/android/Manifest.permission.html#NFC) to your `AndroidManifest.xml`.
-
-**iOS Setup**
-
-* Add [Near Field Communication Tag Reader Session Formats Entitlements](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_developer_nfc_readersession_formats) to your entitlements.
-
-* Add [NFCReaderUsageDescription](https://developer.apple.com/documentation/bundleresources/information_property_list/nfcreaderusagedescription) to your `Info.plist`.
-
-* Add [com.apple.developer.nfc.readersession.felica.systemcodes](https://developer.apple.com/documentation/bundleresources/information_property_list/systemcodes) and [com.apple.developer.nfc.readersession.iso7816.select-identifiers](https://developer.apple.com/documentation/bundleresources/information_property_list/select-identifiers) to your `Info.plist` as needed.
-
-## Usage
-
-**Handling Session**
-
-```dart
-// Check availability
-bool isAvailable = await NfcManager.instance.isAvailable();
-
-// Start Session
-NfcManager.instance.startSession(
- onDiscovered: (NfcTag tag) async {
- // Do something with an NfcTag instance.
- },
-);
-
-// Stop Session
-NfcManager.instance.stopSession();
-```
-
-**Handling Platform Tag**
-
-The following platform-tag-classes are available:
-
-* Ndef
-* FeliCa (iOS only)
-* Iso7816 (iOS only)
-* Iso15693 (iOS only)
-* MiFare (iOS only)
-* NfcA (Android only)
-* NfcB (Android only)
-* NfcF (Android only)
-* NfcV (Android only)
-* IsoDep (Android only)
-* MifareClassic (Android only)
-* MifareUtralight (Android only)
-* NdefFormatable (Android only)
-
-Obtain an instance by calling the factory constructor `from` on the class. For example:
-
-```dart
-Ndef? ndef = Ndef.from(tag);
-
-if (ndef == null) {
- print('Tag is not compatible with NDEF');
- return;
-}
-
-// Do something with an Ndef instance
-```
-
-Please see the [API Doc](https://pub.dev/documentation/nfc_manager/latest/) for more details.
-
-## Real-World-App
-
-See [this repo](https://github.com/okadan/flutter-nfc-manager-app) which is a Real-World-App demonstrates how to use this plugin.
diff --git a/android/build.gradle b/android/build.gradle
index dff31fd..e27151d 100644
--- a/android/build.gradle
+++ b/android/build.gradle
@@ -1,15 +1,15 @@
-group 'io.flutter.plugins.nfc_manager'
+group 'dev.flutter.plugins.nfcmanager'
version '1.0-SNAPSHOT'
buildscript {
- ext.kotlin_version = '1.6.10'
+ ext.kotlin_version = '1.7.10'
repositories {
google()
mavenCentral()
}
dependencies {
- classpath 'com.android.tools.build:gradle:7.1.2'
+ classpath 'com.android.tools.build:gradle:7.2.0'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
diff --git a/android/src/main/AndroidManifest.xml b/android/src/main/AndroidManifest.xml
index a33fc2e..4728e2e 100644
--- a/android/src/main/AndroidManifest.xml
+++ b/android/src/main/AndroidManifest.xml
@@ -1,3 +1,3 @@
+ package="dev.flutter.plugins.nfcmanager">
diff --git a/android/src/main/kotlin/dev/flutter/plugins/nfcmanager/NfcManagerPlugin.kt b/android/src/main/kotlin/dev/flutter/plugins/nfcmanager/NfcManagerPlugin.kt
new file mode 100644
index 0000000..f40916c
--- /dev/null
+++ b/android/src/main/kotlin/dev/flutter/plugins/nfcmanager/NfcManagerPlugin.kt
@@ -0,0 +1,525 @@
+package dev.flutter.plugins.nfcmanager
+
+import android.app.Activity
+import android.app.PendingIntent
+import android.content.BroadcastReceiver
+import android.content.Context
+import android.content.Intent
+import android.nfc.NdefMessage
+import android.nfc.NdefRecord
+import android.nfc.NfcAdapter
+import android.nfc.Tag
+import android.nfc.tech.*
+import android.os.Build
+import androidx.annotation.RequiresApi
+import io.flutter.embedding.engine.plugins.FlutterPlugin
+import io.flutter.embedding.engine.plugins.activity.ActivityAware
+import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding
+import java.io.IOException
+import java.util.*
+
+class NfcManagerPlugin: FlutterPlugin, ActivityAware, Pigeon.PigeonHostApi, BroadcastReceiver() {
+ private lateinit var flutterApi: Pigeon.PigeonFlutterApi
+ private lateinit var activity: Activity
+ private var adapter: NfcAdapter? = null
+ private var cachedTags: MutableMap = mutableMapOf()
+ private var connectedTech: TagTechnology? = null
+
+ override fun onAttachedToEngine(flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {
+ Pigeon.PigeonHostApi.setup(flutterPluginBinding.binaryMessenger, this)
+ flutterApi = Pigeon.PigeonFlutterApi(flutterPluginBinding.binaryMessenger)
+ adapter = NfcAdapter.getDefaultAdapter(flutterPluginBinding.applicationContext)
+ }
+
+ override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) {
+ Pigeon.PigeonHostApi.setup(binding.binaryMessenger, null)
+ }
+
+ override fun onAttachedToActivity(binding: ActivityPluginBinding) {
+ activity = binding.activity
+ activity.applicationContext.registerReceiver(this, null)
+ }
+
+ override fun onReattachedToActivityForConfigChanges(binding: ActivityPluginBinding) {
+ activity = binding.activity
+ }
+
+ override fun onDetachedFromActivityForConfigChanges() {
+ // no op
+ }
+
+ override fun onDetachedFromActivity() {
+ // no op
+ }
+
+ override fun onReceive(context: Context?, intent: Intent?) {
+ intent ?: run { return }
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR2) { return }
+ if (intent.action != NfcAdapter.ACTION_ADAPTER_STATE_CHANGED) { return }
+ val state = intent.getIntExtra(NfcAdapter.EXTRA_ADAPTER_STATE, NfcAdapter.STATE_OFF)
+ flutterApi.onAdapterStateChanged(state.toLong()) { /* no op */ }
+ }
+
+ override fun adapterIsEnabled(): Boolean {
+ val adapter = adapter ?: run { throw Exception("TODO") }
+ return adapter.isEnabled
+ }
+
+ override fun adapterIsSecureNfcEnabled(): Boolean {
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { throw Exception("TODO") }
+ val adapter = adapter ?: run { throw Exception("TODO") }
+ return adapter.isSecureNfcEnabled
+ }
+
+ override fun adapterIsSecureNfcSupported(): Boolean {
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { throw Exception("TODO") }
+ val adapter = adapter ?: run { throw Exception("TODO") }
+ return adapter.isSecureNfcSupported
+ }
+
+ override fun adapterEnableReaderMode(flags: List) {
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { throw Exception("TODO") }
+ val adapter = adapter ?: run { throw Exception("TODO") }
+ adapter.enableReaderMode(activity, { onTagDiscovered(it) }, toInt(flags), null)
+ }
+
+ override fun adapterDisableReaderMode() {
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { throw Exception("TODO") }
+ val adapter = adapter ?: run { throw Exception("TODO") }
+ adapter.disableReaderMode(activity)
+ }
+
+ override fun adapterEnableForegroundDispatch() {
+ val adapter = adapter ?: run { throw Exception("TODO") }
+ val intent = Intent(activity.applicationContext, javaClass).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)
+ val pendingIntent = PendingIntent.getActivity(activity.applicationContext, 0, intent, 0)
+ adapter.enableForegroundDispatch(activity, pendingIntent, null, null)
+ }
+
+ override fun adapterDisableForegroundDispatch() {
+ val adapter = adapter ?: run { throw Exception("TODO") }
+ adapter.disableForegroundDispatch(activity)
+ }
+
+ override fun ndefGetNdefMessage(handle: String): Pigeon.PigeonNdefMessage? {
+ val tech = forceConnect(handle) { Ndef.get(it) }
+ val message = tech.ndefMessage
+ return if (message != null) toPigeonNdefMessage(message) else null
+ }
+
+ override fun ndefWriteNdefMessage(handle: String, message: Pigeon.PigeonNdefMessage) {
+ val tech = forceConnect(handle) { Ndef.get(it) }
+ tech.writeNdefMessage(toNdefMessage(message))
+ }
+
+ override fun ndefMakeReadOnly(handle: String): Boolean {
+ val tech = forceConnect(handle) { Ndef.get(it) }
+ return tech.makeReadOnly()
+ }
+
+ override fun nfcAGetMaxTransceiveLength(handle: String): Long {
+ val tech = forceConnect(handle) { NfcA.get(it) }
+ return tech.maxTransceiveLength.toLong()
+ }
+
+ override fun nfcAGetTimeout(handle: String): Long {
+ val tech = forceConnect(handle) { NfcA.get(it) }
+ return tech.timeout.toLong()
+ }
+
+ override fun nfcASetTimeout(handle: String, timeout: Long) {
+ val tech = forceConnect(handle) { NfcA.get(it) }
+ tech.timeout = timeout.toInt()
+ }
+
+ override fun nfcATransceive(handle: String, data: ByteArray): ByteArray {
+ val tech = forceConnect(handle) { NfcA.get(it) }
+ return tech.transceive(data)
+ }
+
+ override fun nfcBGetMaxTransceiveLength(handle: String): Long {
+ val tech = forceConnect(handle) { NfcB.get(it) }
+ return tech.maxTransceiveLength.toLong()
+ }
+
+ override fun nfcBTransceive(handle: String, data: ByteArray): ByteArray {
+ val tech = forceConnect(handle) { NfcB.get(it) }
+ return tech.transceive(data)
+ }
+
+ override fun nfcFGetMaxTransceiveLength(handle: String): Long {
+ val tech = forceConnect(handle) { NfcF.get(it) }
+ return tech.maxTransceiveLength.toLong()
+ }
+
+ override fun nfcFGetTimeout(handle: String): Long {
+ val tech = forceConnect(handle) { NfcF.get(it) }
+ return tech.timeout.toLong()
+ }
+
+ override fun nfcFSetTimeout(handle: String, timeout: Long) {
+ val tech = forceConnect(handle) { NfcF.get(it) }
+ tech.timeout = timeout.toInt()
+ }
+
+ override fun nfcFTransceive(handle: String, data: ByteArray): ByteArray {
+ val tech = forceConnect(handle) { NfcF.get(it) }
+ return tech.transceive(data)
+ }
+
+ override fun nfcVGetMaxTransceiveLength(handle: String): Long {
+ val tech = forceConnect(handle) { NfcV.get(it) }
+ return tech.maxTransceiveLength.toLong()
+ }
+
+ override fun nfcVTransceive(handle: String, data: ByteArray): ByteArray {
+ val tech = forceConnect(handle) { NfcV.get(it) }
+ return tech.transceive(data)
+ }
+
+ override fun isoDepGetMaxTransceiveLength(handle: String): Long {
+ val tech = forceConnect(handle) { IsoDep.get(it) }
+ return tech.maxTransceiveLength.toLong()
+ }
+
+ override fun isoDepGetTimeout(handle: String): Long {
+ val tech = forceConnect(handle) { IsoDep.get(it) }
+ return tech.timeout.toLong()
+ }
+
+ override fun isoDepSetTimeout(handle: String, timeout: Long) {
+ val tech = forceConnect(handle) { IsoDep.get(it) }
+ tech.timeout = timeout.toInt()
+ }
+
+ override fun isoDepTransceive(handle: String, data: ByteArray): ByteArray {
+ val tech = forceConnect(handle) { IsoDep.get(it) }
+ return tech.transceive(data)
+ }
+
+ override fun mifareClassicGetMaxTransceiveLength(handle: String): Long {
+ val tech = forceConnect(handle) { MifareClassic.get(it) }
+ return tech.maxTransceiveLength.toLong()
+ }
+
+ override fun mifareClassicGetTimeout(handle: String): Long {
+ val tech = forceConnect(handle) { MifareClassic.get(it) }
+ return tech.timeout.toLong()
+ }
+
+ override fun mifareClassicSetTimeout(handle: String, timeout: Long) {
+ val tech = forceConnect(handle) { MifareClassic.get(it) }
+ tech.timeout = timeout.toInt()
+ }
+
+ override fun mifareClassicAuthenticateSectorWithKeyA(handle: String, sectorIndex: Long, key: ByteArray): Boolean {
+ val tech = forceConnect(handle) { MifareClassic.get(it) }
+ return tech.authenticateSectorWithKeyA(sectorIndex.toInt(), key)
+ }
+
+ override fun mifareClassicAuthenticateSectorWithKeyB(handle: String, sectorIndex: Long, key: ByteArray): Boolean {
+ val tech = forceConnect(handle) { MifareClassic.get(it) }
+ return tech.authenticateSectorWithKeyB(sectorIndex.toInt(), key)
+ }
+
+ override fun mifareClassicGetBlockCountInSector(handle: String, sectorIndex: Long): Long {
+ val tech = forceConnect(handle) { MifareClassic.get(it) }
+ return tech.getBlockCountInSector(sectorIndex.toInt()).toLong()
+ }
+
+ override fun mifareClassicBlockToSector(handle: String, blockIndex: Long): Long {
+ val tech = forceConnect(handle) { MifareClassic.get(it) }
+ return tech.blockToSector(blockIndex.toInt()).toLong()
+ }
+
+ override fun mifareClassicSectorToBlock(handle: String, sectorIndex: Long): Long {
+ val tech = forceConnect(handle) { MifareClassic.get(it) }
+ return tech.sectorToBlock(sectorIndex.toInt()).toLong()
+ }
+
+ override fun mifareClassicIncrement(handle: String, blockIndex: Long, value: Long) {
+ val tech = forceConnect(handle) { MifareClassic.get(it) }
+ tech.increment(blockIndex.toInt(), value.toInt())
+ }
+
+ override fun mifareClassicDecrement(handle: String, blockIndex: Long, value: Long) {
+ val tech = forceConnect(handle) { MifareClassic.get(it) }
+ tech.decrement(blockIndex.toInt(), value.toInt())
+ }
+
+ override fun mifareClassicRestore(handle: String, blockIndex: Long) {
+ val tech = forceConnect(handle) { MifareClassic.get(it) }
+ tech.restore(blockIndex.toInt())
+ }
+
+ override fun mifareClassicTransfer(handle: String, blockIndex: Long) {
+ val tech = forceConnect(handle) { MifareClassic.get(it) }
+ tech.transfer(blockIndex.toInt())
+ }
+
+ override fun mifareClassicReadBlock(handle: String, blockIndex: Long): ByteArray {
+ val tech = forceConnect(handle) { MifareClassic.get(it) }
+ return tech.readBlock(blockIndex.toInt())
+ }
+
+ override fun mifareClassicWriteBlock(handle: String, blockIndex: Long, data: ByteArray) {
+ val tech = forceConnect(handle) { MifareClassic.get(it) }
+ tech.writeBlock(blockIndex.toInt(), data)
+ }
+
+ override fun mifareClassicTransceive(handle: String, data: ByteArray): ByteArray {
+ val tech = forceConnect(handle) { MifareClassic.get(it) }
+ return tech.transceive(data)
+ }
+
+ override fun mifareUltralightGetMaxTransceiveLength(handle: String): Long {
+ val tech = forceConnect(handle) { MifareUltralight.get(it) }
+ return tech.maxTransceiveLength.toLong()
+ }
+
+ override fun mifareUltralightGetTimeout(handle: String): Long {
+ val tech = forceConnect(handle) { MifareUltralight.get(it) }
+ return tech.timeout.toLong()
+ }
+
+ override fun mifareUltralightSetTimeout(handle: String, timeout: Long) {
+ val tech = forceConnect(handle) { MifareUltralight.get(it) }
+ tech.timeout = timeout.toInt()
+ }
+
+ override fun mifareUltralightReadPages(handle: String, pageOffset: Long): ByteArray {
+ val tech = forceConnect(handle) { MifareUltralight.get(it) }
+ return tech.readPages(pageOffset.toInt())
+ }
+
+ override fun mifareUltralightWritePage(handle: String, pageOffset: Long, data: ByteArray) {
+ val tech = forceConnect(handle) { MifareUltralight.get(it) }
+ tech.writePage(pageOffset.toInt(), data)
+ }
+
+ override fun mifareUltralightTransceive(handle: String, data: ByteArray): ByteArray {
+ val tech = forceConnect(handle) { MifareUltralight.get(it) }
+ return tech.transceive(data)
+ }
+
+ override fun ndefFormatableFormat(handle: String, firstMessage: Pigeon.PigeonNdefMessage) {
+ val tech = forceConnect(handle) { NdefFormatable.get(it) }
+ tech.format(toNdefMessage(firstMessage))
+ }
+
+ override fun ndefFormatableFormatReadOnly(handle: String, firstMessage: Pigeon.PigeonNdefMessage) {
+ val tech = forceConnect(handle) { NdefFormatable.get(it) }
+ tech.formatReadOnly(toNdefMessage(firstMessage))
+ }
+
+ override fun disposeTag(handle: String) {
+ val tag = cachedTags.remove(handle) ?: run { return }
+ val tech = connectedTech ?: run { return }
+ connectedTech = null
+ if (tech.tag != tag || !tech.isConnected) return
+ try { tech.close() } catch (e: IOException) { /* no op */ }
+ }
+
+ private fun onTagDiscovered(tag: Tag) {
+ val handle = UUID.randomUUID().toString()
+ val pigeonTag = toPigeonTag(tag).apply { this.handle = handle }
+ cachedTags[handle] = tag
+ activity.runOnUiThread { flutterApi.onTagDiscovered(pigeonTag) { /* no op */ } }
+ }
+
+ private fun forceConnect(handle: String, getMethod: (Tag) -> T?): T {
+ val tag = cachedTags[handle] ?: run { throw Exception("TODO") }
+ val tech = getMethod(tag) ?: run { throw Exception("TODO") }
+ val connectedTech = connectedTech ?: run {
+ tech.connect()
+ connectedTech = tech
+ return tech
+ }
+ if (connectedTech.tag != tech.tag || connectedTech::class.java.name != tech::class.java.name) {
+ try { connectedTech.close() } catch (e: IOException) { /* no op */ }
+ tech.connect()
+ this.connectedTech = tech
+ return tech
+ }
+ return tech
+ }
+}
+
+@RequiresApi(Build.VERSION_CODES.KITKAT)
+private fun toInt(value: List): Int {
+ return value.fold(0) { p, e -> p or toInt(e)}
+}
+
+@RequiresApi(Build.VERSION_CODES.KITKAT)
+private fun toInt(value: Pigeon.PigeonReaderFlag): Int {
+ return when (value) {
+ Pigeon.PigeonReaderFlag.NFC_A -> NfcAdapter.FLAG_READER_NFC_A
+ Pigeon.PigeonReaderFlag.NFC_B -> NfcAdapter.FLAG_READER_NFC_B
+ Pigeon.PigeonReaderFlag.NFC_BARCODE -> NfcAdapter.FLAG_READER_NFC_BARCODE
+ Pigeon.PigeonReaderFlag.NFC_F -> NfcAdapter.FLAG_READER_NFC_F
+ Pigeon.PigeonReaderFlag.NFC_V -> NfcAdapter.FLAG_READER_NFC_V
+ Pigeon.PigeonReaderFlag.NO_PLATFORM_SOUNDS -> NfcAdapter.FLAG_READER_NO_PLATFORM_SOUNDS
+ Pigeon.PigeonReaderFlag.SKIP_NDEF_CHECK -> NfcAdapter.FLAG_READER_SKIP_NDEF_CHECK
+ }
+}
+
+private fun toNdefMessage(value: Pigeon.PigeonNdefMessage): NdefMessage {
+ return NdefMessage(
+ value.records!!.map { toNdefRecord(it) }.toTypedArray(),
+ )
+}
+
+private fun toPigeonNdefMessage(value: NdefMessage): Pigeon.PigeonNdefMessage {
+ return Pigeon.PigeonNdefMessage().apply {
+ records = value.records.map { toPigeonNdefRecord(it) }
+ }
+}
+
+private fun toNdefRecord(value: Pigeon.PigeonNdefRecord): NdefRecord {
+ return NdefRecord(
+ toShort(value.tnf!!),
+ value.type!!,
+ value.id!!,
+ value.payload!!,
+ )
+}
+
+private fun toPigeonNdefRecord(value: NdefRecord): Pigeon.PigeonNdefRecord {
+ return Pigeon.PigeonNdefRecord().apply {
+ tnf = toPigeonTypeNameFormat(value.tnf)
+ type = value.type
+ id = value.id
+ payload = value.payload
+ }
+}
+
+private fun toPigeonTag(value: Tag): Pigeon.PigeonTag {
+ return Pigeon.PigeonTag().apply {
+ id = value.id
+ techList = value.techList.toMutableList()
+ Ndef.get(value).also { ndef = toPigeonNdef(it) }
+ NfcA.get(value).also { nfcA = toPigeonNfcA(it) }
+ NfcB.get(value).also { nfcB = toPigeonNfcB(it) }
+ NfcF.get(value).also { nfcF = toPigeonNfcF(it) }
+ NfcV.get(value).also { nfcV = toPigeonNfcV(it) }
+ IsoDep.get(value).also { isoDep = toPigeonIsoDep(it) }
+ MifareClassic.get(value).also { mifareClassic = toPigeonMifareClassic(it) }
+ MifareUltralight.get(value).also { mifareUltralight = toPigeonMifareUltralight(it) }
+ NdefFormatable.get(value).also { ndefFormatable = "" }
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1)
+ NfcBarcode.get(value).also { nfcBarcode = toPigeonNfcBarcode(it) }
+ }
+}
+
+private fun toPigeonNdef(value: Ndef): Pigeon.PigeonNdef {
+ return Pigeon.PigeonNdef().apply {
+ type = value.type
+ isWritable = value.isWritable
+ maxSize = value.maxSize.toLong()
+ canMakeReadOnly = value.canMakeReadOnly()
+ value.cachedNdefMessage?.let { cachedNdefMessage = toPigeonNdefMessage(it) }
+ }
+}
+
+private fun toPigeonNfcA(value: NfcA): Pigeon.PigeonNfcA {
+ return Pigeon.PigeonNfcA().apply {
+ atqa = value.atqa
+ sak = value.sak.toLong()
+ }
+}
+
+private fun toPigeonNfcB(value: NfcB): Pigeon.PigeonNfcB {
+ return Pigeon.PigeonNfcB().apply {
+ applicationData = value.applicationData
+ protocolInfo = value.protocolInfo
+ }
+}
+
+private fun toPigeonNfcF(value: NfcF): Pigeon.PigeonNfcF {
+ return Pigeon.PigeonNfcF().apply {
+ manufacturer = value.manufacturer
+ systemCode = value.systemCode
+ }
+}
+
+private fun toPigeonNfcV(value: NfcV): Pigeon.PigeonNfcV {
+ return Pigeon.PigeonNfcV().apply {
+ dsfId = value.dsfId.toLong()
+ responseFlags = value.responseFlags.toLong()
+ }
+}
+
+private fun toPigeonIsoDep(value: IsoDep): Pigeon.PigeonIsoDep {
+ return Pigeon.PigeonIsoDep().apply {
+ hiLayerResponse = value.hiLayerResponse
+ historicalBytes = value.historicalBytes
+ isExtendedLengthApduSupported = value.isExtendedLengthApduSupported
+ }
+}
+
+private fun toPigeonMifareClassic(value: MifareClassic): Pigeon.PigeonMifareClassic {
+ return Pigeon.PigeonMifareClassic().apply {
+ type = toPigeonMifareClassicType(value.type)
+ blockCount = value.blockCount.toLong()
+ sectorCount = value.sectorCount.toLong()
+ size = value.size.toLong()
+ }
+}
+
+private fun toPigeonMifareUltralight(value: MifareUltralight): Pigeon.PigeonMifareUltralight {
+ return Pigeon.PigeonMifareUltralight().apply {
+ type = toPigeonMifareUltralightType(value.type)
+ }
+}
+
+@RequiresApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
+private fun toPigeonNfcBarcode(value: NfcBarcode): Pigeon.PigeonNfcBarcode {
+ return Pigeon.PigeonNfcBarcode().apply {
+ type = value.type.toLong()
+ barcode = value.barcode
+ }
+}
+
+private fun toShort(value: Pigeon.PigeonTypeNameFormat): Short {
+ return when (value) {
+ Pigeon.PigeonTypeNameFormat.EMPTY -> NdefRecord.TNF_EMPTY
+ Pigeon.PigeonTypeNameFormat.WELL_KNOWN -> NdefRecord.TNF_WELL_KNOWN
+ Pigeon.PigeonTypeNameFormat.MIME_MEDIA -> NdefRecord.TNF_MIME_MEDIA
+ Pigeon.PigeonTypeNameFormat.ABSOLUTE_URI -> NdefRecord.TNF_ABSOLUTE_URI
+ Pigeon.PigeonTypeNameFormat.EXTERNAL_TYPE -> NdefRecord.TNF_EXTERNAL_TYPE
+ Pigeon.PigeonTypeNameFormat.UNKNOWN -> NdefRecord.TNF_UNKNOWN
+ Pigeon.PigeonTypeNameFormat.UNCHANGED -> NdefRecord.TNF_UNCHANGED
+ }
+}
+
+private fun toPigeonTypeNameFormat(value: Short): Pigeon.PigeonTypeNameFormat {
+ return when (value) {
+ NdefRecord.TNF_EMPTY -> Pigeon.PigeonTypeNameFormat.EMPTY
+ NdefRecord.TNF_WELL_KNOWN -> Pigeon.PigeonTypeNameFormat.WELL_KNOWN
+ NdefRecord.TNF_MIME_MEDIA -> Pigeon.PigeonTypeNameFormat.MIME_MEDIA
+ NdefRecord.TNF_ABSOLUTE_URI -> Pigeon.PigeonTypeNameFormat.ABSOLUTE_URI
+ NdefRecord.TNF_EXTERNAL_TYPE -> Pigeon.PigeonTypeNameFormat.EXTERNAL_TYPE
+ NdefRecord.TNF_UNKNOWN -> Pigeon.PigeonTypeNameFormat.UNKNOWN
+ NdefRecord.TNF_UNCHANGED -> Pigeon.PigeonTypeNameFormat.UNCHANGED
+ else -> error("TODO:")
+ }
+}
+
+private fun toPigeonMifareClassicType(value: Int): Pigeon.PigeonMifareClassicType {
+ return when (value) {
+ MifareClassic.TYPE_CLASSIC -> Pigeon.PigeonMifareClassicType.CLASSIC
+ MifareClassic.TYPE_PLUS -> Pigeon.PigeonMifareClassicType.PLUS
+ MifareClassic.TYPE_PRO -> Pigeon.PigeonMifareClassicType.PRO
+ MifareClassic.TYPE_UNKNOWN -> Pigeon.PigeonMifareClassicType.UNKNOWN
+ else -> error("TODO:")
+ }
+}
+
+private fun toPigeonMifareUltralightType(value: Int): Pigeon.PigeonMifareUltralightType {
+ return when (value) {
+ MifareUltralight.TYPE_ULTRALIGHT -> Pigeon.PigeonMifareUltralightType.ULTRALIGHT
+ MifareUltralight.TYPE_ULTRALIGHT_C -> Pigeon.PigeonMifareUltralightType.ULTRALIGHT_C
+ MifareUltralight.TYPE_UNKNOWN -> Pigeon.PigeonMifareUltralightType.UNKNOWN
+ else -> error("TODO:")
+ }
+}
diff --git a/android/src/main/kotlin/dev/flutter/plugins/nfcmanager/Pigeon.java b/android/src/main/kotlin/dev/flutter/plugins/nfcmanager/Pigeon.java
new file mode 100644
index 0000000..8223232
--- /dev/null
+++ b/android/src/main/kotlin/dev/flutter/plugins/nfcmanager/Pigeon.java
@@ -0,0 +1,2959 @@
+// Autogenerated from Pigeon (v7.2.1), do not edit directly.
+// See also: https://pub.dev/packages/pigeon
+
+package dev.flutter.plugins.nfcmanager;
+
+import android.util.Log;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import io.flutter.plugin.common.BasicMessageChannel;
+import io.flutter.plugin.common.BinaryMessenger;
+import io.flutter.plugin.common.MessageCodec;
+import io.flutter.plugin.common.StandardMessageCodec;
+import java.io.ByteArrayOutputStream;
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/** Generated class from Pigeon. */
+@SuppressWarnings({"unused", "unchecked", "CodeBlock2Expr", "RedundantSuppression"})
+public class Pigeon {
+ @NonNull
+ private static ArrayList