From 1ce3864a4a2be8dbc0e23975dea5f5c0dc17da08 Mon Sep 17 00:00:00 2001 From: Aleksandar Palic <1425202+codepushr@users.noreply.github.com> Date: Mon, 26 Aug 2024 15:10:25 +0200 Subject: [PATCH] refactor: add boolean return for signalization; reformat kotlin code --- README.md | 18 ++++---- .../abrevva/reactnative/AbrevvaBleModule.kt | 41 +++++++++---------- .../reactnative/AbrevvaCryptoModule.kt | 16 +++----- .../abrevva/reactnative/AbrevvaNfcModule.kt | 2 +- .../abrevva/reactnative/ExampleAppPackage.kt | 4 +- .../reactnative/AbrevvaBleModuleTest.kt | 7 +--- src/index.tsx | 9 +++- src/interfaces.tsx | 2 +- 8 files changed, 47 insertions(+), 52 deletions(-) diff --git a/README.md b/README.md index 1f62a7f..637e724 100644 --- a/README.md +++ b/README.md @@ -70,19 +70,19 @@ async function scanForBleDevices(androidNeverForLocation: Boolean = true, timeou With the signalize method you can localize EVVA components. On a successful signalization the component will emit a melody indicating its location. ```typescript -await AbrevvaBle.signalize({ deviceId: 'deviceId' }); +const success = await AbrevvaBle.signalize('deviceId'); ``` ### Perform disengage on EVVA components For the component disengage you have to provide access credentials to the EVVA component. Those are generally acquired in the form of access media metadata from the Xesar software. ```typescript -const status = await AbrevvaBle.disengage({ - deviceId: 'deviceId', - mobileId: 'mobileId', - mobileDeviceKey: 'mobileDeviceKey', - mobileGroupId: 'mobileGroupId', - mobileAccessData: 'mobileAccessData', - isPermanentRelease: false, -}); +const status = await AbrevvaBle.disengage( + 'deviceId', + 'mobileId', + 'mobileDeviceKey', + 'mobileGroupId', + 'mobileAccessData', + false, +); ``` diff --git a/android/src/main/java/com/evva/xesar/abrevva/reactnative/AbrevvaBleModule.kt b/android/src/main/java/com/evva/xesar/abrevva/reactnative/AbrevvaBleModule.kt index d785a75..30f0087 100644 --- a/android/src/main/java/com/evva/xesar/abrevva/reactnative/AbrevvaBleModule.kt +++ b/android/src/main/java/com/evva/xesar/abrevva/reactnative/AbrevvaBleModule.kt @@ -24,28 +24,13 @@ import java.util.UUID class AbrevvaBleModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaModule(reactContext) { - private lateinit var manager: BleManager - private lateinit var aliases: Array + private var manager: BleManager = BleManager(reactContext) + private var aliases: Array init { - manager = BleManager(reactContext) aliases = arrayOf() } - @SuppressLint("MissingPermission") - @ReactMethod - fun signalize(options: ReadableMap, promise: Promise) { - val deviceId = options.getString("deviceId") ?: "" - - manager.signalize(deviceId) { success: Boolean -> - if (success) { - promise.resolve("success") - } else { - promise.reject(Exception("signalize() failed")) - } - } - } - @ReactMethod fun initialize(options: ReadableMap, promise: Promise) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { @@ -255,7 +240,7 @@ class AbrevvaBleModule(reactContext: ReactApplicationContext) : ret.putString("value", bytesToString(data!!)) promise.resolve(ret) } else { - promise.reject("read(): failed to read from device") + promise.reject(Exception("read(): failed to read from device")) } }, timeout @@ -274,7 +259,7 @@ class AbrevvaBleModule(reactContext: ReactApplicationContext) : val characteristic = getCharacteristic(options, promise) - ?: return promise.reject("read(): bad characteristic") + ?: return promise.reject(Exception("read(): bad characteristic")) val value = options.getString("value") ?: return promise.reject(Exception("write(): missing value for write")) @@ -295,6 +280,20 @@ class AbrevvaBleModule(reactContext: ReactApplicationContext) : ) } + @SuppressLint("MissingPermission") + @ReactMethod + fun signalize(options: ReadableMap, promise: Promise) { + val deviceId = options.getString("deviceId") ?: "" + + manager.signalize(deviceId) { success: Boolean -> + if (success) { + promise.resolve("success") + } else { + promise.reject(Exception("signalize() failed")) + } + } + } + @ReactMethod @RequiresPermission(value = "android.permission.BLUETOOTH_CONNECT") fun disengage(options: ReadableMap, promise: Promise) { @@ -449,7 +448,7 @@ class AbrevvaBleModule(reactContext: ReactApplicationContext) : if (scanRecordBytes != null) { try { // Extract EVVA manufacturer-id - var arr = byteArrayOf(0x01) + val arr = byteArrayOf(0x01) arr.toHexString() val keyHex = byteArrayOf(scanRecordBytes.getByte(6)!!).toHexString() + byteArrayOf( scanRecordBytes.getByte(5)!! @@ -508,4 +507,4 @@ class AbrevvaBleModule(reactContext: ReactApplicationContext) : fun removeListeners(type: Int?) { // Keep: Required for RN built in Event Emitter Calls. } -} \ No newline at end of file +} diff --git a/android/src/main/java/com/evva/xesar/abrevva/reactnative/AbrevvaCryptoModule.kt b/android/src/main/java/com/evva/xesar/abrevva/reactnative/AbrevvaCryptoModule.kt index 54856d3..fc07ae8 100644 --- a/android/src/main/java/com/evva/xesar/abrevva/reactnative/AbrevvaCryptoModule.kt +++ b/android/src/main/java/com/evva/xesar/abrevva/reactnative/AbrevvaCryptoModule.kt @@ -11,13 +11,9 @@ import com.facebook.react.bridge.ReactApplicationContext import com.facebook.react.bridge.ReactContextBaseJavaModule import com.facebook.react.bridge.ReactMethod import com.facebook.react.bridge.ReadableMap -import com.hivemq.client.mqtt.mqtt3.Mqtt3AsyncClient.Mqtt3SubscribeAndCallbackBuilder.Call.Ex -import org.bouncycastle.util.encoders.Base64 import org.bouncycastle.util.encoders.Hex import java.io.BufferedInputStream import java.io.FileOutputStream -import java.io.IOException -import java.io.InputStream import java.net.URL import java.nio.file.Paths @@ -88,17 +84,17 @@ class AbrevvaCryptoModule(reactContext: ReactApplicationContext) : try { val privateKey = options.getString("privateKey") if (privateKey == null || privateKey == "") { - promise.reject("computeSharedSecret(): invalid private key") + promise.reject(Exception("computeSharedSecret(): invalid private key")) return } val peerPublicKey = options.getString("peerPublicKey") if (peerPublicKey == null || peerPublicKey == "") { - promise.reject("computeSharedSecret(): invalid peer public key") + promise.reject(Exception("computeSharedSecret(): invalid peer public key")) return } val sharedSecret: ByteArray = X25519Wrapper.computeSharedSecret( - Hex.decode(privateKey), - Hex.decode(peerPublicKey) + Hex.decode(privateKey), + Hex.decode(peerPublicKey) ) val ret = Arguments.createMap() @@ -168,8 +164,8 @@ class AbrevvaCryptoModule(reactContext: ReactApplicationContext) : promise.reject(e) } } - fun writeToFile(ctPath: String, url: String) { + fun writeToFile(ctPath: String, url: String) { BufferedInputStream(URL(url).openStream()).use { `in` -> FileOutputStream(ctPath).use { fileOutputStream -> val dataBuffer = ByteArray(4096) @@ -258,4 +254,4 @@ class AbrevvaCryptoModule(reactContext: ReactApplicationContext) : const val NAME = "AbrevvaCrypto" } -} \ No newline at end of file +} diff --git a/android/src/main/java/com/evva/xesar/abrevva/reactnative/AbrevvaNfcModule.kt b/android/src/main/java/com/evva/xesar/abrevva/reactnative/AbrevvaNfcModule.kt index 26e9d08..52641b5 100644 --- a/android/src/main/java/com/evva/xesar/abrevva/reactnative/AbrevvaNfcModule.kt +++ b/android/src/main/java/com/evva/xesar/abrevva/reactnative/AbrevvaNfcModule.kt @@ -160,4 +160,4 @@ class AbrevvaNfcModule(reactContext: ReactApplicationContext) : companion object { const val NAME = "AbrevvaNfc" } -} \ No newline at end of file +} diff --git a/android/src/main/java/com/evva/xesar/abrevva/reactnative/ExampleAppPackage.kt b/android/src/main/java/com/evva/xesar/abrevva/reactnative/ExampleAppPackage.kt index 7810076..8670457 100644 --- a/android/src/main/java/com/evva/xesar/abrevva/reactnative/ExampleAppPackage.kt +++ b/android/src/main/java/com/evva/xesar/abrevva/reactnative/ExampleAppPackage.kt @@ -11,8 +11,8 @@ class ExampleAppPackage : ReactPackage { AbrevvaBleModule(reactContext) ) } - + override fun createViewManagers(reactContext: ReactApplicationContext): List> { return emptyList() } -} \ No newline at end of file +} diff --git a/android/src/test/java/com/evva/xesar/abrevva/reactnative/AbrevvaBleModuleTest.kt b/android/src/test/java/com/evva/xesar/abrevva/reactnative/AbrevvaBleModuleTest.kt index 6690799..ae4232e 100644 --- a/android/src/test/java/com/evva/xesar/abrevva/reactnative/AbrevvaBleModuleTest.kt +++ b/android/src/test/java/com/evva/xesar/abrevva/reactnative/AbrevvaBleModuleTest.kt @@ -8,7 +8,6 @@ import com.evva.xesar.abrevva.ble.BleManager import com.facebook.react.bridge.Arguments import com.facebook.react.bridge.Promise import com.facebook.react.bridge.ReactApplicationContext -import com.facebook.react.bridge.ReadableMap import com.facebook.react.bridge.WritableArray import io.mockk.MockKAnnotations import io.mockk.every @@ -39,9 +38,6 @@ class AbrevvaBleModuleTest { @MockK(relaxed = true) private lateinit var promiseMock: Promise - @MockK(relaxed = true) - private lateinit var readableMapMock: ReadableMap - @MockK(relaxed = true) private lateinit var writeableArrayMock: WritableArray @@ -63,7 +59,6 @@ class AbrevvaBleModuleTest { unmockkAll() } - /* https://github.com/mockk/mockk/issues/586#issuecomment-1404973825 */ @SuppressLint("MissingPermission") @Test @@ -164,6 +159,7 @@ class AbrevvaBleModuleTest { val scanResult = WritableMapTestImplementation() val manufacturerData = WritableMapTestImplementation() val serviceDataMap = WritableMapTestImplementation() + every { result.data } returns null andThen data every { result.device } returns device every { result.device.hasName } returns true @@ -190,6 +186,5 @@ class AbrevvaBleModuleTest { ) ) assert(ref == scanResult) - } } \ No newline at end of file diff --git a/src/index.tsx b/src/index.tsx index d4fd2b7..73b5617 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -240,8 +240,13 @@ export class AbrevvaBleModule implements AbrevvaBLEInterface { }); } - async signalize(deviceId: string): Promise { - return NativeModuleBle.signalize({ deviceId: deviceId }); + async signalize(deviceId: string): Promise { + try { + NativeModuleBle.signalize({ deviceId: deviceId }); + } catch (err) { + return false; + } + return true; } async disengage( diff --git a/src/interfaces.tsx b/src/interfaces.tsx index 52d65f6..80552f5 100644 --- a/src/interfaces.tsx +++ b/src/interfaces.tsx @@ -111,7 +111,7 @@ export interface AbrevvaBLEInterface { value: string, timeout?: number, ): Promise; - signalize(deviceId: string): Promise; + signalize(deviceId: string): Promise; disengage( deviceId: string, mobileId: string,