diff --git a/README.md b/README.md index b70a7b59..9c68b345 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ To add `Beacon Android SDK` into your project: #### Groovy ```groovy dependencies { - def beacon_version = "3.2.0" + def beacon_version = "x.y.z" // REQUIRED, core implementation "com.github.airgap-it.beacon-android-sdk:core:$beacon_version" @@ -76,7 +76,7 @@ To add `Beacon Android SDK` into your project: #### Kotlin ```kotlin dependencies { - val beaconVersion = "3.2.0" + val beaconVersion = "x.y.z" // REQUIRED, core implementation("com.github.airgap-it.beacon-android-sdk:core:$beaconVersion") @@ -368,6 +368,12 @@ $ ./gradlew testMock{Release|Debug}UnitTest --- ## Related Projects -[Beacon SDK](https://github.com/airgap-it/beacon-sdk) - an SDK for web developers (dApp & wallet) +### AirGap Projects -[Beacon iOS SDK](https://github.com/airgap-it/beacon-ios-sdk) - an SDK for iOS developers (wallet) +[Beacon SDK](https://github.com/airgap-it/beacon-sdk) - an SDK for web developers + +[Beacon iOS SDK](https://github.com/airgap-it/beacon-ios-sdk) - an SDK for iOS developers + +### Community Projects + +[Beacon Flutter SDK](https://github.com/TalaoDAO/beacon) - an SDK for Flutter developers diff --git a/blockchain-tezos/src/main/java/it/airgap/beaconsdk/blockchain/tezos/data/operation/MichelineMichelsonV1Expression.kt b/blockchain-tezos/src/main/java/it/airgap/beaconsdk/blockchain/tezos/data/operation/MichelineMichelsonV1Expression.kt index 3115467a..e61295a8 100644 --- a/blockchain-tezos/src/main/java/it/airgap/beaconsdk/blockchain/tezos/data/operation/MichelineMichelsonV1Expression.kt +++ b/blockchain-tezos/src/main/java/it/airgap/beaconsdk/blockchain/tezos/data/operation/MichelineMichelsonV1Expression.kt @@ -104,15 +104,15 @@ public data class MichelinePrimitiveBytes(public val bytes: String) : MichelineM override fun deserialize(decoder: Decoder): MichelinePrimitiveBytes = decoder.decodeStructure(descriptor) { - val primitive = decodeStringElement(descriptor, 0) + val primitive = HexString(decodeStringElement(descriptor, 0)) - return MichelinePrimitiveBytes(primitive) + return MichelinePrimitiveBytes(primitive.asString(withPrefix = false)) } override fun serialize(encoder: Encoder, value: MichelinePrimitiveBytes) { encoder.encodeStructure(descriptor) { with(value) { - encodeStringElement(descriptor, 0, HexString(bytes).asString(withPrefix = true)) + encodeStringElement(descriptor, 0, HexString(bytes).asString(withPrefix = false)) } } } diff --git a/buildSrc/src/main/java/GradleConfig.kt b/buildSrc/src/main/java/GradleConfig.kt index b5232896..4d8976a7 100644 --- a/buildSrc/src/main/java/GradleConfig.kt +++ b/buildSrc/src/main/java/GradleConfig.kt @@ -3,8 +3,8 @@ object Android { const val minSdk = 21 const val targetSdk = 32 - const val versionCode = 25 - const val versionName = "3.2.1" + const val versionCode = 27 + const val versionName = "3.2.2" } object Version { diff --git a/core/src/main/java/it/airgap/beaconsdk/core/internal/data/HexString.kt b/core/src/main/java/it/airgap/beaconsdk/core/internal/data/HexString.kt index eefdd38a..73645093 100644 --- a/core/src/main/java/it/airgap/beaconsdk/core/internal/data/HexString.kt +++ b/core/src/main/java/it/airgap/beaconsdk/core/internal/data/HexString.kt @@ -25,7 +25,7 @@ public value class HexString(private val value: String) { public fun toByteArray(): ByteArray = asString().chunked(2).map { it.toInt(16).toByte() }.toByteArray() public fun toInt(): Int = asString().toUInt(16).toInt() - public fun toBigInteger(): BigInteger = BigInteger(asString(), 16) + public fun toBigInteger(): BigInteger = BigInteger(asString().ifEmpty { "00" }, 16) public fun slice(indices: IntRange): HexString = HexString(value.slice(indices)) public fun slice(startIndex: Int): HexString = HexString(value.substring(startIndex)) diff --git a/core/src/main/java/it/airgap/beaconsdk/core/internal/utils/Bytes.kt b/core/src/main/java/it/airgap/beaconsdk/core/internal/utils/Bytes.kt index 82ab3bf8..da3c6001 100644 --- a/core/src/main/java/it/airgap/beaconsdk/core/internal/utils/Bytes.kt +++ b/core/src/main/java/it/airgap/beaconsdk/core/internal/utils/Bytes.kt @@ -4,7 +4,7 @@ import androidx.annotation.RestrictTo import it.airgap.beaconsdk.core.internal.data.HexString import java.math.BigInteger -private val hexRegex: Regex = Regex("^(${HexString.PREFIX})?([0-9a-fA-F]{2})+$") +private val hexRegex: Regex = Regex("^(${HexString.PREFIX})?([0-9a-fA-F]{2})*$") @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP) public fun String.isHex(): Boolean = this.matches(hexRegex) diff --git a/core/src/test/java/it/airgap/beaconsdk/core/internal/data/HexStringTest.kt b/core/src/test/java/it/airgap/beaconsdk/core/internal/data/HexStringTest.kt index 098a8e2e..a0423b40 100644 --- a/core/src/test/java/it/airgap/beaconsdk/core/internal/data/HexStringTest.kt +++ b/core/src/test/java/it/airgap/beaconsdk/core/internal/data/HexStringTest.kt @@ -9,18 +9,18 @@ import kotlin.test.assertFailsWith internal class HexStringTest { private val validHexStrings: List = listOf( + "", "9434dc98", "0x7b1ea2cb", "e40476d7", "c47320abdd31", "0x5786dac9eaf4", + "0x", ) private val invalidHexStrings: List = listOf( - "", "9434dc98az", "0xe40476d77t", - "0x", "0x1", ) @@ -122,7 +122,7 @@ internal class HexStringTest { @Test fun `creates BigInteger from HexString`() { val hexStringsWithExpected: List> = - validHexStrings.map { it to BigInteger(withoutHexPrefix(it), 16) } + validHexStrings.map { it to BigInteger(withoutHexPrefix(it).ifEmpty { "00" }, 16) } hexStringsWithExpected .map { it.first.asHexString().toBigInteger() to it.second } diff --git a/core/src/test/java/it/airgap/beaconsdk/core/internal/utils/BytesTest.kt b/core/src/test/java/it/airgap/beaconsdk/core/internal/utils/BytesTest.kt index c5bfcb49..6655b2a8 100644 --- a/core/src/test/java/it/airgap/beaconsdk/core/internal/utils/BytesTest.kt +++ b/core/src/test/java/it/airgap/beaconsdk/core/internal/utils/BytesTest.kt @@ -6,18 +6,18 @@ import java.math.BigInteger internal class BytesTest { private val validHexStrings: List = listOf( + "", "9434dc98", "0x7b1ea2cb", "e40476d7", "c47320abdd31", "0x5786dac9eaf4", + "0x", ) private val invalidHexStrings: List = listOf( - "", "9434dc98az", "0xe40476d77t", - "0x", "0x1", ) diff --git a/demo/src/main/java/it/airgap/beaconsdkdemo/dapp/DAppFragment.kt b/demo/src/main/java/it/airgap/beaconsdkdemo/dapp/DAppFragment.kt index c30e3b1f..2d68b554 100644 --- a/demo/src/main/java/it/airgap/beaconsdkdemo/dapp/DAppFragment.kt +++ b/demo/src/main/java/it/airgap/beaconsdkdemo/dapp/DAppFragment.kt @@ -12,7 +12,6 @@ import it.airgap.beaconsdk.core.message.BeaconResponse import it.airgap.beaconsdkdemo.R import it.airgap.beaconsdkdemo.utils.toJson import kotlinx.android.synthetic.main.fragment_dapp.* -import kotlinx.coroutines.flow.collect import kotlinx.coroutines.launch import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json diff --git a/demo/src/main/java/it/airgap/beaconsdkdemo/dapp/DAppFragmentViewModel.kt b/demo/src/main/java/it/airgap/beaconsdkdemo/dapp/DAppFragmentViewModel.kt index ac9295a2..4ba7df81 100644 --- a/demo/src/main/java/it/airgap/beaconsdkdemo/dapp/DAppFragmentViewModel.kt +++ b/demo/src/main/java/it/airgap/beaconsdkdemo/dapp/DAppFragmentViewModel.kt @@ -44,10 +44,14 @@ class DAppFragmentViewModel : ViewModel() { viewModelScope.launch { val beaconClient = beaconClient ?: return@launch - val pairingRequest = beaconClient.pair() - val serializerPairingRequest = beaconClient.serializePairingData(pairingRequest) - - _state.emit { copy(pairingRequest = serializerPairingRequest) } + try { + val pairingRequest = beaconClient.pair() + val serializerPairingRequest = beaconClient.serializePairingData(pairingRequest) + + _state.emit { copy(pairingRequest = serializerPairingRequest) } + } catch (e: Throwable) { + onError(e) + } } } diff --git a/demo/src/main/java/it/airgap/beaconsdkdemo/wallet/WalletFragmentViewModel.kt b/demo/src/main/java/it/airgap/beaconsdkdemo/wallet/WalletFragmentViewModel.kt index 9adb6d09..cbbe0255 100644 --- a/demo/src/main/java/it/airgap/beaconsdkdemo/wallet/WalletFragmentViewModel.kt +++ b/demo/src/main/java/it/airgap/beaconsdkdemo/wallet/WalletFragmentViewModel.kt @@ -76,8 +76,13 @@ class WalletFragmentViewModel : ViewModel() { /* Others */ else -> ErrorBeaconResponse.from(request, BeaconError.Unknown) } - beaconClient.respond(response) - removeAwaitingRequest() + + try { + beaconClient.respond(response) + removeAwaitingRequest() + } catch (e: Throwable) { + onError(e) + } } }