diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 76d88814e..8e438223a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -58,6 +58,38 @@ jobs: - name: Setup NDK run: just install-ndk + - name: Install Rust toolchain + uses: dtolnay/rust-toolchain@stable + with: + targets: x86_64-linux-android,aarch64-linux-android,armv7-linux-androideabi + + - name: Cache cargo-ndk binary + uses: actions/cache@v4 + with: + path: ~/.cargo/bin/cargo-ndk + key: ${{ runner.os }}-cargo-ndk-4.1.2 + + - name: Install cargo-ndk + run: command -v cargo-ndk || cargo install cargo-ndk@4.1.2 --locked + + - name: Cache Cargo registry and git + uses: actions/cache@v4 + with: + path: | + ~/.cargo/registry + ~/.cargo/git + key: ${{ runner.os }}-cargo-deps-${{ hashFiles('core/Cargo.lock') }} + restore-keys: | + ${{ runner.os }}-cargo-deps- + + - name: Cache Cargo target + uses: actions/cache@v4 + with: + path: core/target + key: ${{ runner.os }}-cargo-target-${{ hashFiles('core/Cargo.lock') }} + restore-keys: | + ${{ runner.os }}-cargo-target- + - name: Cache AVD uses: actions/cache@v4 id: avd-cache diff --git a/core b/core index acea3c25e..dd4faec7f 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit acea3c25e9d458039a5fac790e7992624138179d +Subproject commit dd4faec7f8b6f3922215a410c2197e282917f453 diff --git a/gemcore/build.gradle.kts b/gemcore/build.gradle.kts index 8238f0fd4..9b33a0be4 100644 --- a/gemcore/build.gradle.kts +++ b/gemcore/build.gradle.kts @@ -53,8 +53,7 @@ android { } dependencies { - //noinspection UseTomlInstead - api(libs.gemstone) + api(project(":gemstone")) api(libs.kotlinx.serialization.json) implementation(libs.compose.runtime.android) diff --git a/gemstone/build.gradle.kts b/gemstone/build.gradle.kts new file mode 100644 index 000000000..a0aa66f06 --- /dev/null +++ b/gemstone/build.gradle.kts @@ -0,0 +1,98 @@ +import org.jetbrains.kotlin.gradle.dsl.JvmTarget + +plugins { + id("com.android.library") + id("org.jetbrains.kotlin.android") +} + +val gemstoneRoot = rootProject.projectDir.resolve("core/gemstone") +val gemstoneSrc = gemstoneRoot.resolve("android/gemstone/src") +val rustSrcDir = gemstoneRoot.resolve("src") +val cratesDir = rootProject.projectDir.resolve("core/crates") +val jniLibsDir = gemstoneSrc.resolve("main/jniLibs") +val generatedKotlinDir = gemstoneSrc.resolve("main/java") + +android { + namespace = "com.gemwallet.gemstone" + compileSdk = 36 + + defaultConfig { + minSdk = 28 + consumerProguardFiles(gemstoneRoot.resolve("android/gemstone/consumer-rules.pro")) + } + + buildTypes { + release { + isMinifyEnabled = false + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + } + } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + + sourceSets { + getByName("main") { + java.srcDirs(generatedKotlinDir) + jniLibs.srcDirs(jniLibsDir) + manifest.srcFile(gemstoneSrc.resolve("main/AndroidManifest.xml")) + } + getByName("androidTest") { + java.srcDirs(gemstoneSrc.resolve("androidTest/java")) + } + } +} + +kotlin { + compilerOptions { + jvmTarget.set(JvmTarget.JVM_17) + } +} + +val bindgenKotlin = tasks.register("bindgenKotlin") { + description = "Generate Kotlin bindings from gemstone via uniffi" + workingDir = gemstoneRoot + inputs.dir(rustSrcDir) + inputs.dir(cratesDir) + inputs.file(gemstoneRoot.resolve("Cargo.toml")) + outputs.dir(generatedKotlinDir.resolve("uniffi")) + commandLine("just", "bindgen-kotlin") +} + +val buildCargoNdk = tasks.register("buildCargoNdk") { + description = "Build gemstone native libraries using cargo-ndk" + workingDir = gemstoneRoot + inputs.dir(rustSrcDir) + inputs.dir(cratesDir) + inputs.file(gemstoneRoot.resolve("Cargo.toml")) + outputs.dir(jniLibsDir) + commandLine( + "cargo", "ndk", + "-t", "arm64-v8a", + "-t", "armeabi-v7a", + "-t", "x86_64", + "-o", jniLibsDir.absolutePath, + "build", "--lib" + ) +} + +tasks.configureEach { + if (name.matches(Regex("(compile|extract|source|javaDoc).*(Debug|Release).*"))) { + dependsOn(bindgenKotlin) + } + if (name.matches(Regex("merge.*(Debug|Release).*JniLib.*"))) { + dependsOn(buildCargoNdk) + } +} + +dependencies { + api("net.java.dev.jna:jna:5.18.1@aar") + implementation("androidx.core:core-ktx:1.17.0") + androidTestImplementation("androidx.test.ext:junit:1.3.0") + androidTestImplementation("androidx.test.espresso:espresso-core:3.7.0") +} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 51a32f03b..333494f79 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -51,7 +51,6 @@ mockkVersion = "1.14.9" espressoCore = "3.7.0" wallet-core = "4.3.22" -gemstone = "1.0.11" glance-widgets = "1.1.1" @@ -120,9 +119,6 @@ walletconnect-web3wallet = { module = "com.reown:walletkit" } # Wallet - core wallet-core = { module = "com.trustwallet:wallet-core", version.ref = "wallet-core" } -# Gem Stone -gemstone = { module = "com.gemwallet.gemstone:gemstone", version.ref = "gemstone" } - # qr code scanning zxing-core = { module = "com.google.zxing:core", version.ref = "zxing-core" } camera-view = { module = "androidx.camera:camera-view", version.ref = "camera2" } diff --git a/settings.gradle.kts b/settings.gradle.kts index c4c5afb80..23bc7f839 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -6,6 +6,7 @@ pluginManagement { } } rootProject.name = "wallet" +include(":gemstone") include (":app") include(":blockchain") include(":gemcore")