react-native-nfc-manager 4.0.0-beta.7 → 4.0.0-beta.9
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 +37 -3
- 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 +373 -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 +333 -1119
- 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 +201 -0
- 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 +153 -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 +126 -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 +76 -43
- package/ios/NfcManager.h +2 -10
- package/ios/NfcManager.mm +176 -434
- 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} +49 -20
- package/ndef-lib/{stringifier.js → stringifier.ts} +27 -10
- package/ndef-lib/{util.js → util.ts} +13 -8
- package/package.json +21 -7
- package/react-native-nfc-manager.podspec +3 -2
- package/specs/NativeNfcManager.ts +17 -3
- package/src/NativeNfcManager.ts +84 -0
- package/src/{NfcError.js → NfcError.ts} +6 -17
- package/src/{NfcManager.js → NfcManager.ts} +49 -34
- package/src/{NfcManagerAndroid.js → NfcManagerAndroid.ts} +25 -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.js +0 -3
- package/specs/NativeNfcManager.js.map +0 -1
- package/src/NativeNfcManager.js +0 -37
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
package community.revteltech.nfc;
|
|
2
|
+
|
|
3
|
+
import com.facebook.react.bridge.Callback;
|
|
4
|
+
import com.facebook.react.bridge.ReadableArray;
|
|
5
|
+
import com.facebook.react.bridge.ReadableMap;
|
|
6
|
+
import com.facebook.react.bridge.ReactApplicationContext;
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Temporary Android-side holder for iOS-only API stubs required by the shared RN spec.
|
|
10
|
+
*
|
|
11
|
+
* TODO: Remove this class after splitting platform specs so Android no longer needs iOS methods.
|
|
12
|
+
*/
|
|
13
|
+
@Deprecated
|
|
14
|
+
abstract class NfcManagerIOSStubBase extends NativeNfcManagerSpec {
|
|
15
|
+
NfcManagerIOSStubBase(ReactApplicationContext reactContext) {
|
|
16
|
+
super(reactContext);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
@Override
|
|
20
|
+
public void setAlertMessage(String message, Callback callback) {
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
@Override
|
|
24
|
+
public void isSessionAvailable(Callback callback) {
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
@Override
|
|
28
|
+
public void isTagSessionAvailable(Callback callback) {
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
@Override
|
|
32
|
+
public void sendMifareCommand(ReadableArray bytes, Callback callback) {
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
@Override
|
|
36
|
+
public void sendCommandAPDU(ReadableMap payload, Callback callback) {
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
@Override
|
|
40
|
+
public void sendCommandAPDUBytes(ReadableArray bytes, Callback callback) {
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
@Override
|
|
44
|
+
public void sendFelicaCommand(ReadableArray bytes, Callback callback) {
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
@Override
|
|
48
|
+
public void restartTechnologyRequest(Callback callback) {
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
@Override
|
|
52
|
+
public void invalidateSession(Callback callback) {
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
@Override
|
|
56
|
+
public void invalidateSessionWithError(String message, Callback callback) {
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
@Override
|
|
60
|
+
public void iso15693_getSystemInfo(double requestFlag, Callback callback) {
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
@Override
|
|
64
|
+
public void iso15693_readSingleBlock(ReadableMap options, Callback callback) {
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
@Override
|
|
68
|
+
public void iso15693_readMultipleBlocks(ReadableMap options, Callback callback) {
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
@Override
|
|
72
|
+
public void iso15693_writeSingleBlock(ReadableMap options, Callback callback) {
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
@Override
|
|
76
|
+
public void iso15693_lockBlock(ReadableMap options, Callback callback) {
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
@Override
|
|
80
|
+
public void iso15693_writeAFI(ReadableMap options, Callback callback) {
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
@Override
|
|
84
|
+
public void iso15693_lockAFI(ReadableMap options, Callback callback) {
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
@Override
|
|
88
|
+
public void iso15693_writeDSFID(ReadableMap options, Callback callback) {
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
@Override
|
|
92
|
+
public void iso15693_lockDSFID(ReadableMap options, Callback callback) {
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
@Override
|
|
96
|
+
public void iso15693_resetToReady(ReadableMap options, Callback callback) {
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
@Override
|
|
100
|
+
public void iso15693_select(ReadableMap options, Callback callback) {
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
@Override
|
|
104
|
+
public void iso15693_stayQuiet(Callback callback) {
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
@Override
|
|
108
|
+
public void iso15693_customCommand(ReadableMap options, Callback callback) {
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
@Override
|
|
112
|
+
public void iso15693_sendRequest(ReadableMap options, Callback callback) {
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
@Override
|
|
116
|
+
public void iso15693_extendedReadSingleBlock(ReadableMap options, Callback callback) {
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
@Override
|
|
120
|
+
public void iso15693_extendedReadMultipleBlocks(ReadableMap options, Callback callback) {
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
@Override
|
|
124
|
+
public void iso15693_extendedWriteSingleBlock(ReadableMap options, Callback callback) {
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
@Override
|
|
128
|
+
public void iso15693_extendedLockBlock(ReadableMap options, Callback callback) {
|
|
129
|
+
}
|
|
130
|
+
}
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
package community.revteltech.nfc;
|
|
2
|
+
|
|
3
|
+
import static community.revteltech.nfc.NfcErrorCodes.*;
|
|
4
|
+
|
|
5
|
+
import android.nfc.tech.IsoDep;
|
|
6
|
+
import android.nfc.tech.MifareClassic;
|
|
7
|
+
import android.nfc.tech.MifareUltralight;
|
|
8
|
+
import android.nfc.tech.NfcA;
|
|
9
|
+
import android.nfc.tech.NfcB;
|
|
10
|
+
import android.nfc.tech.NfcF;
|
|
11
|
+
import android.nfc.tech.NfcV;
|
|
12
|
+
import android.nfc.tech.TagTechnology;
|
|
13
|
+
|
|
14
|
+
import android.util.Log;
|
|
15
|
+
|
|
16
|
+
import com.facebook.react.bridge.Arguments;
|
|
17
|
+
import com.facebook.react.bridge.Callback;
|
|
18
|
+
import com.facebook.react.bridge.ReadableArray;
|
|
19
|
+
import com.facebook.react.bridge.WritableArray;
|
|
20
|
+
|
|
21
|
+
class NfcTechIoRouter {
|
|
22
|
+
private static final String LOG_TAG = "ReactNativeNfcManager";
|
|
23
|
+
|
|
24
|
+
private NfcTechIoRouter() {
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
static void setTimeout(
|
|
28
|
+
TagTechnologyRequest techRequest,
|
|
29
|
+
int timeout,
|
|
30
|
+
Callback callback
|
|
31
|
+
) {
|
|
32
|
+
if (techRequest == null) {
|
|
33
|
+
callback.invoke(ERR_NO_TECH_REQ);
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
try {
|
|
38
|
+
String tech = techRequest.getTechType();
|
|
39
|
+
TagTechnology baseTechHandle = techRequest.getTechHandle();
|
|
40
|
+
switch (tech) {
|
|
41
|
+
case "NfcA": {
|
|
42
|
+
NfcA techHandle = (NfcA) baseTechHandle;
|
|
43
|
+
techHandle.setTimeout(timeout);
|
|
44
|
+
callback.invoke();
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
case "NfcF": {
|
|
48
|
+
NfcF techHandle = (NfcF) baseTechHandle;
|
|
49
|
+
techHandle.setTimeout(timeout);
|
|
50
|
+
callback.invoke();
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
case "IsoDep": {
|
|
54
|
+
IsoDep techHandle = (IsoDep) baseTechHandle;
|
|
55
|
+
techHandle.setTimeout(timeout);
|
|
56
|
+
callback.invoke();
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
case "MifareClassic": {
|
|
60
|
+
MifareClassic techHandle = (MifareClassic) baseTechHandle;
|
|
61
|
+
techHandle.setTimeout(timeout);
|
|
62
|
+
callback.invoke();
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
case "MifareUltralight": {
|
|
66
|
+
MifareUltralight techHandle = (MifareUltralight) baseTechHandle;
|
|
67
|
+
techHandle.setTimeout(timeout);
|
|
68
|
+
callback.invoke();
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
Log.d(LOG_TAG, "setTimeout not supported");
|
|
74
|
+
callback.invoke(ERR_API_NOT_SUPPORT);
|
|
75
|
+
} catch (Exception ex) {
|
|
76
|
+
Log.d(LOG_TAG, ex.toString());
|
|
77
|
+
callback.invoke(ex.toString());
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
static void getTimeout(
|
|
82
|
+
TagTechnologyRequest techRequest,
|
|
83
|
+
Callback callback
|
|
84
|
+
) {
|
|
85
|
+
if (techRequest == null) {
|
|
86
|
+
callback.invoke(ERR_NO_TECH_REQ);
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
try {
|
|
91
|
+
String tech = techRequest.getTechType();
|
|
92
|
+
TagTechnology baseTechHandle = techRequest.getTechHandle();
|
|
93
|
+
switch (tech) {
|
|
94
|
+
case "NfcA": {
|
|
95
|
+
NfcA techHandle = (NfcA) baseTechHandle;
|
|
96
|
+
callback.invoke(null, techHandle.getTimeout());
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
case "NfcF": {
|
|
100
|
+
NfcF techHandle = (NfcF) baseTechHandle;
|
|
101
|
+
callback.invoke(null, techHandle.getTimeout());
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
case "IsoDep": {
|
|
105
|
+
IsoDep techHandle = (IsoDep) baseTechHandle;
|
|
106
|
+
callback.invoke(null, techHandle.getTimeout());
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
case "MifareClassic": {
|
|
110
|
+
MifareClassic techHandle = (MifareClassic) baseTechHandle;
|
|
111
|
+
callback.invoke(null, techHandle.getTimeout());
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
case "MifareUltralight": {
|
|
115
|
+
MifareUltralight techHandle = (MifareUltralight) baseTechHandle;
|
|
116
|
+
callback.invoke(null, techHandle.getTimeout());
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
Log.d(LOG_TAG, "getTimeout not supported");
|
|
122
|
+
callback.invoke(ERR_API_NOT_SUPPORT);
|
|
123
|
+
} catch (Exception ex) {
|
|
124
|
+
Log.d(LOG_TAG, ex.toString());
|
|
125
|
+
callback.invoke(ex.toString());
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
static void transceive(
|
|
130
|
+
TagTechnologyRequest techRequest,
|
|
131
|
+
ReadableArray rnArray,
|
|
132
|
+
Callback callback
|
|
133
|
+
) {
|
|
134
|
+
if (techRequest == null) {
|
|
135
|
+
callback.invoke(ERR_NO_TECH_REQ);
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
try {
|
|
140
|
+
String tech = techRequest.getTechType();
|
|
141
|
+
byte[] bytes = rnArrayToBytes(rnArray);
|
|
142
|
+
TagTechnology baseTechHandle = techRequest.getTechHandle();
|
|
143
|
+
|
|
144
|
+
switch (tech) {
|
|
145
|
+
case "NfcA": {
|
|
146
|
+
NfcA techHandle = (NfcA) baseTechHandle;
|
|
147
|
+
callback.invoke(null, bytesToRnArray(techHandle.transceive(bytes)));
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
case "NfcB": {
|
|
151
|
+
NfcB techHandle = (NfcB) baseTechHandle;
|
|
152
|
+
callback.invoke(null, bytesToRnArray(techHandle.transceive(bytes)));
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
case "NfcF": {
|
|
156
|
+
NfcF techHandle = (NfcF) baseTechHandle;
|
|
157
|
+
callback.invoke(null, bytesToRnArray(techHandle.transceive(bytes)));
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
case "NfcV": {
|
|
161
|
+
NfcV techHandle = (NfcV) baseTechHandle;
|
|
162
|
+
callback.invoke(null, bytesToRnArray(techHandle.transceive(bytes)));
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
case "IsoDep": {
|
|
166
|
+
IsoDep techHandle = (IsoDep) baseTechHandle;
|
|
167
|
+
callback.invoke(null, bytesToRnArray(techHandle.transceive(bytes)));
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
case "MifareClassic": {
|
|
171
|
+
MifareClassic techHandle = (MifareClassic) baseTechHandle;
|
|
172
|
+
callback.invoke(null, bytesToRnArray(techHandle.transceive(bytes)));
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
case "MifareUltralight": {
|
|
176
|
+
MifareUltralight techHandle = (MifareUltralight) baseTechHandle;
|
|
177
|
+
callback.invoke(null, bytesToRnArray(techHandle.transceive(bytes)));
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
Log.d(LOG_TAG, "transceive not supported");
|
|
183
|
+
callback.invoke(ERR_API_NOT_SUPPORT);
|
|
184
|
+
} catch (Exception ex) {
|
|
185
|
+
Log.d(LOG_TAG, "transceive fail: " + ex);
|
|
186
|
+
callback.invoke(ERR_TRANSCEIVE_FAIL);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
static void getMaxTransceiveLength(
|
|
191
|
+
TagTechnologyRequest techRequest,
|
|
192
|
+
Callback callback
|
|
193
|
+
) {
|
|
194
|
+
if (techRequest == null) {
|
|
195
|
+
callback.invoke(ERR_NO_TECH_REQ);
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
try {
|
|
200
|
+
String tech = techRequest.getTechType();
|
|
201
|
+
TagTechnology baseTechHandle = techRequest.getTechHandle();
|
|
202
|
+
switch (tech) {
|
|
203
|
+
case "NfcA": {
|
|
204
|
+
NfcA techHandle = (NfcA) baseTechHandle;
|
|
205
|
+
callback.invoke(null, techHandle.getMaxTransceiveLength());
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
case "NfcB": {
|
|
209
|
+
NfcB techHandle = (NfcB) baseTechHandle;
|
|
210
|
+
callback.invoke(null, techHandle.getMaxTransceiveLength());
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
case "NfcF": {
|
|
214
|
+
NfcF techHandle = (NfcF) baseTechHandle;
|
|
215
|
+
callback.invoke(null, techHandle.getMaxTransceiveLength());
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
case "NfcV": {
|
|
219
|
+
NfcV techHandle = (NfcV) baseTechHandle;
|
|
220
|
+
callback.invoke(null, techHandle.getMaxTransceiveLength());
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
case "IsoDep": {
|
|
224
|
+
IsoDep techHandle = (IsoDep) baseTechHandle;
|
|
225
|
+
callback.invoke(null, techHandle.getMaxTransceiveLength());
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
case "MifareUltralight": {
|
|
229
|
+
MifareUltralight techHandle = (MifareUltralight) baseTechHandle;
|
|
230
|
+
callback.invoke(null, techHandle.getMaxTransceiveLength());
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
Log.d(LOG_TAG, "getMaxTransceiveLength not supported");
|
|
236
|
+
callback.invoke(ERR_API_NOT_SUPPORT);
|
|
237
|
+
} catch (Exception ex) {
|
|
238
|
+
Log.d(LOG_TAG, "getMaxTransceiveLength fail");
|
|
239
|
+
callback.invoke(ex.toString());
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
private static byte[] rnArrayToBytes(ReadableArray rArray) {
|
|
244
|
+
byte[] bytes = new byte[rArray.size()];
|
|
245
|
+
for (int i = 0; i < rArray.size(); i++) {
|
|
246
|
+
bytes[i] = (byte) (rArray.getInt(i) & 0xff);
|
|
247
|
+
}
|
|
248
|
+
return bytes;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
private static WritableArray bytesToRnArray(byte[] bytes) {
|
|
252
|
+
WritableArray value = Arguments.createArray();
|
|
253
|
+
for (byte aByte : bytes) {
|
|
254
|
+
value.pushInt((aByte & 0xFF));
|
|
255
|
+
}
|
|
256
|
+
return value;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
@@ -33,19 +33,25 @@ class TagTechnologyRequest {
|
|
|
33
33
|
}
|
|
34
34
|
|
|
35
35
|
void invokePendingCallbackWithError(String err) {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
36
|
+
Callback callback = takePendingCallback();
|
|
37
|
+
if (callback != null) {
|
|
38
|
+
callback.invoke(err);
|
|
39
39
|
}
|
|
40
40
|
}
|
|
41
41
|
|
|
42
42
|
void invokePendingCallback(String connectedTech) {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
43
|
+
Callback callback = takePendingCallback();
|
|
44
|
+
if (callback != null) {
|
|
45
|
+
callback.invoke(null, connectedTech);
|
|
46
46
|
}
|
|
47
47
|
}
|
|
48
48
|
|
|
49
|
+
private Callback takePendingCallback() {
|
|
50
|
+
Callback callback = mJsCallback;
|
|
51
|
+
mJsCallback = null;
|
|
52
|
+
return callback;
|
|
53
|
+
}
|
|
54
|
+
|
|
49
55
|
TagTechnology getTechHandle() {
|
|
50
56
|
return mTech;
|
|
51
57
|
}
|
|
@@ -122,9 +128,15 @@ class TagTechnologyRequest {
|
|
|
122
128
|
|
|
123
129
|
void close() {
|
|
124
130
|
try {
|
|
125
|
-
mTech
|
|
131
|
+
if (mTech != null) {
|
|
132
|
+
mTech.close();
|
|
133
|
+
}
|
|
126
134
|
} catch (Exception ex) {
|
|
127
135
|
Log.d(LOG_TAG, "fail to close tech");
|
|
136
|
+
} finally {
|
|
137
|
+
mTag = null;
|
|
138
|
+
mTech = null;
|
|
139
|
+
mTechType = null;
|
|
128
140
|
}
|
|
129
141
|
}
|
|
130
142
|
}
|
|
@@ -1,16 +1,30 @@
|
|
|
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;
|
|
6
8
|
import android.nfc.tech.Ndef;
|
|
9
|
+
import android.os.Build;
|
|
7
10
|
import android.util.Log;
|
|
11
|
+
|
|
12
|
+
import com.facebook.react.bridge.Arguments;
|
|
13
|
+
import com.facebook.react.bridge.ReadableArray;
|
|
14
|
+
import com.facebook.react.bridge.ReadableMap;
|
|
15
|
+
import com.facebook.react.bridge.ReadableMapKeySetIterator;
|
|
16
|
+
import com.facebook.react.bridge.ReadableType;
|
|
17
|
+
import com.facebook.react.bridge.WritableArray;
|
|
18
|
+
import com.facebook.react.bridge.WritableMap;
|
|
19
|
+
|
|
8
20
|
import org.json.JSONArray;
|
|
9
21
|
import org.json.JSONException;
|
|
10
22
|
import org.json.JSONObject;
|
|
11
23
|
|
|
24
|
+
import java.io.File;
|
|
12
25
|
import java.util.ArrayList;
|
|
13
26
|
import java.util.Arrays;
|
|
27
|
+
import java.util.Iterator;
|
|
14
28
|
import java.util.List;
|
|
15
29
|
|
|
16
30
|
public class Util {
|
|
@@ -18,6 +32,128 @@ public class Util {
|
|
|
18
32
|
static final String TAG = "NfcPlugin";
|
|
19
33
|
final protected static char[] hexArray = "0123456789ABCDEF".toCharArray();
|
|
20
34
|
|
|
35
|
+
// region React-JSON Conversion
|
|
36
|
+
|
|
37
|
+
static JSONObject reactToJSON(ReadableMap readableMap) throws JSONException {
|
|
38
|
+
JSONObject jsonObject = new JSONObject();
|
|
39
|
+
ReadableMapKeySetIterator iterator = readableMap.keySetIterator();
|
|
40
|
+
while(iterator.hasNextKey()){
|
|
41
|
+
String key = iterator.nextKey();
|
|
42
|
+
ReadableType valueType = readableMap.getType(key);
|
|
43
|
+
switch (valueType){
|
|
44
|
+
case Null:
|
|
45
|
+
jsonObject.put(key,JSONObject.NULL);
|
|
46
|
+
break;
|
|
47
|
+
case Boolean:
|
|
48
|
+
jsonObject.put(key, readableMap.getBoolean(key));
|
|
49
|
+
break;
|
|
50
|
+
case Number:
|
|
51
|
+
try {
|
|
52
|
+
jsonObject.put(key, readableMap.getInt(key));
|
|
53
|
+
} catch(Exception e) {
|
|
54
|
+
jsonObject.put(key, readableMap.getDouble(key));
|
|
55
|
+
}
|
|
56
|
+
break;
|
|
57
|
+
case String:
|
|
58
|
+
jsonObject.put(key, readableMap.getString(key));
|
|
59
|
+
break;
|
|
60
|
+
case Map:
|
|
61
|
+
jsonObject.put(key, reactToJSON(readableMap.getMap(key)));
|
|
62
|
+
break;
|
|
63
|
+
case Array:
|
|
64
|
+
jsonObject.put(key, reactToJSON(readableMap.getArray(key)));
|
|
65
|
+
break;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
return jsonObject;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
static JSONArray reactToJSON(ReadableArray readableArray) throws JSONException {
|
|
73
|
+
JSONArray jsonArray = new JSONArray();
|
|
74
|
+
for(int i=0; i < readableArray.size(); i++) {
|
|
75
|
+
ReadableType valueType = readableArray.getType(i);
|
|
76
|
+
switch (valueType){
|
|
77
|
+
case Null:
|
|
78
|
+
jsonArray.put(JSONObject.NULL);
|
|
79
|
+
break;
|
|
80
|
+
case Boolean:
|
|
81
|
+
jsonArray.put(readableArray.getBoolean(i));
|
|
82
|
+
break;
|
|
83
|
+
case Number:
|
|
84
|
+
try {
|
|
85
|
+
jsonArray.put(readableArray.getInt(i));
|
|
86
|
+
} catch(Exception e) {
|
|
87
|
+
jsonArray.put(readableArray.getDouble(i));
|
|
88
|
+
}
|
|
89
|
+
break;
|
|
90
|
+
case String:
|
|
91
|
+
jsonArray.put(readableArray.getString(i));
|
|
92
|
+
break;
|
|
93
|
+
case Map:
|
|
94
|
+
jsonArray.put(reactToJSON(readableArray.getMap(i)));
|
|
95
|
+
break;
|
|
96
|
+
case Array:
|
|
97
|
+
jsonArray.put(reactToJSON(readableArray.getArray(i)));
|
|
98
|
+
break;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return jsonArray;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
static WritableMap jsonToReact(JSONObject jsonObject) throws JSONException {
|
|
105
|
+
WritableMap writableMap = Arguments.createMap();
|
|
106
|
+
Iterator<String> iterator = jsonObject.keys();
|
|
107
|
+
while(iterator.hasNext()) {
|
|
108
|
+
String key = iterator.next();
|
|
109
|
+
Object value = jsonObject.get(key);
|
|
110
|
+
if (value instanceof Float || value instanceof Double) {
|
|
111
|
+
writableMap.putDouble(key, jsonObject.getDouble(key));
|
|
112
|
+
} else if (value instanceof Number) {
|
|
113
|
+
writableMap.putInt(key, jsonObject.getInt(key));
|
|
114
|
+
} else if (value instanceof String) {
|
|
115
|
+
writableMap.putString(key, jsonObject.getString(key));
|
|
116
|
+
} else if (value instanceof JSONObject) {
|
|
117
|
+
writableMap.putMap(key,jsonToReact(jsonObject.getJSONObject(key)));
|
|
118
|
+
} else if (value instanceof JSONArray){
|
|
119
|
+
writableMap.putArray(key, jsonToReact(jsonObject.getJSONArray(key)));
|
|
120
|
+
} else if ("true".equals(value.toString()) || "false".equals(value.toString())){
|
|
121
|
+
writableMap.putBoolean(key, "true".equals(value.toString()));
|
|
122
|
+
} else if (value == JSONObject.NULL){
|
|
123
|
+
writableMap.putNull(key);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
return writableMap;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
static WritableArray jsonToReact(JSONArray jsonArray) throws JSONException {
|
|
131
|
+
WritableArray writableArray = Arguments.createArray();
|
|
132
|
+
for(int i=0; i < jsonArray.length(); i++) {
|
|
133
|
+
Object value = jsonArray.get(i);
|
|
134
|
+
if (value instanceof Float || value instanceof Double) {
|
|
135
|
+
writableArray.pushDouble(jsonArray.getDouble(i));
|
|
136
|
+
} else if (value instanceof Number) {
|
|
137
|
+
writableArray.pushInt(jsonArray.getInt(i));
|
|
138
|
+
} else if (value instanceof String) {
|
|
139
|
+
writableArray.pushString(jsonArray.getString(i));
|
|
140
|
+
} else if (value instanceof JSONObject) {
|
|
141
|
+
writableArray.pushMap(jsonToReact(jsonArray.getJSONObject(i)));
|
|
142
|
+
} else if (value instanceof JSONArray){
|
|
143
|
+
writableArray.pushArray(jsonToReact(jsonArray.getJSONArray(i)));
|
|
144
|
+
} else if ("true".equals(value.toString()) || "false".equals(value.toString())){
|
|
145
|
+
writableArray.pushBoolean("true".equals(value.toString()));
|
|
146
|
+
} else if (value == JSONObject.NULL){
|
|
147
|
+
writableArray.pushNull();
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return writableArray;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// endregion
|
|
154
|
+
|
|
155
|
+
// region NFC Conversion
|
|
156
|
+
|
|
21
157
|
static JSONObject ndefToJSON(Ndef ndef) {
|
|
22
158
|
JSONObject json = new JSONObject();
|
|
23
159
|
|
|
@@ -67,6 +203,15 @@ public class Util {
|
|
|
67
203
|
return json;
|
|
68
204
|
}
|
|
69
205
|
|
|
206
|
+
static WritableMap tagToReact(Tag tag) {
|
|
207
|
+
try {
|
|
208
|
+
JSONObject json = tagToJSON(tag);
|
|
209
|
+
return jsonToReact(json);
|
|
210
|
+
} catch (JSONException ex) {
|
|
211
|
+
return null;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
|
|
70
215
|
static String translateType(String type) {
|
|
71
216
|
String translation;
|
|
72
217
|
switch (type) {
|
|
@@ -139,4 +284,60 @@ public class Util {
|
|
|
139
284
|
return json;
|
|
140
285
|
}
|
|
141
286
|
|
|
287
|
+
// endregion
|
|
288
|
+
|
|
289
|
+
// region Device Capability
|
|
290
|
+
|
|
291
|
+
/**
|
|
292
|
+
* Checks if Mifare is supported on a device with some heuristics.
|
|
293
|
+
* Will _try_ to detect if Mifare is supported on a device or not. Please note that it's not fool-proof:
|
|
294
|
+
* on some older devices this can still return true while actual read/write later fails when a tag is scanned.
|
|
295
|
+
*
|
|
296
|
+
* Credits: ikarus23 (https://github.com/ikarus23/MifareClassicTool)
|
|
297
|
+
* @see https://github.com/ikarus23/MifareClassicTool/blob/master/Mifare%20Classic%20Tool/app/src/main/java/de/syss/MifareClassicTool/Common.java#L588
|
|
298
|
+
* @see https://github.com/ikarus23/MifareClassicTool/blob/master/INCOMPATIBLE_DEVICES.md
|
|
299
|
+
*/
|
|
300
|
+
static boolean isDeviceSupported(Activity currentActivity) {
|
|
301
|
+
if (currentActivity == null) {
|
|
302
|
+
return false;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
if (!currentActivity.getPackageManager().hasSystemFeature(PackageManager.FEATURE_NFC)) {
|
|
306
|
+
return false;
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
boolean foundViaFeatures = currentActivity.getPackageManager().hasSystemFeature("com.nxp.mifare");
|
|
310
|
+
if (!foundViaFeatures) {
|
|
311
|
+
return false;
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
boolean isLenovoP2 = Build.MANUFACTURER.equals("LENOVO")
|
|
315
|
+
&& Build.MODEL.equals("Lenovo P2a42");
|
|
316
|
+
File device = new File("/dev/bcm2079x-i2c");
|
|
317
|
+
if (!isLenovoP2 && device.exists()) {
|
|
318
|
+
return false;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
device = new File("/dev/pn544");
|
|
322
|
+
if (device.exists()) {
|
|
323
|
+
return true;
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
File libsFolder = new File("/system/lib");
|
|
327
|
+
File[] libs = libsFolder.listFiles();
|
|
328
|
+
if (libs != null) {
|
|
329
|
+
for (File lib : libs) {
|
|
330
|
+
if (lib.isFile()
|
|
331
|
+
&& lib.getName().startsWith("libnfc")
|
|
332
|
+
&& lib.getName().contains("brcm")) {
|
|
333
|
+
return false;
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
return true;
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
// endregion
|
|
342
|
+
|
|
142
343
|
}
|