react-native-nfc-manager 4.0.0-beta.1 → 4.0.0-beta.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +146 -49
- package/android/src/main/java/community/revteltech/nfc/MifareClassicHandler.java +419 -0
- package/android/src/main/java/community/revteltech/nfc/MifareUltralightHandler.java +84 -0
- package/android/src/main/java/community/revteltech/nfc/NdefHandler.java +397 -0
- package/android/src/main/java/community/revteltech/nfc/NfcAdapterStateChangedReceiver.java +48 -0
- package/android/src/main/java/community/revteltech/nfc/NfcErrorCodes.java +16 -0
- package/android/src/main/java/community/revteltech/nfc/NfcManager.java +348 -1087
- package/android/src/main/java/community/revteltech/nfc/NfcManagerIOSStubBase.java +130 -0
- package/android/src/main/java/community/revteltech/nfc/NfcTechIoRouter.java +258 -0
- package/android/src/main/java/community/revteltech/nfc/TagTechnologyRequest.java +19 -7
- package/android/src/main/java/community/revteltech/nfc/Util.java +275 -2
- package/app.plugin.js +8 -9
- package/dist/ndef-lib/constants.js +67 -0
- package/dist/ndef-lib/constants.js.map +1 -0
- package/dist/ndef-lib/index.js +79 -0
- package/dist/ndef-lib/index.js.map +1 -0
- package/dist/ndef-lib/ndef-text.js +29 -0
- package/dist/ndef-lib/ndef-text.js.map +1 -0
- package/dist/ndef-lib/ndef-uri.js +40 -0
- package/dist/ndef-lib/ndef-uri.js.map +1 -0
- package/dist/ndef-lib/ndef-wifi-simple.js +100 -0
- package/dist/ndef-lib/ndef-wifi-simple.js.map +1 -0
- package/dist/ndef-lib/ndef.js +152 -0
- package/dist/ndef-lib/ndef.js.map +1 -0
- package/dist/ndef-lib/stringifier.js +155 -0
- package/dist/ndef-lib/stringifier.js.map +1 -0
- package/dist/ndef-lib/util.js +134 -0
- package/dist/ndef-lib/util.js.map +1 -0
- package/dist/specs/NativeNfcManager.js +5 -0
- package/dist/specs/NativeNfcManager.js.map +1 -0
- package/dist/src/NativeNfcManager.js +55 -0
- package/dist/src/NativeNfcManager.js.map +1 -0
- package/dist/src/NfcError.js +220 -0
- package/dist/src/NfcError.js.map +1 -0
- package/dist/src/NfcManager.js +175 -0
- package/dist/src/NfcManager.js.map +1 -0
- package/dist/src/NfcManagerAndroid.js +112 -0
- package/dist/src/NfcManagerAndroid.js.map +1 -0
- package/dist/src/NfcManagerIOS.js +119 -0
- package/dist/src/NfcManagerIOS.js.map +1 -0
- package/dist/src/NfcTech/Iso15693HandlerIOS.js +99 -0
- package/dist/src/NfcTech/Iso15693HandlerIOS.js.map +1 -0
- package/dist/src/NfcTech/IsoDepHandler.js +29 -0
- package/dist/src/NfcTech/IsoDepHandler.js.map +1 -0
- package/dist/src/NfcTech/MifareClassicHandlerAndroid.js +68 -0
- package/dist/src/NfcTech/MifareClassicHandlerAndroid.js.map +1 -0
- package/dist/src/NfcTech/MifareUltralightHandlerAndroid.js +23 -0
- package/dist/src/NfcTech/MifareUltralightHandlerAndroid.js.map +1 -0
- package/dist/src/NfcTech/NdefFormatableHandlerAndroid.js +16 -0
- package/dist/src/NfcTech/NdefFormatableHandlerAndroid.js.map +1 -0
- package/dist/src/NfcTech/NdefHandler.js +54 -0
- package/dist/src/NfcTech/NdefHandler.js.map +1 -0
- package/dist/src/NfcTech/NfcAHandler.js +16 -0
- package/dist/src/NfcTech/NfcAHandler.js.map +1 -0
- package/dist/src/NfcTech/NfcVHandler.js +33 -0
- package/dist/src/NfcTech/NfcVHandler.js.map +1 -0
- package/dist/src/index.js +53 -0
- package/dist/src/index.js.map +1 -0
- package/index.d.ts +110 -46
- package/ios/NfcManager.h +2 -11
- package/ios/NfcManager.mm +264 -438
- package/ios/RNNfcBridgeUtil.h +28 -0
- package/ios/RNNfcBridgeUtil.mm +52 -0
- package/ios/RNNfcManager+Felica.swift +61 -0
- package/ios/RNNfcManager+Iso15693.swift +895 -0
- package/ios/RNNfcManager+IsoDep.swift +145 -0
- package/ios/RNNfcManager+Mifare.swift +61 -0
- package/ios/RNNfcManager+Ndef.swift +120 -0
- package/ios/RNNfcManager.h +251 -0
- package/ios/RNNfcManager.swift +648 -0
- package/ios/RNNfcSessionDelegateProxy.swift +104 -0
- package/ios/RNNfcSwiftUtil.swift +34 -0
- package/ndef-lib/{constants.js → constants.ts} +2 -0
- package/ndef-lib/{index.js → index.ts} +23 -12
- package/ndef-lib/{ndef-text.js → ndef-text.ts} +7 -2
- package/ndef-lib/{ndef-uri.js → ndef-uri.ts} +8 -3
- package/ndef-lib/{ndef-wifi-simple.js → ndef-wifi-simple.ts} +34 -11
- package/ndef-lib/{ndef.js → ndef.ts} +53 -25
- package/ndef-lib/{stringifier.js → stringifier.ts} +27 -10
- package/ndef-lib/{util.js → util.ts} +23 -9
- package/package.json +39 -21
- package/react-native-nfc-manager.podspec +3 -2
- package/specs/NativeNfcManager.ts +18 -4
- package/src/NativeNfcManager.ts +84 -0
- package/src/{NfcError.js → NfcError.ts} +6 -17
- package/src/{NfcManager.js → NfcManager.ts} +51 -34
- package/src/{NfcManagerAndroid.js → NfcManagerAndroid.ts} +27 -8
- package/src/{NfcManagerIOS.js → NfcManagerIOS.ts} +31 -10
- package/src/NfcTech/{Iso15693HandlerIOS.js → Iso15693HandlerIOS.ts} +64 -36
- package/src/NfcTech/{IsoDepHandler.js → IsoDepHandler.ts} +8 -5
- package/src/NfcTech/{MifareClassicHandlerAndroid.js → MifareClassicHandlerAndroid.ts} +33 -24
- package/src/NfcTech/{MifareUltralightHandlerAndroid.js → MifareUltralightHandlerAndroid.ts} +14 -5
- package/src/NfcTech/{NdefFormatableHandlerAndroid.js → NdefFormatableHandlerAndroid.ts} +9 -2
- package/src/NfcTech/{NdefHandler.js → NdefHandler.ts} +19 -6
- package/src/NfcTech/{NfcAHandler.js → NfcAHandler.ts} +6 -3
- package/src/NfcTech/{NfcVHandler.js → NfcVHandler.ts} +8 -5
- package/src/__mocks__/{NativeNfcManager.js → NativeNfcManager.ts} +4 -1
- package/src/{index.js → index.ts} +1 -1
- package/android/src/main/java/community/revteltech/nfc/JsonConvert.java +0 -141
- package/android/src/main/java/community/revteltech/nfc/MifareUtil.java +0 -84
- package/ios/NfcManager+Felica.mm +0 -43
- package/ios/NfcManager+Iso15693.mm +0 -600
- package/ios/NfcManager+IsoDep.mm +0 -83
- package/ios/NfcManager+Mifare.mm +0 -43
- package/ios/Util.mm +0 -55
- package/specs/NativeNfcManager.d.ts +0 -6
- package/specs/NativeNfcManager.js +0 -3
- package/specs/NativeNfcManager.js.map +0 -1
- package/src/NativeNfcManager.js +0 -37
|
@@ -1,16 +1,33 @@
|
|
|
1
1
|
package community.revteltech.nfc;
|
|
2
2
|
|
|
3
|
+
import android.app.Activity;
|
|
4
|
+
import android.content.pm.PackageManager;
|
|
3
5
|
import android.nfc.NdefMessage;
|
|
4
6
|
import android.nfc.NdefRecord;
|
|
5
7
|
import android.nfc.Tag;
|
|
8
|
+
import android.nfc.tech.IsoDep;
|
|
6
9
|
import android.nfc.tech.Ndef;
|
|
10
|
+
import android.nfc.tech.NfcA;
|
|
11
|
+
import android.nfc.tech.NfcV;
|
|
12
|
+
import android.os.Build;
|
|
7
13
|
import android.util.Log;
|
|
14
|
+
|
|
15
|
+
import com.facebook.react.bridge.Arguments;
|
|
16
|
+
import com.facebook.react.bridge.ReadableArray;
|
|
17
|
+
import com.facebook.react.bridge.ReadableMap;
|
|
18
|
+
import com.facebook.react.bridge.ReadableMapKeySetIterator;
|
|
19
|
+
import com.facebook.react.bridge.ReadableType;
|
|
20
|
+
import com.facebook.react.bridge.WritableArray;
|
|
21
|
+
import com.facebook.react.bridge.WritableMap;
|
|
22
|
+
|
|
8
23
|
import org.json.JSONArray;
|
|
9
24
|
import org.json.JSONException;
|
|
10
25
|
import org.json.JSONObject;
|
|
11
26
|
|
|
27
|
+
import java.io.File;
|
|
12
28
|
import java.util.ArrayList;
|
|
13
29
|
import java.util.Arrays;
|
|
30
|
+
import java.util.Iterator;
|
|
14
31
|
import java.util.List;
|
|
15
32
|
|
|
16
33
|
public class Util {
|
|
@@ -18,6 +35,128 @@ public class Util {
|
|
|
18
35
|
static final String TAG = "NfcPlugin";
|
|
19
36
|
final protected static char[] hexArray = "0123456789ABCDEF".toCharArray();
|
|
20
37
|
|
|
38
|
+
// region React-JSON Conversion
|
|
39
|
+
|
|
40
|
+
static JSONObject reactToJSON(ReadableMap readableMap) throws JSONException {
|
|
41
|
+
JSONObject jsonObject = new JSONObject();
|
|
42
|
+
ReadableMapKeySetIterator iterator = readableMap.keySetIterator();
|
|
43
|
+
while(iterator.hasNextKey()){
|
|
44
|
+
String key = iterator.nextKey();
|
|
45
|
+
ReadableType valueType = readableMap.getType(key);
|
|
46
|
+
switch (valueType){
|
|
47
|
+
case Null:
|
|
48
|
+
jsonObject.put(key,JSONObject.NULL);
|
|
49
|
+
break;
|
|
50
|
+
case Boolean:
|
|
51
|
+
jsonObject.put(key, readableMap.getBoolean(key));
|
|
52
|
+
break;
|
|
53
|
+
case Number:
|
|
54
|
+
try {
|
|
55
|
+
jsonObject.put(key, readableMap.getInt(key));
|
|
56
|
+
} catch(Exception e) {
|
|
57
|
+
jsonObject.put(key, readableMap.getDouble(key));
|
|
58
|
+
}
|
|
59
|
+
break;
|
|
60
|
+
case String:
|
|
61
|
+
jsonObject.put(key, readableMap.getString(key));
|
|
62
|
+
break;
|
|
63
|
+
case Map:
|
|
64
|
+
jsonObject.put(key, reactToJSON(readableMap.getMap(key)));
|
|
65
|
+
break;
|
|
66
|
+
case Array:
|
|
67
|
+
jsonObject.put(key, reactToJSON(readableMap.getArray(key)));
|
|
68
|
+
break;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
return jsonObject;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
static JSONArray reactToJSON(ReadableArray readableArray) throws JSONException {
|
|
76
|
+
JSONArray jsonArray = new JSONArray();
|
|
77
|
+
for(int i=0; i < readableArray.size(); i++) {
|
|
78
|
+
ReadableType valueType = readableArray.getType(i);
|
|
79
|
+
switch (valueType){
|
|
80
|
+
case Null:
|
|
81
|
+
jsonArray.put(JSONObject.NULL);
|
|
82
|
+
break;
|
|
83
|
+
case Boolean:
|
|
84
|
+
jsonArray.put(readableArray.getBoolean(i));
|
|
85
|
+
break;
|
|
86
|
+
case Number:
|
|
87
|
+
try {
|
|
88
|
+
jsonArray.put(readableArray.getInt(i));
|
|
89
|
+
} catch(Exception e) {
|
|
90
|
+
jsonArray.put(readableArray.getDouble(i));
|
|
91
|
+
}
|
|
92
|
+
break;
|
|
93
|
+
case String:
|
|
94
|
+
jsonArray.put(readableArray.getString(i));
|
|
95
|
+
break;
|
|
96
|
+
case Map:
|
|
97
|
+
jsonArray.put(reactToJSON(readableArray.getMap(i)));
|
|
98
|
+
break;
|
|
99
|
+
case Array:
|
|
100
|
+
jsonArray.put(reactToJSON(readableArray.getArray(i)));
|
|
101
|
+
break;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return jsonArray;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
static WritableMap jsonToReact(JSONObject jsonObject) throws JSONException {
|
|
108
|
+
WritableMap writableMap = Arguments.createMap();
|
|
109
|
+
Iterator<String> iterator = jsonObject.keys();
|
|
110
|
+
while(iterator.hasNext()) {
|
|
111
|
+
String key = iterator.next();
|
|
112
|
+
Object value = jsonObject.get(key);
|
|
113
|
+
if (value instanceof Float || value instanceof Double) {
|
|
114
|
+
writableMap.putDouble(key, jsonObject.getDouble(key));
|
|
115
|
+
} else if (value instanceof Number) {
|
|
116
|
+
writableMap.putInt(key, jsonObject.getInt(key));
|
|
117
|
+
} else if (value instanceof String) {
|
|
118
|
+
writableMap.putString(key, jsonObject.getString(key));
|
|
119
|
+
} else if (value instanceof JSONObject) {
|
|
120
|
+
writableMap.putMap(key,jsonToReact(jsonObject.getJSONObject(key)));
|
|
121
|
+
} else if (value instanceof JSONArray){
|
|
122
|
+
writableMap.putArray(key, jsonToReact(jsonObject.getJSONArray(key)));
|
|
123
|
+
} else if ("true".equals(value.toString()) || "false".equals(value.toString())){
|
|
124
|
+
writableMap.putBoolean(key, "true".equals(value.toString()));
|
|
125
|
+
} else if (value == JSONObject.NULL){
|
|
126
|
+
writableMap.putNull(key);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
return writableMap;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
static WritableArray jsonToReact(JSONArray jsonArray) throws JSONException {
|
|
134
|
+
WritableArray writableArray = Arguments.createArray();
|
|
135
|
+
for(int i=0; i < jsonArray.length(); i++) {
|
|
136
|
+
Object value = jsonArray.get(i);
|
|
137
|
+
if (value instanceof Float || value instanceof Double) {
|
|
138
|
+
writableArray.pushDouble(jsonArray.getDouble(i));
|
|
139
|
+
} else if (value instanceof Number) {
|
|
140
|
+
writableArray.pushInt(jsonArray.getInt(i));
|
|
141
|
+
} else if (value instanceof String) {
|
|
142
|
+
writableArray.pushString(jsonArray.getString(i));
|
|
143
|
+
} else if (value instanceof JSONObject) {
|
|
144
|
+
writableArray.pushMap(jsonToReact(jsonArray.getJSONObject(i)));
|
|
145
|
+
} else if (value instanceof JSONArray){
|
|
146
|
+
writableArray.pushArray(jsonToReact(jsonArray.getJSONArray(i)));
|
|
147
|
+
} else if ("true".equals(value.toString()) || "false".equals(value.toString())){
|
|
148
|
+
writableArray.pushBoolean("true".equals(value.toString()));
|
|
149
|
+
} else if (value == JSONObject.NULL){
|
|
150
|
+
writableArray.pushNull();
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return writableArray;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// endregion
|
|
157
|
+
|
|
158
|
+
// region NFC Conversion
|
|
159
|
+
|
|
21
160
|
static JSONObject ndefToJSON(Ndef ndef) {
|
|
22
161
|
JSONObject json = new JSONObject();
|
|
23
162
|
|
|
@@ -27,8 +166,7 @@ public class Util {
|
|
|
27
166
|
Tag tag = ndef.getTag();
|
|
28
167
|
// tag is going to be null for NDEF_FORMATABLE until NfcUtil.parseMessage is refactored
|
|
29
168
|
if (tag != null) {
|
|
30
|
-
json
|
|
31
|
-
json.put("techTypes", new JSONArray(Arrays.asList(tag.getTechList())));
|
|
169
|
+
json = tagToJSON(tag);
|
|
32
170
|
}
|
|
33
171
|
|
|
34
172
|
json.put("type", translateType(ndef.getType()));
|
|
@@ -63,10 +201,89 @@ public class Util {
|
|
|
63
201
|
} catch (JSONException e) {
|
|
64
202
|
Log.e(TAG, "Failed to convert tag into json: " + tag, e);
|
|
65
203
|
}
|
|
204
|
+
|
|
205
|
+
addCachedTechnologyMetadata(json, tag);
|
|
66
206
|
}
|
|
67
207
|
return json;
|
|
68
208
|
}
|
|
69
209
|
|
|
210
|
+
private static void addCachedTechnologyMetadata(JSONObject json, Tag tag) {
|
|
211
|
+
NfcA nfcA = null;
|
|
212
|
+
try {
|
|
213
|
+
nfcA = NfcA.get(tag);
|
|
214
|
+
} catch (RuntimeException e) {
|
|
215
|
+
Log.w(TAG, "Failed to obtain cached NFC-A metadata", e);
|
|
216
|
+
}
|
|
217
|
+
if (nfcA != null) {
|
|
218
|
+
try {
|
|
219
|
+
byte[] atqa = nfcA.getAtqa();
|
|
220
|
+
if (atqa != null) {
|
|
221
|
+
json.put("atqa", byteArrayToJSON(atqa));
|
|
222
|
+
}
|
|
223
|
+
} catch (Exception e) {
|
|
224
|
+
Log.w(TAG, "Failed to read cached NFC-A ATQA", e);
|
|
225
|
+
}
|
|
226
|
+
try {
|
|
227
|
+
json.put("sak", nfcA.getSak() & 0xFFFF);
|
|
228
|
+
} catch (Exception e) {
|
|
229
|
+
Log.w(TAG, "Failed to read cached NFC-A SAK", e);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
NfcV nfcV = null;
|
|
234
|
+
try {
|
|
235
|
+
nfcV = NfcV.get(tag);
|
|
236
|
+
} catch (RuntimeException e) {
|
|
237
|
+
Log.w(TAG, "Failed to obtain cached NFC-V metadata", e);
|
|
238
|
+
}
|
|
239
|
+
if (nfcV != null) {
|
|
240
|
+
try {
|
|
241
|
+
json.put("dsfid", nfcV.getDsfId() & 0xFF);
|
|
242
|
+
} catch (Exception e) {
|
|
243
|
+
Log.w(TAG, "Failed to read cached NFC-V DSFID", e);
|
|
244
|
+
}
|
|
245
|
+
try {
|
|
246
|
+
json.put("responseFlags", nfcV.getResponseFlags() & 0xFF);
|
|
247
|
+
} catch (Exception e) {
|
|
248
|
+
Log.w(TAG, "Failed to read cached NFC-V response flags", e);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
IsoDep isoDep = null;
|
|
253
|
+
try {
|
|
254
|
+
isoDep = IsoDep.get(tag);
|
|
255
|
+
} catch (RuntimeException e) {
|
|
256
|
+
Log.w(TAG, "Failed to obtain cached ISO-DEP metadata", e);
|
|
257
|
+
}
|
|
258
|
+
if (isoDep != null) {
|
|
259
|
+
try {
|
|
260
|
+
byte[] historicalBytes = isoDep.getHistoricalBytes();
|
|
261
|
+
if (historicalBytes != null) {
|
|
262
|
+
json.put("historicalBytes", byteArrayToJSON(historicalBytes));
|
|
263
|
+
}
|
|
264
|
+
} catch (Exception e) {
|
|
265
|
+
Log.w(TAG, "Failed to read cached ISO-DEP historical bytes", e);
|
|
266
|
+
}
|
|
267
|
+
try {
|
|
268
|
+
byte[] hiLayerResponse = isoDep.getHiLayerResponse();
|
|
269
|
+
if (hiLayerResponse != null) {
|
|
270
|
+
json.put("hiLayerResponse", byteArrayToJSON(hiLayerResponse));
|
|
271
|
+
}
|
|
272
|
+
} catch (Exception e) {
|
|
273
|
+
Log.w(TAG, "Failed to read cached ISO-DEP higher-layer response", e);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
static WritableMap tagToReact(Tag tag) {
|
|
279
|
+
try {
|
|
280
|
+
JSONObject json = tagToJSON(tag);
|
|
281
|
+
return jsonToReact(json);
|
|
282
|
+
} catch (JSONException ex) {
|
|
283
|
+
return null;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
|
|
70
287
|
static String translateType(String type) {
|
|
71
288
|
String translation;
|
|
72
289
|
switch (type) {
|
|
@@ -139,4 +356,60 @@ public class Util {
|
|
|
139
356
|
return json;
|
|
140
357
|
}
|
|
141
358
|
|
|
359
|
+
// endregion
|
|
360
|
+
|
|
361
|
+
// region Device Capability
|
|
362
|
+
|
|
363
|
+
/**
|
|
364
|
+
* Checks if Mifare is supported on a device with some heuristics.
|
|
365
|
+
* Will _try_ to detect if Mifare is supported on a device or not. Please note that it's not fool-proof:
|
|
366
|
+
* on some older devices this can still return true while actual read/write later fails when a tag is scanned.
|
|
367
|
+
*
|
|
368
|
+
* Credits: ikarus23 (https://github.com/ikarus23/MifareClassicTool)
|
|
369
|
+
* @see https://github.com/ikarus23/MifareClassicTool/blob/master/Mifare%20Classic%20Tool/app/src/main/java/de/syss/MifareClassicTool/Common.java#L588
|
|
370
|
+
* @see https://github.com/ikarus23/MifareClassicTool/blob/master/INCOMPATIBLE_DEVICES.md
|
|
371
|
+
*/
|
|
372
|
+
static boolean isDeviceSupported(Activity currentActivity) {
|
|
373
|
+
if (currentActivity == null) {
|
|
374
|
+
return false;
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
if (!currentActivity.getPackageManager().hasSystemFeature(PackageManager.FEATURE_NFC)) {
|
|
378
|
+
return false;
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
boolean foundViaFeatures = currentActivity.getPackageManager().hasSystemFeature("com.nxp.mifare");
|
|
382
|
+
if (!foundViaFeatures) {
|
|
383
|
+
return false;
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
boolean isLenovoP2 = Build.MANUFACTURER.equals("LENOVO")
|
|
387
|
+
&& Build.MODEL.equals("Lenovo P2a42");
|
|
388
|
+
File device = new File("/dev/bcm2079x-i2c");
|
|
389
|
+
if (!isLenovoP2 && device.exists()) {
|
|
390
|
+
return false;
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
device = new File("/dev/pn544");
|
|
394
|
+
if (device.exists()) {
|
|
395
|
+
return true;
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
File libsFolder = new File("/system/lib");
|
|
399
|
+
File[] libs = libsFolder.listFiles();
|
|
400
|
+
if (libs != null) {
|
|
401
|
+
for (File lib : libs) {
|
|
402
|
+
if (lib.isFile()
|
|
403
|
+
&& lib.getName().startsWith("libnfc")
|
|
404
|
+
&& lib.getName().contains("brcm")) {
|
|
405
|
+
return false;
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
return true;
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
// endregion
|
|
414
|
+
|
|
142
415
|
}
|
package/app.plugin.js
CHANGED
|
@@ -42,9 +42,9 @@ function addValuesToArray(obj, key, values) {
|
|
|
42
42
|
function withIosNfcEntitlement(c, {includeNdefEntitlement}) {
|
|
43
43
|
return withEntitlementsPlist(c, (config) => {
|
|
44
44
|
// Add the required formats
|
|
45
|
-
let entitlements = ['NDEF', 'TAG']
|
|
45
|
+
let entitlements = ['NDEF', 'TAG'];
|
|
46
46
|
if (includeNdefEntitlement === false) {
|
|
47
|
-
entitlements = ['TAG']
|
|
47
|
+
entitlements = ['TAG'];
|
|
48
48
|
}
|
|
49
49
|
config.modResults = addValuesToArray(
|
|
50
50
|
config.modResults,
|
|
@@ -90,18 +90,17 @@ function withNfc(config, props = {}) {
|
|
|
90
90
|
config = withIosNfcSelectIdentifiers(config, {selectIdentifiers});
|
|
91
91
|
config = withIosNfcSystemCodes(config, {systemCodes});
|
|
92
92
|
|
|
93
|
-
// We start to support Android 12 from v3.11.1, and you will need to update compileSdkVersion to 31,
|
|
94
|
-
// otherwise the build will fail:
|
|
95
|
-
config = AndroidConfig.Version.withBuildScriptExtMinimumVersion(config, {
|
|
96
|
-
name: 'compileSdkVersion',
|
|
97
|
-
minVersion: 31,
|
|
98
|
-
});
|
|
99
|
-
|
|
100
93
|
if (nfcPermission !== false) {
|
|
101
94
|
config = withIosPermission(config, props);
|
|
102
95
|
config = AndroidConfig.Permissions.withPermissions(config, [
|
|
103
96
|
'android.permission.NFC',
|
|
104
97
|
]);
|
|
98
|
+
} else {
|
|
99
|
+
// The library manifest declares NFC for React Native CLI consumers. Block it
|
|
100
|
+
// explicitly when an Expo consumer opts out so manifest merging removes it.
|
|
101
|
+
config = AndroidConfig.Permissions.withBlockedPermissions(config, [
|
|
102
|
+
'android.permission.NFC',
|
|
103
|
+
]);
|
|
105
104
|
}
|
|
106
105
|
return config;
|
|
107
106
|
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const constants = {
|
|
4
|
+
TNF_EMPTY: 0x0,
|
|
5
|
+
TNF_WELL_KNOWN: 0x01,
|
|
6
|
+
TNF_MIME_MEDIA: 0x02,
|
|
7
|
+
TNF_ABSOLUTE_URI: 0x03,
|
|
8
|
+
TNF_EXTERNAL_TYPE: 0x04,
|
|
9
|
+
TNF_UNKNOWN: 0x05,
|
|
10
|
+
TNF_UNCHANGED: 0x06,
|
|
11
|
+
TNF_RESERVED: 0x07,
|
|
12
|
+
RTD_TEXT: 'T',
|
|
13
|
+
RTD_URI: 'U',
|
|
14
|
+
RTD_SMART_POSTER: 'Sp',
|
|
15
|
+
RTD_ALTERNATIVE_CARRIER: 'ac',
|
|
16
|
+
RTD_HANDOVER_CARRIER: 'Hc',
|
|
17
|
+
RTD_HANDOVER_REQUEST: 'Hr',
|
|
18
|
+
RTD_HANDOVER_SELECT: 'Hs',
|
|
19
|
+
RTD_BYTES_TEXT: [0x54],
|
|
20
|
+
RTD_BYTES_URI: [0x55],
|
|
21
|
+
RTD_BYTES_SMART_POSTER: [0x53, 0x70],
|
|
22
|
+
RTD_BYTES_ALTERNATIVE_CARRIER: [0x61, 0x63],
|
|
23
|
+
RTD_BYTES_HANDOVER_CARRIER: [0x48, 0x63],
|
|
24
|
+
RTD_BYTES_HANDOVER_REQUEST: [0x48, 0x72],
|
|
25
|
+
RTD_BYTES_HANDOVER_SELECT: [0x48, 0x73],
|
|
26
|
+
MIME_WFA_WSC: 'application/vnd.wfa.wsc',
|
|
27
|
+
RTD_URI_PROTOCOLS: [
|
|
28
|
+
'',
|
|
29
|
+
'http://www.',
|
|
30
|
+
'https://www.',
|
|
31
|
+
'http://',
|
|
32
|
+
'https://',
|
|
33
|
+
'tel:',
|
|
34
|
+
'mailto:',
|
|
35
|
+
'ftp://anonymous:anonymous@',
|
|
36
|
+
'ftp://ftp.',
|
|
37
|
+
'ftps://',
|
|
38
|
+
'sftp://',
|
|
39
|
+
'smb://',
|
|
40
|
+
'nfs://',
|
|
41
|
+
'ftp://',
|
|
42
|
+
'dav://',
|
|
43
|
+
'news:',
|
|
44
|
+
'telnet://',
|
|
45
|
+
'imap:',
|
|
46
|
+
'rtsp://',
|
|
47
|
+
'urn:',
|
|
48
|
+
'pop:',
|
|
49
|
+
'sip:',
|
|
50
|
+
'sips:',
|
|
51
|
+
'tftp:',
|
|
52
|
+
'btspp://',
|
|
53
|
+
'btl2cap://',
|
|
54
|
+
'btgoep://',
|
|
55
|
+
'tcpobex://',
|
|
56
|
+
'irdaobex://',
|
|
57
|
+
'file://',
|
|
58
|
+
'urn:epc:id:',
|
|
59
|
+
'urn:epc:tag:',
|
|
60
|
+
'urn:epc:pat:',
|
|
61
|
+
'urn:epc:raw:',
|
|
62
|
+
'urn:epc:',
|
|
63
|
+
'urn:nfc:',
|
|
64
|
+
],
|
|
65
|
+
};
|
|
66
|
+
module.exports = constants;
|
|
67
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../ndef-lib/constants.ts"],"names":[],"mappings":";;AAAA,MAAM,SAAS,GAAG;IAChB,SAAS,EAAE,GAAG;IACd,cAAc,EAAE,IAAI;IACpB,cAAc,EAAE,IAAI;IACpB,gBAAgB,EAAE,IAAI;IACtB,iBAAiB,EAAE,IAAI;IACvB,WAAW,EAAE,IAAI;IACjB,aAAa,EAAE,IAAI;IACnB,YAAY,EAAE,IAAI;IAElB,QAAQ,EAAE,GAAG;IACb,OAAO,EAAE,GAAG;IACZ,gBAAgB,EAAE,IAAI;IACtB,uBAAuB,EAAE,IAAI;IAC7B,oBAAoB,EAAE,IAAI;IAC1B,oBAAoB,EAAE,IAAI;IAC1B,mBAAmB,EAAE,IAAI;IAEzB,cAAc,EAAE,CAAC,IAAI,CAAC;IACtB,aAAa,EAAE,CAAC,IAAI,CAAC;IACrB,sBAAsB,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;IACpC,6BAA6B,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;IAC3C,0BAA0B,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;IACxC,0BAA0B,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;IACxC,yBAAyB,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;IAEvC,YAAY,EAAE,yBAAyB;IAEvC,iBAAiB,EAAE;QACjB,EAAE;QACF,aAAa;QACb,cAAc;QACd,SAAS;QACT,UAAU;QACV,MAAM;QACN,SAAS;QACT,4BAA4B;QAC5B,YAAY;QACZ,SAAS;QACT,SAAS;QACT,QAAQ;QACR,QAAQ;QACR,QAAQ;QACR,QAAQ;QACR,OAAO;QACP,WAAW;QACX,OAAO;QACP,SAAS;QACT,MAAM;QACN,MAAM;QACN,MAAM;QACN,OAAO;QACP,OAAO;QACP,UAAU;QACV,YAAY;QACZ,WAAW;QACX,YAAY;QACZ,aAAa;QACb,SAAS;QACT,aAAa;QACb,cAAc;QACd,cAAc;QACd,cAAc;QACd,UAAU;QACV,UAAU;KACX;CACF,CAAC;AAEF,MAAM,CAAC,OAAO,GAAG,SAAS,CAAC"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// originally from phonegap-nfc.js by Don Coleman
|
|
3
|
+
// adapted for react-native-nfc-manager by Richie Hsieh
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
const { createNdefRecord, encodeNdefMessage, decodeNdefMessage, equalToRecordType, } = require('./ndef');
|
|
6
|
+
const constants = require('./constants');
|
|
7
|
+
const util = require('./util');
|
|
8
|
+
const textHelper = require('./ndef-text');
|
|
9
|
+
const uriHelper = require('./ndef-uri');
|
|
10
|
+
const wifiSimpleHelper = require('./ndef-wifi-simple');
|
|
11
|
+
const stringifier = require('./stringifier');
|
|
12
|
+
const PrimitiveRecord = {
|
|
13
|
+
emptyRecord() {
|
|
14
|
+
return createNdefRecord(constants.TNF_EMPTY, [], [], []);
|
|
15
|
+
},
|
|
16
|
+
absoluteUriRecord(uri, payload = [], id = []) {
|
|
17
|
+
return createNdefRecord(constants.TNF_ABSOLUTE_URI, uri, id, payload);
|
|
18
|
+
},
|
|
19
|
+
mimeMediaRecord(mimeType, payload, id = []) {
|
|
20
|
+
return createNdefRecord(constants.TNF_MIME_MEDIA, mimeType, id, payload);
|
|
21
|
+
},
|
|
22
|
+
externalTypeRecord(externalType, payload, id = []) {
|
|
23
|
+
return createNdefRecord(constants.TNF_EXTERNAL_TYPE, externalType, id, payload);
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
const WellKnownRecord = {
|
|
27
|
+
textRecord(text, languageCode, id = []) {
|
|
28
|
+
return createNdefRecord(constants.TNF_WELL_KNOWN, constants.RTD_TEXT, id, textHelper.encodePayload(text, languageCode));
|
|
29
|
+
},
|
|
30
|
+
uriRecord(uri, id = []) {
|
|
31
|
+
return createNdefRecord(constants.TNF_WELL_KNOWN, constants.RTD_URI, id, uriHelper.encodePayload(uri));
|
|
32
|
+
},
|
|
33
|
+
smartPoster(ndefRecords, id = []) {
|
|
34
|
+
let payload = [];
|
|
35
|
+
if (ndefRecords) {
|
|
36
|
+
// make sure we have an array of something like NDEF records before encoding
|
|
37
|
+
if (ndefRecords[0] instanceof Object &&
|
|
38
|
+
ndefRecords[0].hasOwnProperty('tnf')) {
|
|
39
|
+
payload = encodeNdefMessage(ndefRecords);
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
// assume the caller has already encoded the NDEF records into a byte array
|
|
43
|
+
payload = ndefRecords;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
console.log('WARNING: Expecting an array of NDEF records');
|
|
48
|
+
}
|
|
49
|
+
return createNdefRecord(constants.TNF_WELL_KNOWN, constants.RTD_SMART_POSTER, id, payload);
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
const ExtraTypeRecord = {
|
|
53
|
+
androidApplicationRecord(packageName, id = []) {
|
|
54
|
+
return PrimitiveRecord.externalTypeRecord('android.com:pkg', packageName, id);
|
|
55
|
+
},
|
|
56
|
+
wifiSimpleRecord: function (credentials, id = []) {
|
|
57
|
+
let payload = wifiSimpleHelper.encodePayload(credentials);
|
|
58
|
+
return PrimitiveRecord.mimeMediaRecord(constants.MIME_WFA_WSC, payload, id);
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
const NDEF = {
|
|
62
|
+
...constants,
|
|
63
|
+
...PrimitiveRecord,
|
|
64
|
+
...WellKnownRecord,
|
|
65
|
+
...ExtraTypeRecord,
|
|
66
|
+
record: createNdefRecord,
|
|
67
|
+
encodeMessage: encodeNdefMessage,
|
|
68
|
+
decodeMessage: decodeNdefMessage,
|
|
69
|
+
isType: equalToRecordType,
|
|
70
|
+
// individual record type helpers
|
|
71
|
+
text: textHelper,
|
|
72
|
+
uri: uriHelper,
|
|
73
|
+
wifiSimple: wifiSimpleHelper,
|
|
74
|
+
// other helpers
|
|
75
|
+
util,
|
|
76
|
+
stringify: stringifier.stringify,
|
|
77
|
+
};
|
|
78
|
+
module.exports = NDEF;
|
|
79
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../ndef-lib/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
var util = require('./util');
|
|
4
|
+
// decode text bytes from ndef record payload
|
|
5
|
+
// @returns a string
|
|
6
|
+
function decode(data) {
|
|
7
|
+
var languageCodeLength = data[0] & 0x3f; // 6 LSBs
|
|
8
|
+
// languageCode = data.slice(1, 1 + languageCodeLength),
|
|
9
|
+
// utf16 = (data[0] & 0x80) !== 0; // assuming UTF-16BE
|
|
10
|
+
// TODO need to deal with UTF in the future
|
|
11
|
+
// console.log("lang " + languageCode + (utf16 ? " utf16" : " utf8"));
|
|
12
|
+
return util.bytesToString(data.slice(languageCodeLength + 1));
|
|
13
|
+
}
|
|
14
|
+
// encode text payload
|
|
15
|
+
// @returns an array of bytes
|
|
16
|
+
function encode(text, lang, encoding) {
|
|
17
|
+
// ISO/IANA language code, but we're not enforcing
|
|
18
|
+
if (!lang) {
|
|
19
|
+
lang = 'en';
|
|
20
|
+
}
|
|
21
|
+
var encoded = util.stringToBytes(lang + text);
|
|
22
|
+
encoded.unshift(lang.length);
|
|
23
|
+
return encoded;
|
|
24
|
+
}
|
|
25
|
+
module.exports = {
|
|
26
|
+
encodePayload: encode,
|
|
27
|
+
decodePayload: decode,
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=ndef-text.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ndef-text.js","sourceRoot":"","sources":["../../ndef-lib/ndef-text.ts"],"names":[],"mappings":";;AAAA,IAAI,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;AAK7B,6CAA6C;AAC7C,oBAAoB;AACpB,SAAS,MAAM,CAAC,IAAe;IAC7B,IAAI,kBAAkB,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,SAAS;IAClD,wDAAwD;IACxD,uDAAuD;IAEvD,2CAA2C;IAC3C,sEAAsE;IAEtE,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,kBAAkB,GAAG,CAAC,CAAC,CAAC,CAAC;AAChE,CAAC;AAED,sBAAsB;AACtB,6BAA6B;AAC7B,SAAS,MAAM,CAAC,IAAY,EAAE,IAAa,EAAE,QAAkB;IAC7D,kDAAkD;IAClD,IAAI,CAAC,IAAI,EAAE;QACT,IAAI,GAAG,IAAI,CAAC;KACb;IAED,IAAI,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IAC9C,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAE7B,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,OAAO,GAAG;IACf,aAAa,EAAE,MAAM;IACrB,aAAa,EAAE,MAAM;CACtB,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const util = require('./util');
|
|
4
|
+
const protocols = require('./constants').RTD_URI_PROTOCOLS;
|
|
5
|
+
// decode a URI payload bytes
|
|
6
|
+
// @returns a string
|
|
7
|
+
function decode(data) {
|
|
8
|
+
var prefix = protocols[data[0]];
|
|
9
|
+
if (!prefix) {
|
|
10
|
+
// 36 to 255 should be ""
|
|
11
|
+
prefix = '';
|
|
12
|
+
}
|
|
13
|
+
return prefix + util.bytesToString(data.slice(1));
|
|
14
|
+
}
|
|
15
|
+
// shorten a URI with standard prefix
|
|
16
|
+
// @returns an array of bytes
|
|
17
|
+
function encode(uri) {
|
|
18
|
+
var prefix, protocolCode, encoded;
|
|
19
|
+
// check each protocol, unless we've found a match
|
|
20
|
+
// "urn:" is the one exception where we need to keep checking
|
|
21
|
+
// slice so we don't check ""
|
|
22
|
+
protocols.slice(1).forEach(function (protocol) {
|
|
23
|
+
if ((!prefix || prefix === 'urn:') && uri.indexOf(protocol) === 0) {
|
|
24
|
+
prefix = protocol;
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
if (!prefix) {
|
|
28
|
+
prefix = '';
|
|
29
|
+
}
|
|
30
|
+
encoded = util.stringToBytes(uri.slice(prefix.length));
|
|
31
|
+
protocolCode = protocols.indexOf(prefix);
|
|
32
|
+
// prepend protocol code
|
|
33
|
+
encoded.unshift(protocolCode);
|
|
34
|
+
return encoded;
|
|
35
|
+
}
|
|
36
|
+
module.exports = {
|
|
37
|
+
encodePayload: encode,
|
|
38
|
+
decodePayload: decode,
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=ndef-uri.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ndef-uri.js","sourceRoot":"","sources":["../../ndef-lib/ndef-uri.ts"],"names":[],"mappings":";;AAAA,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;AAC/B,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC,iBAAiB,CAAC;AAK3D,6BAA6B;AAC7B,oBAAoB;AACpB,SAAS,MAAM,CAAC,IAAe;IAC7B,IAAI,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAChC,IAAI,CAAC,MAAM,EAAE;QACX,yBAAyB;QACzB,MAAM,GAAG,EAAE,CAAC;KACb;IACD,OAAO,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACpD,CAAC;AAED,qCAAqC;AACrC,6BAA6B;AAC7B,SAAS,MAAM,CAAC,GAAW;IACzB,IAAI,MAA0B,EAAE,YAAY,EAAE,OAAO,CAAC;IAEtD,kDAAkD;IAClD,6DAA6D;IAC7D,6BAA6B;IAC7B,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,QAAQ;QAC3C,IAAI,CAAC,CAAC,MAAM,IAAI,MAAM,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;YACjE,MAAM,GAAG,QAAQ,CAAC;SACnB;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,MAAM,EAAE;QACX,MAAM,GAAG,EAAE,CAAC;KACb;IAED,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IACvD,YAAY,GAAG,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACzC,wBAAwB;IACxB,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAE9B,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,OAAO,GAAG;IACf,aAAa,EAAE,MAAM;IACrB,aAAa,EAAE,MAAM;CACtB,CAAC"}
|