Skip to content

Commit

Permalink
Merge pull request #322 from angelix/ave-kotlin-multiplatform
Browse files Browse the repository at this point in the history
Create new Bindings for Kotlin Multiplatform
  • Loading branch information
roeierez authored Jul 27, 2023
2 parents a6aac5c + 7a9fe22 commit 33beb2f
Show file tree
Hide file tree
Showing 19 changed files with 691 additions and 4 deletions.
1 change: 1 addition & 0 deletions libs/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,6 @@ target
ffigen/*
sdk-flutter/.dart_tool
sdk-bindings/ffi
sdk-bindings/kmm
sdk-bindings/tests/bindings/golang/breez_sdk/
sdk-bindings/tests/bindings/golang/*.sql
37 changes: 37 additions & 0 deletions libs/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions libs/sdk-bindings/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ tokio = { version = "1", features = ["full"] }
uniffi = { version = "0.23.0", features = ["bindgen-tests", "cli"] }
uniffi_bindgen = "0.23.0"
uniffi_macros = "0.23.0"
uniffi-kotlin-multiplatform = { git = "https://gitlab.com/trixnity/uniffi-kotlin-multiplatform-bindings", rev = "f33adbf1e97b3554eb815d5873308e0efc199f63" }
camino = "1.1.1"
lightning-invoice = "*"
log = "*"
once_cell = "*"
Expand All @@ -34,4 +36,5 @@ tonic = { version = "^0.8", features = [

[build-dependencies]
uniffi_build = { version = "0.23.0" }
uniffi_bindgen = "0.23.0"
anyhow = { version = "1.0.57", features = ["backtrace"] }
15 changes: 13 additions & 2 deletions libs/sdk-bindings/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,23 +43,34 @@ See [Adding package dependencies to your app](https://developer.apple.com/docume
make bindings-swift
```

### Kotlin
### Kotlin + Multiplatform

For most users, we recommend integrating the Breez SDK as Gradle dependency from [our Maven repository](https://mvn.breez.technology/releases).

To do so, add the following to your Gradle dependencies:

Set **Breez** maven repository
``` groovy
repositories {
maven {
url("https://mvn.breez.technology/releases")
}
}
```
**Android dependency**
``` groovy
dependencies {
implementation("breez_sdk:bindings-android:<version>")
}
```
**Kotlin Multiplatform dependency**
``` kotlin
val commonMain by getting {
dependencies {
implementation("technology.breez:breez-sdk-kmp:<version>")
}
}
```

You can then import and use the Breez SDK in your app:

Expand Down
54 changes: 54 additions & 0 deletions libs/sdk-bindings/bindings-kotlin-multiplatform/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
# Created by https://www.toptal.com/developers/gitignore/api/android
# Edit at https://www.toptal.com/developers/gitignore?templates=android

### Android ###
# Gradle files
.gradle/
build/

# Local configuration file (sdk path, etc)
local.properties

# Log/OS Files
*.log

# Android Studio generated files and folders
captures/
.externalNativeBuild/
.cxx/
*.apk
output.json

# IntelliJ
*.iml
.idea/
misc.xml
deploymentTargetDropDown.xml
render.experimental.xml

# Keystore files
*.jks
*.keystore

# Google Services (e.g. APIs or Firebase)
google-services.json

# Android Profiling
*.hprof

### Android Patch ###
gen-external-apklibs

# Replacement of .externalNativeBuild directories introduced
# with Android Studio 3.5.

# End of https://www.toptal.com/developers/gitignore/api/android

breez-sdk-kmp/src/androiddMain/jniLibs/
breez-sdk-kmp/src/jvmMain/jniLibs/

breez-sdk-kmp/src/commonMain/kotlin/breez_sdk
breez-sdk-kmp/src/jvmMain/kotlin/breez_sdk
breez-sdk-kmp/src/androidMain/kotlin/breez_sdk
breez-sdk-kmp/src/nativeMain/kotlin/breez_sdk
breez-sdk-kmp/src/nativeInterop/cinterop/headers/breez_sdk
Original file line number Diff line number Diff line change
@@ -0,0 +1,143 @@
import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi

plugins {
kotlin("multiplatform")
id("com.android.library")
id("maven-publish")
}

apply(plugin = "kotlinx-atomicfu")

@OptIn(ExperimentalKotlinGradlePluginApi::class)
kotlin {
// Enable the default target hierarchy
targetHierarchy.default()

androidTarget {
compilations.all {
kotlinOptions {
jvmTarget = JavaVersion.VERSION_17.majorVersion
}
}

publishLibraryVariants("release")
}

jvm {
compilations.all {
kotlinOptions.jvmTarget = JavaVersion.VERSION_17.majorVersion
}
}

listOf(
iosX64(),
iosArm64(),
iosSimulatorArm64()
).forEach {
val platform = when (it.targetName) {
"iosSimulatorArm64" -> "ios_simulator_arm64"
"iosArm64" -> "ios_arm64"
"iosX64" -> "ios_x64"
else -> error("Unsupported target $name")
}

it.compilations["main"].cinterops {
create("breezCInterop") {
defFile(project.file("src/nativeInterop/cinterop/breez.def"))
includeDirs(project.file("src/nativeInterop/cinterop/headers/breez_sdk"), project.file("src/libs/$platform"))
}
}
}

sourceSets {
all {
languageSettings.apply {
optIn("kotlinx.cinterop.ExperimentalForeignApi")
}
}

val commonMain by getting {
dependencies {
implementation("com.squareup.okio:okio:3.3.0")
implementation("org.jetbrains.kotlinx:kotlinx-datetime:0.4.0")
}
}

val commonTest by getting {
dependencies {
implementation(kotlin("test"))
}
}

val jvmMain by getting {
dependsOn(commonMain)
dependencies {
implementation("net.java.dev.jna:jna:5.13.0")
}
}

val androidMain by getting {
dependsOn(commonMain)
dependencies {
implementation("net.java.dev.jna:jna:5.13.0@aar")
implementation("org.jetbrains.kotlinx:atomicfu:0.21.0")
}
}
}
}

android {
namespace = "technology.breez"
compileSdk = 33

defaultConfig {
minSdk = 21
consumerProguardFiles("consumer-rules.pro")
}

compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
}

val libraryVersion: String by project

group = "technology.breez"
version = libraryVersion

publishing {
repositories {
maven {
name = "breezReposilite"
url = uri("https://mvn.breez.technology/releases")
credentials(PasswordCredentials::class)
authentication {
create<BasicAuthentication>("basic")
}
}
}

publications {
this.forEach {
(it as MavenPublication).apply {
pom {
name.set("breez-sdk-kmp")
description.set("The Breez SDK enables mobile developers to integrate Lightning and bitcoin payments into their apps with a very shallow learning curve.")
url.set("https://breez.technology")
licenses {
license {
name.set("MIT")
url.set("https://github.com/breez/breez-sdk/blob/main/LICENSE")
}
}
scm {
connection.set("scm:git:github.com/breez/breez-sdk.git")
developerConnection.set("scm:git:ssh://github.com/breez/breez-sdk.git")
url.set("https://github.com/breez/breez-sdk")
}
}
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html

# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}

# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable

# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile

# for JNA
-dontwarn java.awt.*
-keep class com.sun.jna.* { *; }
-keepclassmembers class * extends com.sun.jna.* { public *; }
-keep class technology.breez.* { *; }
-keep class breez_sdk.** { *; }
-keepclassmembers class * extends technology.breez.* { public *; }
-keepclassmembers class * extends breez_sdk.** { public *; }
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package com.blockstream.gdk


import breez_sdk.EnvironmentType
import breez_sdk.GreenlightNodeConfig
import breez_sdk.Network
import breez_sdk.NodeConfig
import breez_sdk.defaultConfig
import breez_sdk.mnemonicToSeed
import kotlin.test.Test
import kotlin.test.assertEquals

class Tests {

@Test
fun testDefaultConfig() {
val config = defaultConfig(
envType = EnvironmentType.PRODUCTION,
apiKey = "",
nodeConfig = NodeConfig.Greenlight(GreenlightNodeConfig(null, ""))
)

assertEquals(config.network, Network.BITCOIN)

}

@Test
fun testMnemonicToSeed() {
val seed = mnemonicToSeed("abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about")
assertEquals(64, seed.size)
}
}
Loading

0 comments on commit 33beb2f

Please sign in to comment.