From 29b64519ab056f3ccdc716258b257c156dce566d Mon Sep 17 00:00:00 2001 From: Sal Hernandez Date: Tue, 1 Aug 2017 18:49:30 -0400 Subject: [PATCH 1/6] add 'removeListener' method to have a way to remove the NFC listener --- index.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/index.js b/index.js index 886b433..cfe1b1f 100644 --- a/index.js +++ b/index.js @@ -13,14 +13,14 @@ export const NdefRecordType = { MIME : "MIME" }; - +const NFC_DISCOVERED = '__NFC_DISCOVERED'; let _registeredToEvents = false; const _listeners = []; let _registerToEvents = () => { if(!_registeredToEvents){ NativeModules.ReactNativeNFC.getStartUpNfcData(_notifyListeners); - DeviceEventEmitter.addListener('__NFC_DISCOVERED', _notifyListeners); + DeviceEventEmitter.addListener(NFC_DISCOVERED, _notifyListeners); _registeredToEvents = true; } }; @@ -40,4 +40,9 @@ NFC.addListener = (callback) => { _registerToEvents(); }; -export default NFC; \ No newline at end of file +NFC.removeListener = () => { + DeviceEventEmitter.removeListener(NFC_DISCOVERED); + _listeners.splice(0, _listeners.length); + _registeredToEvents = false; +}; +export default NFC; From ad502a538599772abe950d37d23eb8de201a018b Mon Sep 17 00:00:00 2001 From: Sal Hernandez Date: Tue, 8 Aug 2017 00:42:46 -0400 Subject: [PATCH 2/6] add id (serialNumber) to payload for NfcAdapter.ACTION_NDEF_DISCOVERED action --- .../com/novadart/reactnativenfc/DataUtils.java | 15 +++++++++++++++ .../reactnativenfc/ReactNativeNFCModule.java | 18 +++++++++++++----- .../reactnativenfc/parser/NdefParser.java | 3 ++- 3 files changed, 30 insertions(+), 6 deletions(-) diff --git a/android/src/main/java/com/novadart/reactnativenfc/DataUtils.java b/android/src/main/java/com/novadart/reactnativenfc/DataUtils.java index a6962f1..e364a41 100644 --- a/android/src/main/java/com/novadart/reactnativenfc/DataUtils.java +++ b/android/src/main/java/com/novadart/reactnativenfc/DataUtils.java @@ -12,6 +12,21 @@ public class DataUtils { + final protected static char[] hexArray = "0123456789ABCDEF".toCharArray(); + + public static String bytesToHex(byte[] bytes) { + char[] hexChars = new char[bytes.length * 2]; + + for ( int j = 0; j < bytes.length; j++ ) { + int v = bytes[j] & 0xFF; + + hexChars[j * 2] = hexArray[v >>> 4]; + hexChars[j * 2 + 1] = hexArray[v & 0x0F]; + } + + return new String(hexChars); + } + public static WritableMap cloneWritableMap(WritableMap map){ if(map == null){ return null; diff --git a/android/src/main/java/com/novadart/reactnativenfc/ReactNativeNFCModule.java b/android/src/main/java/com/novadart/reactnativenfc/ReactNativeNFCModule.java index 453454e..31c28c2 100644 --- a/android/src/main/java/com/novadart/reactnativenfc/ReactNativeNFCModule.java +++ b/android/src/main/java/com/novadart/reactnativenfc/ReactNativeNFCModule.java @@ -11,6 +11,7 @@ import android.support.annotation.Nullable; import com.facebook.react.bridge.ActivityEventListener; +import com.facebook.react.bridge.Arguments; import com.facebook.react.bridge.Callback; import com.facebook.react.bridge.LifecycleEventListener; import com.facebook.react.bridge.ReactApplicationContext; @@ -64,7 +65,12 @@ private void handleIntent(Intent intent, boolean startupIntent) { for (int i = 0; i < rawMessages.length; i++) { messages[i] = (NdefMessage) rawMessages[i]; } - processNdefMessages(messages,startupIntent); + + Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); + byte[] id = tag.getId(); + String serialNumber = DataUtils.bytesToHex(id); + + processNdefMessages(serialNumber,messages,startupIntent); } break; @@ -104,8 +110,8 @@ private void sendEvent(@Nullable WritableMap payload) { .emit(EVENT_NFC_DISCOVERED, payload); } - private void processNdefMessages(NdefMessage[] messages, boolean startupIntent){ - NdefProcessingTask task = new NdefProcessingTask(startupIntent); + private void processNdefMessages(String serialNumber, NdefMessage[] messages, boolean startupIntent){ + NdefProcessingTask task = new NdefProcessingTask(serialNumber, startupIntent); task.execute(messages); } @@ -134,16 +140,18 @@ public void onHostDestroy() {} private class NdefProcessingTask extends AsyncTask { + private final String serialNumber; private final boolean startupIntent; - NdefProcessingTask(boolean startupIntent) { + NdefProcessingTask(String serialNumber, boolean startupIntent) { + this.serialNumber = serialNumber; this.startupIntent = startupIntent; } @Override protected WritableMap doInBackground(NdefMessage[]... params) { NdefMessage[] messages = params[0]; - return NdefParser.parse(messages); + return NdefParser.parse(serialNumber, messages); } @Override diff --git a/android/src/main/java/com/novadart/reactnativenfc/parser/NdefParser.java b/android/src/main/java/com/novadart/reactnativenfc/parser/NdefParser.java index ba088b3..4e0132e 100644 --- a/android/src/main/java/com/novadart/reactnativenfc/parser/NdefParser.java +++ b/android/src/main/java/com/novadart/reactnativenfc/parser/NdefParser.java @@ -21,9 +21,10 @@ public class NdefParser { - public static WritableMap parse(NdefMessage[] messages){ + public static WritableMap parse(String serialNumber, NdefMessage[] messages){ WritableMap result = new WritableNativeMap(); result.putString("type", NfcDataType.NDEF.name()); + result.putString("id", serialNumber); WritableArray data = new WritableNativeArray(); if(messages != null) { for (NdefMessage m : messages) { From e7d475ea1b35cbe20998d5dcff121b2e6223d36c Mon Sep 17 00:00:00 2001 From: Sal Hernandez Date: Tue, 8 Aug 2017 00:46:51 -0400 Subject: [PATCH 3/6] add id (serialNumber) to payload for NfcAdapter.ACTION_TECH_DISCOVERED action --- .../reactnativenfc/ReactNativeNFCModule.java | 12 +++++++----- .../novadart/reactnativenfc/parser/TagParser.java | 3 ++- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/android/src/main/java/com/novadart/reactnativenfc/ReactNativeNFCModule.java b/android/src/main/java/com/novadart/reactnativenfc/ReactNativeNFCModule.java index 31c28c2..12f59ca 100644 --- a/android/src/main/java/com/novadart/reactnativenfc/ReactNativeNFCModule.java +++ b/android/src/main/java/com/novadart/reactnativenfc/ReactNativeNFCModule.java @@ -78,7 +78,7 @@ private void handleIntent(Intent intent, boolean startupIntent) { case NfcAdapter.ACTION_TAG_DISCOVERED: case NfcAdapter.ACTION_TECH_DISCOVERED: Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); - processTag(tag,startupIntent); + processTag(serialNumber,tag,startupIntent); break; } @@ -115,8 +115,8 @@ private void processNdefMessages(String serialNumber, NdefMessage[] messages, bo task.execute(messages); } - private void processTag(Tag tag, boolean startupIntent){ - TagProcessingTask task = new TagProcessingTask(startupIntent); + private void processTag(String serialNumber, Tag tag, boolean startupIntent){ + TagProcessingTask task = new TagProcessingTask(serialNumber, startupIntent); task.execute(tag); } @@ -166,16 +166,18 @@ protected void onPostExecute(WritableMap ndefData) { private class TagProcessingTask extends AsyncTask { + private final String serialNumber; private final boolean startupIntent; - TagProcessingTask(boolean startupIntent) { + TagProcessingTask(String serialNumber, boolean startupIntent) { + this.serialNumber = serialNumber; this.startupIntent = startupIntent; } @Override protected WritableMap doInBackground(Tag... params) { Tag tag = params[0]; - return TagParser.parse(tag); + return TagParser.parse(serialNumber, tag); } @Override diff --git a/android/src/main/java/com/novadart/reactnativenfc/parser/TagParser.java b/android/src/main/java/com/novadart/reactnativenfc/parser/TagParser.java index 3ae9a75..0e3ae78 100644 --- a/android/src/main/java/com/novadart/reactnativenfc/parser/TagParser.java +++ b/android/src/main/java/com/novadart/reactnativenfc/parser/TagParser.java @@ -10,10 +10,11 @@ public class TagParser { - public static WritableMap parse(Tag tag){ + public static WritableMap parse(String serialNumber, Tag tag){ WritableMap result = new WritableNativeMap(); result.putString("type", NfcDataType.TAG.name()); + result.putString("id", serialNumber); WritableMap data = new WritableNativeMap(); From 644ec6444da9e6363ea18fd020cf8aa7f9de137d Mon Sep 17 00:00:00 2001 From: Sal Hernandez Date: Tue, 8 Aug 2017 01:16:03 -0400 Subject: [PATCH 4/6] undo changes in index.js file because they shouldn't be part of this pull request --- index.js | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/index.js b/index.js index cfe1b1f..9c3cba9 100644 --- a/index.js +++ b/index.js @@ -40,9 +40,4 @@ NFC.addListener = (callback) => { _registerToEvents(); }; -NFC.removeListener = () => { - DeviceEventEmitter.removeListener(NFC_DISCOVERED); - _listeners.splice(0, _listeners.length); - _registeredToEvents = false; -}; -export default NFC; +export default NFC; \ No newline at end of file From 16a0551bc9e9ef9ce0921ae48f93aea62c657b08 Mon Sep 17 00:00:00 2001 From: Sal Hernandez Date: Tue, 8 Aug 2017 01:21:44 -0400 Subject: [PATCH 5/6] move serialNumber logic outside of switch statement to make accessible for all cases --- .../novadart/reactnativenfc/ReactNativeNFCModule.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/android/src/main/java/com/novadart/reactnativenfc/ReactNativeNFCModule.java b/android/src/main/java/com/novadart/reactnativenfc/ReactNativeNFCModule.java index 12f59ca..d6feab3 100644 --- a/android/src/main/java/com/novadart/reactnativenfc/ReactNativeNFCModule.java +++ b/android/src/main/java/com/novadart/reactnativenfc/ReactNativeNFCModule.java @@ -55,6 +55,10 @@ public void onNewIntent(Intent intent) { private void handleIntent(Intent intent, boolean startupIntent) { if (intent != null && intent.getAction() != null) { + Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); + byte[] id = tag.getId(); + String serialNumber = DataUtils.bytesToHex(id); + switch (intent.getAction()){ case NfcAdapter.ACTION_NDEF_DISCOVERED: @@ -66,10 +70,6 @@ private void handleIntent(Intent intent, boolean startupIntent) { messages[i] = (NdefMessage) rawMessages[i]; } - Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); - byte[] id = tag.getId(); - String serialNumber = DataUtils.bytesToHex(id); - processNdefMessages(serialNumber,messages,startupIntent); } break; @@ -77,7 +77,6 @@ private void handleIntent(Intent intent, boolean startupIntent) { // ACTION_TAG_DISCOVERED is an unlikely case, according to https://developer.android.com/guide/topics/connectivity/nfc/nfc.html case NfcAdapter.ACTION_TAG_DISCOVERED: case NfcAdapter.ACTION_TECH_DISCOVERED: - Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); processTag(serialNumber,tag,startupIntent); break; From 4db8c38756fc598720f35f32dceef229c63bb84a Mon Sep 17 00:00:00 2001 From: Sal Hernandez Date: Tue, 8 Aug 2017 14:01:52 -0400 Subject: [PATCH 6/6] move getting the serial number into a sperate method because the tag logic needs to be inside the switch statement, & it's being used twice. This addresses a bug where an error happens when onHostResume gets called --- .../reactnativenfc/ReactNativeNFCModule.java | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/android/src/main/java/com/novadart/reactnativenfc/ReactNativeNFCModule.java b/android/src/main/java/com/novadart/reactnativenfc/ReactNativeNFCModule.java index d6feab3..b9f5aff 100644 --- a/android/src/main/java/com/novadart/reactnativenfc/ReactNativeNFCModule.java +++ b/android/src/main/java/com/novadart/reactnativenfc/ReactNativeNFCModule.java @@ -55,10 +55,6 @@ public void onNewIntent(Intent intent) { private void handleIntent(Intent intent, boolean startupIntent) { if (intent != null && intent.getAction() != null) { - Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); - byte[] id = tag.getId(); - String serialNumber = DataUtils.bytesToHex(id); - switch (intent.getAction()){ case NfcAdapter.ACTION_NDEF_DISCOVERED: @@ -70,6 +66,9 @@ private void handleIntent(Intent intent, boolean startupIntent) { messages[i] = (NdefMessage) rawMessages[i]; } + Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); + String serialNumber = getSerialNumber(tag); + processNdefMessages(serialNumber,messages,startupIntent); } break; @@ -77,6 +76,9 @@ private void handleIntent(Intent intent, boolean startupIntent) { // ACTION_TAG_DISCOVERED is an unlikely case, according to https://developer.android.com/guide/topics/connectivity/nfc/nfc.html case NfcAdapter.ACTION_TAG_DISCOVERED: case NfcAdapter.ACTION_TECH_DISCOVERED: + Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); + String serialNumber = getSerialNumber(tag); + processTag(serialNumber,tag,startupIntent); break; @@ -106,8 +108,15 @@ public void getStartUpNfcData(Callback callback){ private void sendEvent(@Nullable WritableMap payload) { getReactApplicationContext() .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class) - .emit(EVENT_NFC_DISCOVERED, payload); } + .emit(EVENT_NFC_DISCOVERED, payload); + } + private String getSerialNumber(Tag tag){ + byte[] id = tag.getId(); + String serialNumber = DataUtils.bytesToHex(id); + + return serialNumber; + } private void processNdefMessages(String serialNumber, NdefMessage[] messages, boolean startupIntent){ NdefProcessingTask task = new NdefProcessingTask(serialNumber, startupIntent);