· 5 years ago · Dec 30, 2020, 10:04 AM
1package org.noeticASSAintegrator;
2
3import android.Manifest;
4import android.content.pm.PackageManager;
5import android.util.Log;
6import androidx.core.content.ContextCompat;
7
8import org.noeticASSAintegrator.util.Settings;
9import org.noeticASSAintegrator.bluetooth.ClosestLockTrigger;
10
11import com.facebook.react.bridge.LifecycleEventListener;
12import com.facebook.react.bridge.NativeModule;
13import com.facebook.react.bridge.Promise;
14import com.facebook.react.bridge.ReactContext;
15import com.facebook.react.bridge.ReactMethod;
16import com.facebook.react.modules.core.DeviceEventManagerModule;
17import com.facebook.react.bridge.ReactApplicationContext;
18import com.facebook.react.bridge.ReactContextBaseJavaModule;
19import com.facebook.react.bridge.ReactMethod;
20import com.facebook.react.bridge.Callback;
21
22
23import com.assaabloy.mobilekeys.api.MobileKeysException;
24import com.assaabloy.mobilekeys.api.ReaderConnectionInfoType;
25import com.assaabloy.mobilekeys.api.ApiConfiguration;
26import com.assaabloy.mobilekeys.api.*;
27import com.assaabloy.mobilekeys.api.MobileKeys;
28import com.assaabloy.mobilekeys.api.MobileKeysApi;
29import com.assaabloy.mobilekeys.api.ReaderConnectionController;
30import com.assaabloy.mobilekeys.api.ble.*;
31import com.assaabloy.mobilekeys.api.hce.NfcConfiguration;
32import com.assaabloy.mobilekeys.api.hce.HceConnectionCallback;
33import com.assaabloy.mobilekeys.api.hce.HceConnectionListener;
34import com.assaabloy.mobilekeys.api.EndpointSetupConfiguration;
35import com.assaabloy.mobilekeys.api.MobileKeysCallback;
36
37import org.json.*;
38import java.util.Collections;
39import java.util.List;
40
41public class ReactNativeAssaIntegratorModule extends ReactContextBaseJavaModule implements
42 MobileKeysApiFactory,
43 ReaderConnectionListener,
44 HceConnectionListener,
45 ClosestLockTrigger.LockInRangeListener,
46 MobileKeysCallback {
47
48 private final ReactApplicationContext reactContext;
49 private MobileKeysApi mobileKeysFactory;
50 private ReaderConnectionCallback readerConnectionCallback;
51 private HceConnectionCallback hceConnectionCallback;
52 private static final int LOCK_SERVICE_CODE = Settings.AAMK_LOCK_SERVICE_CODE;
53 protected Promise _promise; // @ToDo: need event base solution for this
54 protected String _token; // @ToDo: need event base solution for this
55 private ClosestLockTrigger closestLockTrigger = new ClosestLockTrigger(this);
56
57 protected void log(final String message) {
58 Log.i("NOELog: (ASSA) ", message);
59 sendLogStream(message);
60 }
61
62 public ReactNativeAssaIntegratorModule(ReactApplicationContext reactContext) {
63 super(reactContext);
64 this.reactContext = reactContext;
65 }
66
67 @Override
68 public String getName() {
69 return "ReactNativeAssaIntegrator";
70 }
71
72 /**
73 * Configure and initialize the mobile keys library
74 */
75 @ReactMethod
76 public void initialiseManager (final Promise promise) {
77 log("Manager initialization started");
78 try {
79 OpeningTrigger[] openingTriggers = {new TapOpeningTrigger(this.reactContext)};
80 ScanConfiguration scanConfiguration = new ScanConfiguration.Builder(openingTriggers, LOCK_SERVICE_CODE)
81 .setBluetoothModeIfSupported(BluetoothMode.DUAL)
82 .setAllowBackgroundScanning(true)
83 .build();
84
85 ApiConfiguration apiConfiguration = new ApiConfiguration.Builder()
86 .setApplicationId(Settings.AAMK_APP_ID)
87 .setApplicationDescription(Settings.AAMK_APP_ID_DESCRIPTION)
88 .setNfcParameters(new NfcConfiguration.Builder()
89 .unsafe_setAttemptNfcWithScreenOff(false)
90 .build())
91 .build();
92 mobileKeysFactory = MobileKeysApi.getInstance();
93 if(mobileKeysFactory.isInitialized()) {
94 log("Manager already started");
95 }
96 else {
97 log("Manager not started");
98 mobileKeysFactory.initialize(this.reactContext, apiConfiguration, scanConfiguration);
99 MobileKeysApi.getInstance().getReaderConnectionController().enableHce();
100
101 readerConnectionCallback = new ReaderConnectionCallback(getReactApplicationContext());
102 readerConnectionCallback.registerReceiver(this); // reactContext ?
103
104 hceConnectionCallback = new HceConnectionCallback(getReactApplicationContext());
105 hceConnectionCallback.registerReceiver(this); // reactContext ?
106 mobileKeysFactory.getReaderConnectionController().getScanConfiguration().getRootOpeningTrigger().add(closestLockTrigger);
107 loadKeys();
108 }
109 promise.resolve("");
110 }
111 catch (Exception e) {
112 log("initialiseManager error " + e.toString());
113 promise.reject("ERROR", "initialiseManager error");
114 }
115 }
116
117 /**
118 * Register
119 * @return
120 */
121 @ReactMethod
122 public void register(final String invitationCode, final Promise promise) {
123 log("Endpoint setup started with : " + invitationCode);
124 _promise = promise;
125 mobileKeysFactory.getMobileKeys().endpointSetup(this, invitationCode, new EndpointSetupConfiguration.Builder().build());
126 }
127
128 /**
129 * Unregister
130 */
131 @ReactMethod
132 public void unregister(final Promise promise) {
133 try {
134 _promise = promise;
135 readerConnectionCallback.unregisterReceiver();
136 hceConnectionCallback.unregisterReceiver();
137 mobileKeysFactory.getMobileKeys().unregisterEndpoint(this);
138 log("Unregister success");
139 }
140 catch (Exception e) {
141 log("Unregister error: " + e.getMessage());
142 promise.reject("Unregister failed");
143 }
144 }
145
146 /**
147 * Get key cards
148 */
149 @ReactMethod
150 public void getKeyCards(final Promise promise) {
151 try {
152 List<MobileKey> keyList = null;
153 JSONArray keys = new JSONArray();
154 keyList = this.getMobileKeys().listMobileKeys();
155 if (keyList == null) {
156 keyList = Collections.emptyList();
157 }
158 for (MobileKey key : keyList) {
159 JSONObject keyData = new JSONObject();
160 keyData.put("cardNumber", key.getCardNumber());
161 keyData.put("externalId", key.getExternalId());
162 keyData.put("label", key.getLabel());
163 keyData.put("issuer", key.getIssuer());
164 keyData.put("type", key.getType());
165// obj.put("metadata", key.getEndDate());
166 keys.put(keyData);
167 System.out.println(key.getCardNumber());
168 }
169 if (keyList.isEmpty()) {
170 stopScanning();
171 }
172 log("Get key cards success");
173 String keysArrayString = keys.toString();
174 promise.resolve(keysArrayString);
175 }
176 catch (Exception e) {
177 log("Get key cards error: " + e.getMessage());
178 promise.reject("Get key cards failed");
179 }
180 }
181
182 /**
183 * Synchronise
184 * @param promise
185 */
186 @ReactMethod
187 public void synchronise(final Promise promise) {
188 log("Synchronize with backend invoked.");
189 _promise = promise;
190 this.getMobileKeys().endpointUpdate(this);
191 }
192
193 /**
194 * Activate the key
195 */
196 @ReactMethod
197 public void activateKey() {
198 try {
199 log("Open lock invoked.");
200 startScanning();
201 closestLockTrigger.openClosestReader();
202 }
203 catch (Exception e) {
204 log("Open lock error: " + e.getMessage());
205 }
206 }
207
208
209 /**
210 * Deactivate the key
211 * SDK doen't support for key deactivation but instead of deactivating we'll stop scaning process
212 */
213 @ReactMethod
214 public void deactivateKey() {
215 try {
216 stopScanning();
217 }
218 catch (Exception e) {
219 log("scanning stop error: " + e.getMessage());
220 }
221 }
222
223 @Override
224 public MobileKeys getMobileKeys()
225 {
226 return mobileKeysFactory.getMobileKeys();
227 }
228
229 /**
230 * Load mobile keys api
231 */
232 private void loadKeys()
233 {
234 List<MobileKey> data = null;
235 try {
236 data = mobileKeysFactory.getMobileKeys().listMobileKeys();
237 }
238 catch (MobileKeysException e) {
239 log("Failed to list keys");
240 }
241 if (data == null) {
242 data = Collections.emptyList();
243 }
244 //Update scanning based if we have keys
245 if (data.isEmpty())
246 {
247 stopScanning();
248 }
249 else
250 {
251 startScanning();
252 }
253 }
254
255 @Override
256 public ReaderConnectionController getReaderConnectionController() {
257 return mobileKeysFactory.getReaderConnectionController();
258 }
259
260 @Override
261 public ScanConfiguration getScanConfiguration() {
262 return getReaderConnectionController().getScanConfiguration();
263 }
264
265 /**
266 * ReaderConnectionListener methods
267 * @param reader
268 * @param openingType
269 */
270 @Override
271 public void onReaderConnectionOpened(Reader reader, OpeningType openingType)
272 {
273 log("onReaderConnectionOpened");
274 }
275
276 @Override
277 public void onReaderConnectionClosed(Reader reader, OpeningResult openingResult) {
278 log("onReaderConnectionClosed: " + openingResult.getOpeningStatus());
279 }
280
281 @Override
282 public void onReaderConnectionFailed(Reader reader, OpeningType openingType, OpeningStatus openingStatus) {
283 log("onReaderConnectionFailed");
284 }
285
286 /**
287 * HceConnectionListener methods
288 */
289 @Override
290 public void onHceSessionOpened()
291 {
292 log("onSessionOpened");
293 }
294
295 @Override
296 public void onHceSessionClosed(int i)
297 {
298 log("onSessionClosed");
299 }
300
301 @Override
302 public void onHceSessionInfo(ReaderConnectionInfoType hceConnectionInfoType)
303 {
304 log("onHceSessionInfo");
305 }
306
307 /**
308 * Mobile keys transaction success/completed callback
309 */
310 @Override
311 public void handleMobileKeysTransactionCompleted() {
312 log("Registration/Endpoint setup or synchronize completed");
313 _promise.resolve("Registration/Endpoint setup or synchronize completed");
314 }
315
316 /**
317 * Mobile keys transaction failed callback
318 *
319 * @param mobileKeysException failed description
320 */
321 @Override
322 public void handleMobileKeysTransactionFailed(MobileKeysException mobileKeysException) {
323 log("Registration/Endpoint setup or synchronize failed " + mobileKeysException.getCauseMessage());
324 _promise.reject("Registration/Endpoint setup or synchronize failed");
325 }
326
327 /**
328 * Callback from closest lock trigger.
329 * Toggle button
330 *
331 * @param lockInRange
332 */
333 public void onLockInRange(final boolean lockInRange) {
334
335 }
336
337 /**
338 * Stop BLE scanning or
339 */
340 private void stopScanning()
341 {
342 log("stop scanning");
343 ReaderConnectionController controller = MobileKeysApi.getInstance().getReaderConnectionController();
344 controller.stopScanning();
345 }
346
347 /**
348 * Start BLE scanning or request permission
349 */
350 private void startScanning() {
351 log("start scanning");
352 ReaderConnectionController controller = MobileKeysApi.getInstance().getReaderConnectionController();
353 controller.enableHce();
354 controller.startScanning();
355 }
356
357 /**
358 * Send log stream
359 * @param update
360 */
361 private void sendLogStream(String update) { emitEvent(getReactApplicationContext(), "ASSA_LOG_STREAM", update); }
362
363 /**
364 * Emit event
365 * @param reactContext
366 * @param eventName
367 * @param params
368 */
369 private void emitEvent(ReactContext reactContext, String eventName, String params) {
370 reactContext
371 .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
372 .emit(eventName, params);
373 }
374
375}
376