diff --git a/build.gradle.kts b/build.gradle.kts index eddb498a..ba6728ce 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -2,15 +2,12 @@ buildscript { repositories { google() gradlePluginPortal() - mavenCentral() - maven("https://jitpack.io") } dependencies { - //noinspection GradlePluginVersion - classpath("com.android.tools.build:gradle:${properties["ANDROID_GRADLE_PLUGIN_VERSION"]}") - classpath("org.mozilla.rust-android-gradle:plugin:0.9.0") - classpath("com.vanniktech:gradle-maven-publish-plugin:0.17.0") - classpath("androidx.navigation:navigation-safe-args-gradle-plugin:_") + classpath(libs.gradle.plugin.android) + classpath(libs.gradle.plugin.rust) + classpath(libs.gradle.plugin.publish) + classpath(libs.gradle.plugin.navigation) } } diff --git a/demo-app/build.gradle.kts b/demo-app/build.gradle.kts index 5a889067..01425019 100644 --- a/demo-app/build.gradle.kts +++ b/demo-app/build.gradle.kts @@ -59,24 +59,18 @@ android { dependencies { // SDK implementation(projects.sdkLib) - //implementation('cash.z.ecc.android:zcash-android-sdk:1.3.0-beta17') // sample mnemonic plugin - implementation("com.github.zcash:zcash-android-wallet-plugins:1.0.1") - implementation("cash.z.ecc.android:kotlin-bip39:1.0.2") + implementation(libs.zcashwalletplgn) + implementation(libs.bip39) // Android - implementation("androidx.core:core-ktx:1.3.2") - implementation("androidx.constraintlayout:constraintlayout:2.0.4") - implementation("androidx.navigation:navigation-fragment-ktx:2.3.1") - implementation("androidx.navigation:navigation-ui-ktx:2.3.1") - implementation("com.google.android.material:material:1.3.0-alpha03") - testImplementation("junit:junit:4.13") - androidTestImplementation("androidx.test.ext:junit:1.1.2") - androidTestImplementation("androidx.test.espresso:espresso-core:3.3.0") + implementation(libs.androidx.core) + implementation(libs.androidx.constraintlayout) + implementation(libs.androidx.navigation.fragment) + implementation(libs.androidx.navigation.ui) + implementation(libs.material) + androidTestImplementation(libs.bundles.androidx.test) - implementation("io.grpc:grpc-android:${libs.versions.grpc.get()}") - implementation("io.grpc:grpc-okhttp:${libs.versions.grpc.get()}") - implementation("io.grpc:grpc-protobuf-lite:${libs.versions.grpc.get()}") - implementation("io.grpc:grpc-stub:${libs.versions.grpc.get()}") + implementation(libs.bundles.grpc) } diff --git a/gradle.properties b/gradle.properties index 0737dade..ada477a3 100644 --- a/gradle.properties +++ b/gradle.properties @@ -61,13 +61,42 @@ ANDROID_GRADLE_PLUGIN_VERSION=7.0.2 DETEKT_VERSION=1.18.1 DOKKA_VERSION=1.4.30 KTLINT_VERSION=0.42.1 +MAVEN_PUBLISH_GRADLE_PLUGIN=0.17.0 OWASP_DEPENDENCY_CHECK_VERSION=6.3.1 PROTOBUF_GRADLE_PLUGIN_VERSION=0.8.17 +RUST_GRADLE_PLUGIN_VERSION=0.9.0 +ANDROIDX_ANNOTATION_VERSION=1.2.0 +ANDROIDX_APPCOMPAT_VERSION=1.3.1 +ANDROIDX_CONSTRAINT_LAYOUT_VERSION=2.0.4 +ANDROIDX_CORE_VERSION=1.3.2 +ANDROIDX_ESPRESSO_VERSION=3.4.0 +ANDROIDX_LIFECYCLE_VERSION=2.3.1 +ANDROIDX_MULTIDEX_VERSION=2.0.1 +ANDROIDX_NAVIGATION_VERSION=2.3.5 +ANDROIDX_PAGING_VERSION=2.1.2 +ANDROIDX_ROOM_VERSION=2.3.0 +ANDROIDX_TEST_JUNIT_VERSION=1.1.3 +ANDROIDX_TEST_ORCHESTRATOR_VERSION=1.1.0-alpha1 +ANDROIDX_TEST_VERSION=1.3.0 +ANDROIDX_UI_AUTOMATOR_VERSION=2.2.0-alpha1 +BIP39_VERSION=1.0.2 +COROUTINES_OKHTTP=1.0 +GOOGLE_MATERIAL_VERSION=1.3.0-alpha03 GRPC_VERSION=1.38.1 +GSON_VERSION=2.8.6 +GUAVA_VERSION=30.0-android JACOCO_VERSION=0.8.7 +JAVAX_ANNOTATION_VERSION=1.3.2 +JUNIT_VERSION=5.7.2 +KOTLINX_COROUTINES_VERSION=1.5.1 KOTLIN_VERSION=1.5.10 +MOCKITO_KOTLIN_VERSION=2.2.0 +MOCKITO_VERSION=3.11.1 +OKHTTP_VERSION=3.8.0 +OKIO_VERSION=1.17.5 PROTOC_VERSION=3.14.0 +ZCASH_WALLET_PLUGINS_VERSION=1.0.1 # This shouldn't be changed, as Android doesn't support targets beyond Java 8 ANDROID_JVM_TARGET=1.8 \ No newline at end of file diff --git a/sdk-lib/build.gradle.kts b/sdk-lib/build.gradle.kts index 3dede081..bb1530ae 100644 --- a/sdk-lib/build.gradle.kts +++ b/sdk-lib/build.gradle.kts @@ -121,10 +121,10 @@ tasks.dokkaHtml.configure { protobuf { //generatedFilesBaseDir = "$projectDir/src/generated/source/grpc" - protoc { artifact = "com.google.protobuf:protoc:${libs.versions.protoc.get()}" } + protoc { artifact = libs.protoc.get().asCoordinateString() } plugins { id("grpc") { - artifact = "io.grpc:protoc-gen-grpc-java:${libs.versions.grpc.get()}" + artifact = libs.grpc.protoc.get().asCoordinateString() } } generateProtoTasks { @@ -157,28 +157,26 @@ cargo { } dependencies { - implementation(AndroidX.appCompat) + implementation(libs.androidx.annotation) + implementation(libs.androidx.appcompat) // Architecture Components: Lifecycle - implementation(AndroidX.lifecycle.runtimeKtx) - implementation(AndroidX.lifecycle.commonJava8) + implementation(libs.androidx.lifecycle.runtime) + implementation(libs.androidx.lifecycle.common) // Architecture Components: Room - implementation(AndroidX.room.ktx) - implementation(AndroidX.paging.runtimeKtx) - kapt(AndroidX.room.compiler) + implementation(libs.androidx.room.core) + implementation(libs.androidx.paging) + kapt(libs.androidx.room.compiler) // Kotlin - implementation(Kotlin.stdlib.jdk8) - implementation(KotlinX.coroutines.core) - implementation(KotlinX.coroutines.android) + implementation(libs.kotlin.stdlib) + implementation(libs.kotlinx.coroutines.core) + implementation(libs.kotlinx.coroutines.android) // grpc-java - implementation("io.grpc:grpc-okhttp:${libs.versions.grpc.get()}") - implementation("io.grpc:grpc-android:${libs.versions.grpc.get()}") - implementation("io.grpc:grpc-protobuf-lite:${libs.versions.grpc.get()}") - implementation("io.grpc:grpc-stub:${libs.versions.grpc.get()}") - compileOnly("javax.annotation:javax.annotation-api:_") + implementation(libs.bundles.grpc) + compileOnly(libs.javax.annotation) // @@ -187,45 +185,41 @@ dependencies { // solves error: Duplicate class com.google.common.util.concurrent.ListenableFuture found in modules jetified-guava-26.0-android.jar (com.google.guava:guava:26.0-android) and listenablefuture-1.0.jar (com.google.guava:listenablefuture:1.0) // per this recommendation from Chris Povirk, given guava's decision to split ListenableFuture away from Guava: https://groups.google.com/d/msg/guava-discuss/GghaKwusjcY/bCIAKfzOEwAJ - implementation("com.google.guava:guava:30.0-android") + implementation(libs.guava) // Transitive dependencies used because they're already necessary for other libraries // GSON is available as a transitive dependency from several places so we use it for processing // checkpoints but also document that by explicitly including here. If dependencies like Room // or grpc-okhttp stop including GSON, then we should switch to something else for parsing JSON. - implementation("com.google.code.gson:gson:2.8.6") + implementation(libs.gson) // OKIO is a transitive dependency used when writing param files to disk. Like GSON, this can be // replaced if needed. For compatibility, we match the library version used in grpc-okhttp: // https://github.com/grpc/grpc-java/blob/v1.37.x/build.gradle#L159 - implementation("com.squareup.okio:okio:1.17.5") + implementation(libs.okio) // Tests - testImplementation("androidx.multidex:multidex:_") - testImplementation("org.jetbrains.kotlin:kotlin-reflect:_") - testImplementation("org.mockito:mockito-junit-jupiter:_") - testImplementation("com.nhaarman.mockitokotlin2:mockito-kotlin:_") - testImplementation("org.junit.jupiter:junit-jupiter-api:_") - testImplementation("org.junit.jupiter:junit-jupiter-engine:_") - testImplementation("org.junit.jupiter:junit-jupiter-migrationsupport:_") - testImplementation("io.grpc:grpc-testing:${libs.versions.grpc.get()}") + testImplementation(libs.kotlin.reflect) + testImplementation(libs.mockito.junit) + testImplementation(libs.mockito.kotlin) + testImplementation(libs.bundles.junit) + testImplementation(libs.grpc.testing) // NOTE: androidTests will use JUnit4, while src/test/java tests will leverage Junit5 // Attempting to use JUnit5 via https://github.com/mannodermaus/android-junit5 was painful. The plugin configuration // was buggy, crashing in several places. It also would require a separate test flavor because it's minimum API 26 // because "JUnit 5 uses Java 8-specific APIs that didn't exist on Android before the Oreo release." - androidTestImplementation("com.nhaarman.mockitokotlin2:mockito-kotlin:_") - androidTestImplementation("org.mockito:mockito-android:_") - androidTestImplementation("androidx.test:runner:_") - androidTestImplementation("com.android.support:support-annotations:_") - androidTestImplementation("androidx.test:core:_") - androidTestImplementation("androidx.arch.core:core-testing:_") - androidTestImplementation("androidx.test.ext:junit:_") - androidTestImplementation("ru.gildor.coroutines:kotlin-coroutines-okhttp:_") + androidTestImplementation(libs.androidx.multidex) + androidTestImplementation(libs.mockito.kotlin) + androidTestImplementation(libs.mockito.android) + androidTestImplementation(libs.androidx.test.runner) + androidTestImplementation(libs.androidx.test.junit) + androidTestImplementation(libs.androidx.test.core) + androidTestImplementation(libs.coroutines.okhttp) // used by 'ru.gildor.corutines.okhttp.await' (to make simple suspended requests) and breaks on versions higher than 3.8.0 - androidTestImplementation("com.squareup.okhttp3:okhttp:3.8.0") + androidTestImplementation(libs.okhttp) // sample mnemonic plugin - androidTestImplementation("com.github.zcash:zcash-android-wallet-plugins:_") - androidTestImplementation("cash.z.ecc.android:kotlin-bip39:_") + androidTestImplementation(libs.zcashwalletplgn) + androidTestImplementation(libs.bip39) } tasks.getByName("preBuild").dependsOn(tasks.create("bugfixTask") { @@ -238,4 +232,6 @@ project.afterEvaluate { val cargoTask = tasks.getByName("cargoBuild") tasks.getByName("javaPreCompileDebug").dependsOn(cargoTask) tasks.getByName("javaPreCompileRelease").dependsOn(cargoTask) -} \ No newline at end of file +} + +fun MinimalExternalModuleDependency.asCoordinateString() = "${module.group}:${module.name}:${versionConstraint.displayName}" \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index 0360c5c2..dd6be8bc 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -14,16 +14,16 @@ pluginManagement { val owaspVersion = extra["OWASP_DEPENDENCY_CHECK_VERSION"].toString() val protobufVersion = extra["PROTOBUF_GRADLE_PLUGIN_VERSION"].toString() - id("com.google.protobuf") version(protobufVersion) apply(false) - id("org.jetbrains.dokka") version(dokkaVersion) apply(false) - id("org.jetbrains.kotlin.plugin.allopen") version(kotlinVersion) apply(false) - id("org.owasp.dependencycheck") version(owaspVersion) apply(false) + id("com.google.protobuf") version (protobufVersion) apply (false) + id("org.jetbrains.dokka") version (dokkaVersion) apply (false) + id("org.jetbrains.kotlin.plugin.allopen") version (kotlinVersion) apply (false) + id("org.owasp.dependencycheck") version (owaspVersion) apply (false) id("io.gitlab.arturbosch.detekt") version (detektVersion) apply (false) } } plugins { - id("de.fayard.refreshVersions") version("0.20.0") + id("de.fayard.refreshVersions") version ("0.20.0") } dependencyResolutionManagement { @@ -37,14 +37,136 @@ dependencyResolutionManagement { @Suppress("UnstableApiUsage", "MaxLineLength") versionCatalogs { create("libs") { + val androidGradlePluginVersion = extra["ANDROID_GRADLE_PLUGIN_VERSION"].toString() + val androidxAnnotationVersion = extra["ANDROIDX_ANNOTATION_VERSION"].toString() + val androidxAppcompatVersion = extra["ANDROIDX_APPCOMPAT_VERSION"].toString() + val androidxConstraintLayoutVersion = extra["ANDROIDX_CONSTRAINT_LAYOUT_VERSION"].toString() + val androidxCoreVersion = extra["ANDROIDX_CORE_VERSION"].toString() + val androidxEspressoVersion = extra["ANDROIDX_ESPRESSO_VERSION"].toString() + val androidxLifecycleVersion = extra["ANDROIDX_LIFECYCLE_VERSION"].toString() + val androidxMultidexVersion = extra["ANDROIDX_MULTIDEX_VERSION"].toString() + val androidxNavigationVersion = extra["ANDROIDX_NAVIGATION_VERSION"].toString() + val androidxPagingVersion = extra["ANDROIDX_PAGING_VERSION"].toString() + val androidxRoomVersion = extra["ANDROIDX_ROOM_VERSION"].toString() + val androidxTestJunitVersion = extra["ANDROIDX_TEST_JUNIT_VERSION"].toString() + val androidxTestOrchestratorVersion = extra["ANDROIDX_ESPRESSO_VERSION"].toString() + val androidxTestVersion = extra["ANDROIDX_TEST_VERSION"].toString() + val androidxUiAutomatorVersion = extra["ANDROIDX_UI_AUTOMATOR_VERSION"].toString() + val bip39Version = extra["BIP39_VERSION"].toString() + val coroutinesOkhttpVersion = extra["COROUTINES_OKHTTP"].toString() + val googleMaterialVersion = extra["GOOGLE_MATERIAL_VERSION"].toString() val grpcVersion = extra["GRPC_VERSION"].toString() + val gsonVersion = extra["GSON_VERSION"].toString() + val guavaVersion = extra["GUAVA_VERSION"].toString() val javaVersion = extra["ANDROID_JVM_TARGET"].toString() + val javaxAnnotationVersion = extra["JAVAX_ANNOTATION_VERSION"].toString() + val junitVersion = extra["JUNIT_VERSION"].toString() + val kotlinVersion = extra["KOTLIN_VERSION"].toString() + val kotlinxCoroutinesVersion = extra["KOTLINX_COROUTINES_VERSION"].toString() + val mavenPublishGradlePluginVersion = extra["MAVEN_PUBLISH_GRADLE_PLUGIN"].toString() + val mockitoKotlinVersion = extra["MOCKITO_KOTLIN_VERSION"].toString() + val mockitoVersion = extra["MOCKITO_VERSION"].toString() + val okhttpVersion = extra["OKHTTP_VERSION"].toString() + val okioVersion = extra["OKIO_VERSION"].toString() val protocVersion = extra["PROTOC_VERSION"].toString() + val rustGradlePluginVersion = extra["RUST_GRADLE_PLUGIN_VERSION"].toString() + val zcashWalletPluginVersion = extra["ZCASH_WALLET_PLUGINS_VERSION"].toString() // Standalone versions version("grpc", grpcVersion) version("java", javaVersion) version("protoc", protocVersion) + + // Aliases + // Gradle plugins + alias("gradle-plugin-android").to("com.android.tools.build:gradle:$androidGradlePluginVersion") + alias("gradle-plugin-navigation").to("androidx.navigation:navigation-safe-args-gradle-plugin:$androidxNavigationVersion") + alias("gradle-plugin-publish").to("com.vanniktech:gradle-maven-publish-plugin:$mavenPublishGradlePluginVersion") + alias("gradle-plugin-rust").to("org.mozilla.rust-android-gradle:plugin:$rustGradlePluginVersion") + + // Special cases used by the grpc gradle plugin + alias("grpc-protoc").to("io.grpc:protoc-gen-grpc-java:$grpcVersion") + alias("protoc").to("com.google.protobuf:protoc:$protocVersion") + + // Libraries + alias("androidx-annotation").to("androidx.annotation:annotation:$androidxAnnotationVersion") + alias("androidx-appcompat").to("androidx.appcompat:appcompat:$androidxAppcompatVersion") + alias("androidx-constraintlayout").to("androidx.constraintlayout:constraintlayout:$androidxConstraintLayoutVersion") + alias("androidx-core").to("androidx.core:core-ktx:$androidxCoreVersion") + alias("androidx-lifecycle-common").to("androidx.lifecycle:lifecycle-common-java8:$androidxLifecycleVersion") + alias("androidx-lifecycle-runtime").to("androidx.lifecycle:lifecycle-runtime-ktx:$androidxLifecycleVersion") + alias("androidx-multidex").to("androidx.multidex:multidex:$androidxMultidexVersion") + alias("androidx-navigation-fragment").to("androidx.navigation:navigation-fragment-ktx:$androidxNavigationVersion") + alias("androidx-navigation-ui").to("androidx.navigation:navigation-ui-ktx:$androidxNavigationVersion") + alias("androidx-paging").to("androidx.paging:paging-runtime-ktx:$androidxPagingVersion") + alias("androidx-room-compiler").to("androidx.room:room-compiler:$androidxRoomVersion") + alias("androidx-room-core").to("androidx.room:room-ktx:$androidxRoomVersion") + alias("bip39").to("cash.z.ecc.android:kotlin-bip39:$bip39Version") + alias("grpc-android").to("io.grpc:grpc-android:$grpcVersion") + alias("grpc-okhttp").to("io.grpc:grpc-okhttp:$grpcVersion") + alias("grpc-protobuf").to("io.grpc:grpc-protobuf-lite:$grpcVersion") + alias("grpc-stub").to("io.grpc:grpc-stub:$grpcVersion") + alias("gson").to("com.google.code.gson:gson:$gsonVersion") + alias("guava").to("com.google.guava:guava:$guavaVersion") + alias("javax-annotation").to("javax.annotation:javax.annotation-api:$javaxAnnotationVersion") + alias("kotlin-reflect").to("org.jetbrains.kotlin:kotlin-reflect:$kotlinVersion") + alias("kotlin-stdlib").to("org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlinVersion") + alias("kotlinx-coroutines-android").to("org.jetbrains.kotlinx:kotlinx-coroutines-android:$kotlinxCoroutinesVersion") + alias("kotlinx-coroutines-core").to("org.jetbrains.kotlinx:kotlinx-coroutines-core:$kotlinxCoroutinesVersion") + alias("material").to("com.google.android.material:material:$googleMaterialVersion") + alias("okhttp").to("com.squareup.okhttp3:okhttp:$okhttpVersion") + alias("okio").to("com.squareup.okio:okio:$okioVersion") + alias("zcashwalletplgn").to("com.github.zcash:zcash-android-wallet-plugins:$zcashWalletPluginVersion") + + // Test libraries + alias("androidx-espresso-contrib").to("androidx.test.espresso:espresso-contrib:$androidxEspressoVersion") + alias("androidx-espresso-core").to("androidx.test.espresso:espresso-core:$androidxEspressoVersion") + alias("androidx-espresso-intents").to("androidx.test.espresso:espresso-intents:$androidxEspressoVersion") + alias("androidx-test-core").to("androidx.test:core:$androidxTestVersion") + alias("androidx-test-junit").to("androidx.test.ext:junit:$androidxTestJunitVersion") + alias("androidx-test-runner").to("androidx.test:runner:$androidxTestVersion") + alias("androidx-testOrchestrator").to("androidx.test:orchestrator:$androidxTestOrchestratorVersion") + alias("androidx-uiAutomator").to("androidx.test.uiautomator:uiautomator-v18:$androidxUiAutomatorVersion") + alias("coroutines-okhttp").to("ru.gildor.coroutines:kotlin-coroutines-okhttp:$coroutinesOkhttpVersion") + alias("grpc-testing").to("io.grpc:grpc-testing:$grpcVersion") + alias("junit-api").to("org.junit.jupiter:junit-jupiter-api:$junitVersion") + alias("junit-engine").to("org.junit.jupiter:junit-jupiter-engine:$junitVersion") + alias("junit-migration").to("org.junit.jupiter:junit-jupiter-migrationsupport:$junitVersion") + alias("kotlinx-coroutines-test").to("org.jetbrains.kotlinx:kotlinx-coroutines-test:$kotlinxCoroutinesVersion") + alias("mockito-android").to("org.mockito:mockito-android:$mockitoVersion") + alias("mockito-junit").to("org.mockito:mockito-junit-jupiter:$mockitoVersion") + alias("mockito-kotlin").to("com.nhaarman.mockitokotlin2:mockito-kotlin:$mockitoKotlinVersion") + + // Bundles + bundle( + "androidx-test", + listOf( + "androidx-espresso-core", + "androidx-espresso-intents", + "androidx-espresso-contrib", + "androidx-test-junit", + "androidx-test-core" + ) + ) + + bundle( + "grpc", + listOf( + "grpc-okhttp", + "grpc-android", + "grpc-protobuf", + "grpc-stub" + ) + ) + + bundle( + "junit", + listOf( + "junit-api", + "junit-engine", + "junit-migration", + ) + ) } } }