Skip to content

Commit

Permalink
Merge pull request #27 from xPutnikx/use-nfc-stream
Browse files Browse the repository at this point in the history
use stream to be able to read nfc details without interruptions
  • Loading branch information
matteocrippa committed Feb 23, 2019
2 parents b23039a + e989191 commit 5469452
Show file tree
Hide file tree
Showing 4 changed files with 44 additions and 28 deletions.
2 changes: 1 addition & 1 deletion android/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ android {
main.java.srcDirs += 'src/main/kotlin'
}
defaultConfig {
minSdkVersion 19
minSdkVersion 18
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
lintOptions {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@ import android.nfc.NfcManager
import android.nfc.Tag
import android.nfc.tech.Ndef
import android.os.Build
import io.flutter.plugin.common.EventChannel
import io.flutter.plugin.common.EventChannel.StreamHandler
import io.flutter.plugin.common.EventChannel.EventSink
import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.MethodChannel
import io.flutter.plugin.common.MethodChannel.MethodCallHandler
Expand All @@ -17,15 +20,15 @@ import java.nio.charset.Charset

const val PERMISSION_NFC = 1007

class FlutterNfcReaderPlugin(val registrar: Registrar) : MethodCallHandler, NfcAdapter.ReaderCallback {
class FlutterNfcReaderPlugin(val registrar: Registrar) : MethodCallHandler, EventChannel.StreamHandler, NfcAdapter.ReaderCallback {

private val activity = registrar.activity()

private var isReading = false
private var nfcAdapter: NfcAdapter? = null
private var nfcManager: NfcManager? = null

private var resulter: Result? = null
private var eventSink: EventChannel.EventSink? = null

private var kId = "nfcId"
private var kContent = "nfcContent"
Expand All @@ -37,8 +40,12 @@ class FlutterNfcReaderPlugin(val registrar: Registrar) : MethodCallHandler, Nfc
companion object {
@JvmStatic
fun registerWith(registrar: Registrar): Unit {
val channel = MethodChannel(registrar.messenger(), "flutter_nfc_reader")
channel.setMethodCallHandler(FlutterNfcReaderPlugin(registrar))
val messenger = registrar.messenger()
val channel = MethodChannel(messenger, "flutter_nfc_reader")
val eventChannel = EventChannel(messenger, "it.matteocrippa.flutternfcreader.flutter_nfc_reader")
val plugin = FlutterNfcReaderPlugin(registrar)
channel.setMethodCallHandler(plugin)
eventChannel.setStreamHandler(plugin)
}
}

Expand All @@ -59,15 +66,14 @@ class FlutterNfcReaderPlugin(val registrar: Registrar) : MethodCallHandler, Nfc
)
}

resulter = result
startNFC()

if (!isReading) {
val data = mapOf(kId to "", kContent to "", kError to "NFC Hardware not found", kStatus to "error")
result.success(data)
resulter = null
result.error("404", "NFC Hardware not found", null)
return
}

result.success(null)
}
"NfcStop" -> {
stopNFC()
Expand All @@ -80,6 +86,16 @@ class FlutterNfcReaderPlugin(val registrar: Registrar) : MethodCallHandler, Nfc
}
}

// EventChannel.StreamHandler methods
override fun onListen(arguments: Any?, eventSink: EventChannel.EventSink?) {
this.eventSink = eventSink
}

override fun onCancel(arguments: Any?) {
eventSink = null
stopNFC()
}

private fun startNFC(): Boolean {
isReading = if (nfcAdapter?.isEnabled == true) {

Expand All @@ -98,8 +114,8 @@ class FlutterNfcReaderPlugin(val registrar: Registrar) : MethodCallHandler, Nfc
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
nfcAdapter?.disableReaderMode(registrar.activity())
}
resulter = null
isReading = false
eventSink = null
}

// handle discovered NDEF Tags
Expand All @@ -117,7 +133,7 @@ class FlutterNfcReaderPlugin(val registrar: Registrar) : MethodCallHandler, Nfc
ndef?.close()
if (message != null) {
val data = mapOf(kId to id, kContent to message, kError to "", kStatus to "read")
resulter?.success(data)
eventSink?.success(data)
}
}

Expand Down
17 changes: 6 additions & 11 deletions example/lib/main.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import 'package:flutter/material.dart';
import 'dart:async';

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_nfc_reader/flutter_nfc_reader.dart';

Expand All @@ -20,23 +20,18 @@ class _MyAppState extends State<MyApp> {
}

Future<void> startNFC() async {
NfcData response;

setState(() {
_nfcData = NfcData();
_nfcData.status = NFCStatus.reading;
});

print('NFC: Scan started');

try {
print('NFC: Scan readed NFC tag');
response = await FlutterNfcReader.read;
} on PlatformException {
print('NFC: Scan stopped exception');
}
setState(() {
_nfcData = response;
print('NFC: Scan readed NFC tag');
FlutterNfcReader.read.listen((response) {
setState(() {
_nfcData = response;
});
});
}

Expand Down
17 changes: 11 additions & 6 deletions lib/flutter_nfc_reader.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import 'dart:async';

import 'package:flutter/services.dart';

enum NFCStatus {
Expand Down Expand Up @@ -54,13 +55,17 @@ class NfcData {
class FlutterNfcReader {
static const MethodChannel _channel =
const MethodChannel('flutter_nfc_reader');
static const stream =
const EventChannel('it.matteocrippa.flutternfcreader.flutter_nfc_reader');

static Future<NfcData> get read async {
final Map data = await _channel.invokeMethod('NfcRead');

final NfcData result = NfcData.fromMap(data);

return result;
static Stream<NfcData> get read {
final resultStream = _channel
.invokeMethod('NfcRead')
.asStream()
.asyncExpand((_) => stream
.receiveBroadcastStream()
.map((result) => NfcData.fromMap(result)));
return resultStream;
}

static Future<NfcData> get stop async {
Expand Down

0 comments on commit 5469452

Please sign in to comment.