From b917293bbc9611197063532c677c0951f4c8ca79 Mon Sep 17 00:00:00 2001 From: Steve Soltys Date: Fri, 13 Oct 2023 01:42:24 -0400 Subject: [PATCH] Switch to Kotlin build scripts + version catalog --- app/build.gradle | 243 ------------------------------ app/build.gradle.kts | 256 ++++++++++++++++++++++++++++++++ build.gradle | 33 ---- build.gradle.kts | 44 ++++++ build.libs.toml | 82 ++++++++++ build.plugins.toml | 5 + contactsbackup/build.gradle | 78 ---------- contactsbackup/build.gradle.kts | 77 ++++++++++ gradle/dependencies.gradle | 113 -------------- gradle/ktlint.gradle | 11 -- settings.gradle | 32 ---- settings.gradle.kts | 44 ++++++ storage/demo/build.gradle | 76 ---------- storage/demo/build.gradle.kts | 83 +++++++++++ storage/lib/build.gradle | 106 ------------- storage/lib/build.gradle.kts | 107 +++++++++++++ 16 files changed, 698 insertions(+), 692 deletions(-) delete mode 100644 app/build.gradle create mode 100644 app/build.gradle.kts delete mode 100644 build.gradle create mode 100644 build.gradle.kts create mode 100644 build.libs.toml create mode 100644 build.plugins.toml delete mode 100644 contactsbackup/build.gradle create mode 100644 contactsbackup/build.gradle.kts delete mode 100644 gradle/dependencies.gradle delete mode 100644 gradle/ktlint.gradle delete mode 100644 settings.gradle create mode 100644 settings.gradle.kts delete mode 100644 storage/demo/build.gradle create mode 100644 storage/demo/build.gradle.kts delete mode 100644 storage/lib/build.gradle create mode 100644 storage/lib/build.gradle.kts diff --git a/app/build.gradle b/app/build.gradle deleted file mode 100644 index fcb46e4e..00000000 --- a/app/build.gradle +++ /dev/null @@ -1,243 +0,0 @@ -plugins { - id 'com.android.application' - id 'org.jetbrains.kotlin.android' - id 'org.jlleitschuh.gradle.ktlint' -} - -def gitDescribe = { -> - def stdout = new ByteArrayOutputStream() - exec { - commandLine 'git', 'describe', '--always', '--tags', '--dirty=-dirty' - standardOutput = stdout - } - return stdout.toString().trim() -} - -android { - namespace 'com.stevesoltys.seedvault' - compileSdk rootProject.ext.compileSdk - - defaultConfig { - minSdk rootProject.ext.minSdk - targetSdk rootProject.ext.targetSdk - versionNameSuffix "-$gitDescribe" - testInstrumentationRunner "com.stevesoltys.seedvault.KoinInstrumentationTestRunner" - testInstrumentationRunnerArguments disableAnalytics: 'true' - - if (project.hasProperty('instrumented_test_size')) { - final testSize = project.getProperty('instrumented_test_size') - println("Instrumented test size: $testSize") - - testInstrumentationRunnerArguments size: testSize - } - } - - buildTypes { - release { - minifyEnabled false - } - } - - lint { - disable "DialogFragmentCallbacksDetector", - "InvalidFragmentVersionForActivityResult", - "CheckedExceptions" - abortOnError true - } - compileOptions { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 - } - kotlinOptions { - jvmTarget = JavaVersion.VERSION_17.toString() - languageVersion = "1.8" - } - packagingOptions { - exclude("META-INF/LICENSE.md") - exclude("META-INF/LICENSE-notice.md") - } - testOptions { - unitTests.all { - useJUnitPlatform() - testLogging { - events "passed", "skipped", "failed" - } - } - unitTests { - includeAndroidResources = true - } - } - - sourceSets { - test { - java.srcDirs += "$projectDir/src/sharedTest/java" - } - androidTest { - java.srcDirs += "$projectDir/src/sharedTest/java" - } - } - - signingConfigs { - aosp { - // Generated from the AOSP platform key: - // https://android.googlesource.com/platform/build/+/refs/tags/android-11.0.0_r29/target/product/security/platform.pk8 - keyAlias "platform" - keyPassword "platform" - storeFile file("development/platform.jks") - storePassword "platform" - } - } - - buildTypes.release.signingConfig = signingConfigs.aosp - buildTypes.debug.signingConfig = signingConfigs.aosp -} - -dependencies { - compileOnly rootProject.ext.aosp_libs - - /** - * Dependencies in AOSP - * - * We try to keep the dependencies in sync with what AOSP ships as Seedvault is meant to be built - * with the AOSP build system and gradle builds are just for more pleasant development. - * Using the AOSP versions in gradle builds allows us to spot issues early on. - */ - implementation rootProject.ext.kotlin_libs.std - // These coroutine libraries get upgraded otherwise to versions incompatible with kotlin version - implementation rootProject.ext.kotlin_libs.coroutines - - implementation rootProject.ext.std_libs.androidx_core - // A newer version gets pulled in with AOSP via core, so we include fragment here explicitly - implementation rootProject.ext.std_libs.androidx_fragment - implementation rootProject.ext.std_libs.androidx_activity - implementation rootProject.ext.std_libs.androidx_preference - implementation rootProject.ext.std_libs.androidx_lifecycle_viewmodel_ktx - implementation rootProject.ext.std_libs.androidx_lifecycle_livedata_ktx - implementation rootProject.ext.std_libs.androidx_constraintlayout - implementation rootProject.ext.std_libs.androidx_documentfile - implementation rootProject.ext.std_libs.com_google_android_material - - implementation rootProject.ext.storage_libs.com_google_crypto_tink_android - - /** - * Storage Dependencies - */ - implementation project(':storage:lib') - - /** - * External Dependencies - * - * If the dependencies below are updated, - * please make sure to update the prebuilt libraries and the Android.bp files - * in the top-level `libs` folder to reflect that. - * You can copy these libraries from ~/.gradle/caches/modules-2/files-2.1 - */ - // later versions than 2.1.1 require newer kotlin version -// implementation "io.insert-koin:koin-core-jvm:3.2.0" -// implementation "io.insert-koin:koin-android:3.2.0" - implementation fileTree(include: ['*.jar'], dir: "${rootProject.rootDir}/libs/koin-android") - implementation fileTree(include: ['*.aar'], dir: "${rootProject.rootDir}/libs/koin-android") - -// implementation "cash.z.ecc.android:kotlin-bip39:1.0.6" - implementation fileTree(include: ['kotlin-bip39-jvm-1.0.6.jar'], dir: "${rootProject.rootDir}/libs") - - /** - * Test Dependencies (do not concern the AOSP build) - */ - lintChecks rootProject.ext.lint_libs.exceptions - - // anything less than 'implementation' fails tests run with gradlew - testImplementation rootProject.ext.aosp_libs - testImplementation 'androidx.test.ext:junit:1.1.5' - testImplementation('org.robolectric:robolectric:4.10.3') - testImplementation 'org.hamcrest:hamcrest:2.2' - testImplementation "org.junit.jupiter:junit-jupiter-api:$junit5_version" - testImplementation "org.junit.jupiter:junit-jupiter-params:$junit5_version" - testImplementation "io.mockk:mockk:$mockk_version" - testImplementation 'org.bitcoinj:bitcoinj-core:0.16.2' - testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:$junit5_version" - testRuntimeOnly "org.junit.vintage:junit-vintage-engine:$junit5_version" - - androidTestImplementation rootProject.ext.aosp_libs - androidTestImplementation 'androidx.test:runner:1.4.0' - androidTestImplementation 'androidx.test:rules:1.4.0' - androidTestImplementation 'androidx.test.ext:junit:1.1.3' - androidTestImplementation "io.mockk:mockk-android:1.13.8" - androidTestImplementation 'androidx.test.uiautomator:uiautomator:2.2.0' -} - -apply from: "${rootProject.rootDir}/gradle/ktlint.gradle" - -gradle.projectsEvaluated { - tasks.withType(JavaCompile) { - options.compilerArgs.add('-Xbootclasspath/p:app/libs/android.jar:app/libs/libcore.jar') - } -} - -tasks.withType(Test).configureEach { - testLogging { - showExceptions true - showCauses true - showStackTraces true - - exceptionFormat = 'full' - } -} - -configurations { - all { - resolutionStrategy { - failOnNonReproducibleResolution() - } - } -} - -tasks.register('provisionEmulator', Exec) { - group("emulator") - - dependsOn(tasks.assembleRelease) - - doFirst { - commandLine "${project.projectDir}/development/scripts/provision_emulator.sh", - "seedvault", - "system-images;android-34;default;x86_64" - - environment "ANDROID_HOME", android.sdkDirectory.absolutePath - environment "JAVA_HOME", System.properties['java.home'] - } -} - -tasks.register('startEmulator', Exec) { - group("emulator") - - doFirst { - commandLine "${project.projectDir}/development/scripts/start_emulator.sh", "seedvault" - - environment "ANDROID_HOME", android.sdkDirectory.absolutePath - environment "JAVA_HOME", System.properties['java.home'] - } -} - -tasks.register('installEmulatorRelease', Exec) { - group("emulator") - - dependsOn(tasks.assembleRelease) - - doFirst { - commandLine "${project.projectDir}/development/scripts/install_app.sh" - - environment "ANDROID_HOME", android.sdkDirectory.absolutePath - environment "JAVA_HOME", System.properties['java.home'] - } -} - -tasks.register('clearEmulatorAppData', Exec) { - group("emulator") - - doFirst { - commandLine "${project.projectDir}/development/scripts/clear_app_data.sh" - - environment "ANDROID_HOME", android.sdkDirectory.absolutePath - environment "JAVA_HOME", System.properties['java.home'] - } -} diff --git a/app/build.gradle.kts b/app/build.gradle.kts new file mode 100644 index 00000000..cb2151cf --- /dev/null +++ b/app/build.gradle.kts @@ -0,0 +1,256 @@ +import org.gradle.api.tasks.testing.logging.TestExceptionFormat +import java.io.ByteArrayOutputStream + +plugins { + id("com.android.application") + kotlin("android") +} + +val gitDescribe = { + val stdout = ByteArrayOutputStream() + exec { + commandLine("git", "describe", "--always", "--tags", "--dirty=-dirty") + standardOutput = stdout + } + stdout.toString().trim() +} + +android { + namespace = "com.stevesoltys.seedvault" + compileSdk = libs.versions.compileSdk.get().toInt() + + defaultConfig { + minSdk = libs.versions.minSdk.get().toInt() + targetSdk = libs.versions.targetSdk.get().toInt() + versionNameSuffix = "-${gitDescribe()}" + testInstrumentationRunner = "com.stevesoltys.seedvault.KoinInstrumentationTestRunner" + testInstrumentationRunnerArguments(mapOf("disableAnalytics" to "true")) + + if (project.hasProperty("instrumented_test_size")) { + val testSize = project.property("instrumented_test_size").toString() + println("Instrumented test size: $testSize") + + testInstrumentationRunnerArguments(mapOf("size" to testSize)) + } + } + + signingConfigs { + create("aosp") { + // Generated from the AOSP platform key: + // https://android.googlesource.com/platform/build/+/refs/tags/android-11.0.0_r29/target/product/security/platform.pk8 + keyAlias = "platform" + keyPassword = "platform" + storeFile = file("development/platform.jks") + storePassword = "platform" + } + } + + buildTypes { + all { + isMinifyEnabled = false + } + + getByName("release").signingConfig = signingConfigs.getByName("aosp") + getByName("debug").signingConfig = signingConfigs.getByName("aosp") + } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_17.toString() + languageVersion = "1.8" + } + + packagingOptions { + exclude("META-INF/LICENSE.md") + exclude("META-INF/LICENSE-notice.md") + } + + testOptions.unitTests { + all { it.useJUnitPlatform() } + + isIncludeAndroidResources = true + } + + sourceSets { + named("test") { + java.srcDirs("$projectDir/src/sharedTest/java") + } + named("androidTest") { + java.srcDirs("$projectDir/src/sharedTest/java") + } + } + + lint { + abortOnError = true + + disable.clear() + disable += setOf( + "DialogFragmentCallbacksDetector", + "InvalidFragmentVersionForActivityResult", + "CheckedExceptions" + ) + } +} + +dependencies { + + val aospLibs = fileTree("$projectDir/libs") { + // For more information about this module: + // https://android.googlesource.com/platform/frameworks/base/+/refs/tags/android-11.0.0_r3/Android.bp#507 + // framework_intermediates/classes-header.jar works for gradle build as well, + // but not unit tests, so we use the actual classes (without updatable modules). + // + // out/target/common/obj/JAVA_LIBRARIES/framework-minus-apex_intermediates/classes.jar + include("android.jar") + // out/target/common/obj/JAVA_LIBRARIES/core-libart.com.android.art_intermediates/classes.jar + include("libcore.jar") + } + + compileOnly(aospLibs) + + /** + * Dependencies in AOSP + * + * We try to keep the dependencies in sync with what AOSP ships as Seedvault is meant to be built + * with the AOSP build system and gradle builds are just for more pleasant development. + * Using the AOSP versions in gradle builds allows us to spot issues early on. + */ + implementation(libs.bundles.kotlin) + // These coroutine libraries get upgraded otherwise to versions incompatible with kotlin version + implementation(libs.bundles.coroutines) + + implementation(libs.androidx.core) + // A newer version gets pulled in with AOSP via core, so we include fragment here explicitly + implementation(libs.androidx.fragment) + implementation(libs.androidx.activity) + implementation(libs.androidx.preference) + implementation(libs.androidx.lifecycle.viewmodel.ktx) + implementation(libs.androidx.lifecycle.livedata.ktx) + implementation(libs.androidx.constraintlayout) + implementation(libs.androidx.documentfile) + implementation(libs.google.material) + + implementation(libs.google.tink.android) + + /** + * Storage Dependencies + */ + implementation(project(":storage:lib")) + + /** + * External Dependencies + * + * If the dependencies below are updated, + * please make sure to update the prebuilt libraries and the Android.bp files + * in the top-level `libs` folder to reflect that. + * You can copy these libraries from ~/.gradle/caches/modules-2/files-2.1 + */ + // later versions than 2.1.1 require newer kotlin version + implementation(fileTree("${rootProject.rootDir}/libs/koin-android").include("*.jar")) + implementation(fileTree("${rootProject.rootDir}/libs/koin-android").include("*.aar")) + + implementation(fileTree("${rootProject.rootDir}/libs").include("kotlin-bip39-jvm-1.0.6.jar")) + + /** + * Test Dependencies (do not concern the AOSP build) + */ + lintChecks(libs.thirdegg.lint.rules) + + // anything less than 'implementation' fails tests run with gradlew + testImplementation(aospLibs) + testImplementation("androidx.test.ext:junit:1.1.5") + testImplementation("org.robolectric:robolectric:4.10.3") + testImplementation("org.hamcrest:hamcrest:2.2") + testImplementation("org.junit.jupiter:junit-jupiter-api:${libs.versions.junit5.get()}") + testImplementation("org.junit.jupiter:junit-jupiter-params:${libs.versions.junit5.get()}") + testImplementation("io.mockk:mockk:${libs.versions.mockk.get()}") + testImplementation("org.bitcoinj:bitcoinj-core:0.16.2") + testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:${libs.versions.junit5.get()}") + testRuntimeOnly("org.junit.vintage:junit-vintage-engine:${libs.versions.junit5.get()}") + + androidTestImplementation(aospLibs) + androidTestImplementation("androidx.test:runner:1.4.0") + androidTestImplementation("androidx.test:rules:1.4.0") + androidTestImplementation("androidx.test.ext:junit:1.1.3") + androidTestImplementation("io.mockk:mockk-android:1.13.8") + androidTestImplementation("androidx.test.uiautomator:uiautomator:2.2.0") +} + +gradle.projectsEvaluated { + tasks.withType(JavaCompile::class) { + options.compilerArgs.add("-Xbootclasspath/p:app/libs/android.jar:app/libs/libcore.jar") + } +} + +tasks.withType().configureEach { + testLogging { + events("passed", "skipped", "failed") + + showExceptions = true + showCauses = true + showStackTraces = true + exceptionFormat = TestExceptionFormat.FULL + } +} + +configurations.all { + resolutionStrategy { + failOnNonReproducibleResolution() + } +} + +tasks.register("provisionEmulator") { + group = "emulator" + + dependsOn(tasks.getByName("assembleRelease")) + + doFirst { + commandLine( + "${project.projectDir}/development/scripts/provision_emulator.sh", + "seedvault", + "system-images;android-34;default;x86_64" + ) + + environment("ANDROID_HOME", android.sdkDirectory.absolutePath) + environment("JAVA_HOME", System.getProperty("java.home")) + } +} + +tasks.register("startEmulator") { + group = "emulator" + + doFirst { + commandLine("${project.projectDir}/development/scripts/start_emulator.sh", "seedvault") + + environment("ANDROID_HOME", android.sdkDirectory.absolutePath) + environment("JAVA_HOME", System.getProperty("java.home")) + } +} + +tasks.register("installEmulatorRelease") { + group = "emulator" + + dependsOn(tasks.getByName("assembleRelease")) + + doFirst { + commandLine("${project.projectDir}/development/scripts/install_app.sh") + + environment("ANDROID_HOME", android.sdkDirectory.absolutePath) + environment("JAVA_HOME", System.getProperty("java.home")) + } +} + +tasks.register("clearEmulatorAppData") { + group = "emulator" + + doFirst { + commandLine("${project.projectDir}/development/scripts/clear_app_data.sh") + + environment("ANDROID_HOME", android.sdkDirectory.absolutePath) + environment("JAVA_HOME", System.getProperty("java.home")) + } +} diff --git a/build.gradle b/build.gradle deleted file mode 100644 index 13e210ec..00000000 --- a/build.gradle +++ /dev/null @@ -1,33 +0,0 @@ -buildscript { - // 1.3.61 Android 11 - // 1.4.30 Android 12 - // 1.6.10 Android 13 - // 1.7.20 Android 13 (QPR2) - // 1.8.10 Android 14 - // Check: - // https://android.googlesource.com/platform/external/kotlinc/+/refs/tags/android-14.0.0_r1/build.txt - ext.aosp_kotlin_version = '1.8.10' // 1.8.10-release-430 in AOSP - ext.kotlin_version = '1.8.10' -} - -plugins { - id 'com.android.application' version '8.1.2' apply false - id 'com.android.library' version '8.1.2' apply false - id 'com.google.protobuf' version '0.9.4' apply false - id 'org.jetbrains.kotlin.android' version "$kotlin_version" apply false - id 'org.jetbrains.kotlin.kapt' version "$kotlin_version" apply false - id 'org.jetbrains.dokka' version "$kotlin_version" apply false - id 'org.jlleitschuh.gradle.ktlint' version '11.5.0' apply false -} - -ext { - compileSdk = 34 - minSdk = 33 - targetSdk = 34 -} - -apply from: 'gradle/dependencies.gradle' - -task clean(type: Delete) { - delete rootProject.buildDir -} diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 00000000..bb491f53 --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,44 @@ +import org.jlleitschuh.gradle.ktlint.KtlintExtension + +buildscript { + repositories { + google() + jcenter() + } + + dependencies { + classpath("com.android.tools.build:gradle:${plugins.versions.androidGradle}") + classpath("com.google.protobuf:protobuf-gradle-plugin:${plugins.versions.protobuf}") + classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:${plugins.versions.kotlin}") + classpath("org.jetbrains.dokka:dokka-gradle-plugin:${plugins.versions.kotlin}") + classpath("org.jlleitschuh.gradle:ktlint-gradle:${plugins.versions.ktlint}") + } +} + +plugins { + id("com.android.application") version plugins.versions.androidGradle apply false + id("com.android.library") version plugins.versions.androidGradle apply false + id("com.google.protobuf") version plugins.versions.protobuf apply false + id("org.jetbrains.kotlin.android") version plugins.versions.kotlin apply false + id("org.jetbrains.kotlin.kapt") version plugins.versions.kotlin apply false + id("org.jetbrains.dokka") version plugins.versions.kotlin apply false + id("org.jlleitschuh.gradle.ktlint") version plugins.versions.ktlint apply false +} + +tasks.register("clean", Delete::class) { + delete(rootProject.buildDir) +} + +subprojects { + if (path == ":app" || path == ":storage:lib") { + apply(plugin = "org.jlleitschuh.gradle.ktlint") + + configure { + version.set("0.42.1") + android.set(true) + enableExperimentalRules.set(false) + verbose.set(true) + disabledRules.set(listOf("import-ordering", "no-blank-line-before-rbrace", "indent")) + } + } +} diff --git a/build.libs.toml b/build.libs.toml new file mode 100644 index 00000000..76069aaa --- /dev/null +++ b/build.libs.toml @@ -0,0 +1,82 @@ +[metadata] + +[versions] +# Android SDK versions +compileSdk = "34" +minSdk = "33" +targetSdk = "34" + +# Test versions +junit4 = "4.13.2" +junit5 = "5.10.0" # careful, upgrading this can change a Cipher's IV size in tests!? +mockk = "1.13.4" # newer versions require kotlin > 1.8.10 +espresso = "3.4.0" + +# Dependency versions below this are AOSP versions. +# We use "strictly" to enforce the version cannot be overriden by transitive dependencies. +# We need to enforce that the versions we use are the same as AOSP to ensure compatibility. + +# Kotlin versions +aosp-kotlin = { strictly = "1.8.10" } + +# Lint versions +lint-rules = { strictly = "0.1.0" } + +# Google versions +# https://android.googlesource.com/platform/external/protobuf/+/refs/tags/android-14.0.0_r1/java/pom.xml#7 +protobuf = { strictly = "3.21.7" } +# https://android.googlesource.com/platform/prebuilts/sdk/+/refs/tags/android-14.0.0_r1/current/extras/material-design-x/Android.bp#15 +material = { strictly = "1.7.0-alpha03" } +# careful with upgrading tink, so old backups continue to be decryptable +# https://github.com/google/tink/releases +tink = { strictly = "1.10.0" } + +# Coroutines versions +# https://android.googlesource.com/platform/external/kotlinx.coroutines/+/refs/tags/android-14.0.0_r1/CHANGES.md +coroutines = { strictly = "1.6.4" } + +# AndroidX versions +# https://android.googlesource.com/platform/prebuilts/sdk/+/refs/tags/android-14.0.0_r1/current/androidx/Android.bp +room = { strictly = "2.4.0-alpha05" } +androidx-core = { strictly = "1.9.0-alpha05" } +androidx-fragment = { strictly = "1.5.0-alpha03" } +androidx-activity = { strictly = "1.5.0-alpha03" } +androidx-preference = { strictly = "1.2.0-alpha01" } +androidx-lifecycle-viewmodel-ktx = { strictly = "2.5.0-alpha03" } +androidx-lifecycle-livedata-ktx = { strictly = "2.5.0-alpha03" } +androidx-constraintlayout = { strictly = "2.2.0-alpha05" } +androidx-documentfile = { strictly = "1.1.0-alpha01" } + +[libraries] +# Kotlin standard dependencies +kotlin-stdlib = { module = "org.jetbrains.kotlin:kotlin-stdlib", version.ref = "aosp-kotlin" } +kotlin-stdlib-jdk8 = { module = "org.jetbrains.kotlin:kotlin-stdlib-jdk8", version.ref = "aosp-kotlin" } +kotlin-stdlib-common = { module = "org.jetbrains.kotlin:kotlin-stdlib-common", version.ref = "aosp-kotlin" } + +# Lint dependencies +thirdegg-lint-rules = { module = "com.github.thirdegg:lint-rules", version.ref = "lint-rules" } + +# Google dependencies +google-tink-android = { module = "com.google.crypto.tink:tink-android", version.ref = "tink" } +google-protobuf-javalite = { module = 'com.google.protobuf:protobuf-javalite', version.ref = 'protobuf' } +google-material = { module = 'com.google.android.material:material', version.ref = 'material' } + +# Coroutines dependencies +kotlinx-coroutines-core-jvm = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm", version.ref = "coroutines" } +kotlinx-coroutines-android = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-android", version.ref = "coroutines" } + +# AndroidX dependencies +androidx-core = { module = "androidx.core:core", version.ref = "androidx-core" } +androidx-core-ktx = { module = "androidx.core:core-ktx", version.ref = "androidx-core" } +androidx-fragment = { module = "androidx.fragment:fragment-ktx", version.ref = "androidx-fragment" } +androidx-activity = { module = "androidx.activity:activity-ktx", version.ref = "androidx-activity" } +androidx-preference = { module = "androidx.preference:preference", version.ref = "androidx-preference" } +androidx-lifecycle-viewmodel-ktx = { module = "androidx.lifecycle:lifecycle-viewmodel-ktx", version.ref = "androidx-lifecycle-viewmodel-ktx" } +androidx-lifecycle-livedata-ktx = { module = "androidx.lifecycle:lifecycle-livedata-ktx", version.ref = "androidx-lifecycle-livedata-ktx" } +androidx-constraintlayout = { module = "androidx.constraintlayout:constraintlayout", version.ref = "androidx-constraintlayout" } +androidx-documentfile = { module = "androidx.documentfile:documentfile", version.ref = "androidx-documentfile" } +androidx-room-runtime = { module = "androidx.room:room-runtime", version.ref = "room" } + +[bundles] +kotlin = ["kotlin-stdlib", "kotlin-stdlib-jdk8", "kotlin-stdlib-common"] +coroutines = ["kotlinx-coroutines-core-jvm", "kotlinx-coroutines-android"] diff --git a/build.plugins.toml b/build.plugins.toml new file mode 100644 index 00000000..1e9acf93 --- /dev/null +++ b/build.plugins.toml @@ -0,0 +1,5 @@ +[versions] +kotlin = "1.8.10" +androidGradle = "8.1.2" +protobuf = "0.9.4" +ktlint = "11.5.0" diff --git a/contactsbackup/build.gradle b/contactsbackup/build.gradle deleted file mode 100644 index e68d2df8..00000000 --- a/contactsbackup/build.gradle +++ /dev/null @@ -1,78 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2020 The Calyx Institute - * SPDX-License-Identifier: Apache-2.0 - */ - -plugins { - id 'com.android.application' - id 'org.jetbrains.kotlin.android' -} - -android { - namespace 'org.calyxos.backup.contacts' - compileSdk rootProject.ext.compileSdk - - defaultConfig { - applicationId "org.calyxos.backup.contacts" - minSdk rootProject.ext.minSdk - targetSdk rootProject.ext.targetSdk - - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - testInstrumentationRunnerArguments disableAnalytics: 'true' - } - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_17.toString() - } - - packagingOptions { - exclude("META-INF/LICENSE.md") - exclude("META-INF/LICENSE-notice.md") - } - - testOptions { - unitTests.returnDefaultValues = true - } - - // optional signingConfigs - // On userdebug builds, you can use the testkey here to update the system app - def keystorePropertiesFile = project.file("keystore.properties") - if (keystorePropertiesFile.exists()) { - def keystoreProperties = new Properties() - keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) - - signingConfigs { - release { - keyAlias keystoreProperties['keyAlias'] - keyPassword keystoreProperties['keyPassword'] - storeFile file(keystoreProperties['storeFile']) - storePassword keystoreProperties['storePassword'] - } - } - buildTypes.release.signingConfig = signingConfigs.release - buildTypes.debug.signingConfig = signingConfigs.release - } -} - -def aospDeps = fileTree(include: [ - // out/target/common/obj/JAVA_LIBRARIES/com.android.vcard_intermediates/classes.jar - 'com.android.vcard.jar' -], dir: 'libs') - -dependencies { - implementation aospDeps - - testImplementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" - testImplementation "junit:junit:$junit4_version" - testImplementation "io.mockk:mockk:$mockk_version" - - androidTestImplementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" - androidTestImplementation 'androidx.test.ext:junit:1.1.5' - androidTestImplementation "androidx.test.espresso:espresso-core:$espresso_version" - androidTestImplementation "io.mockk:mockk-android:$mockk_version" -} diff --git a/contactsbackup/build.gradle.kts b/contactsbackup/build.gradle.kts new file mode 100644 index 00000000..36e7fcf1 --- /dev/null +++ b/contactsbackup/build.gradle.kts @@ -0,0 +1,77 @@ +/* + * SPDX-FileCopyrightText: 2020 The Calyx Institute + * SPDX-License-Identifier: Apache-2.0 + */ +import java.io.FileInputStream +import java.util.Properties + +plugins { + id("com.android.application") + id("org.jetbrains.kotlin.android") +} + +android { + namespace = "org.calyxos.backup.contacts" + compileSdk = libs.versions.compileSdk.get().toInt() + + defaultConfig { + applicationId = "org.calyxos.backup.contacts" + minSdk = libs.versions.minSdk.get().toInt() + targetSdk = libs.versions.targetSdk.get().toInt() + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + testInstrumentationRunnerArguments(mapOf("disableAnalytics" to "true")) + } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_17.toString() + } + + packagingOptions { + exclude("META-INF/LICENSE.md") + exclude("META-INF/LICENSE-notice.md") + } + + testOptions.unitTests { + isReturnDefaultValues = true + } + + // optional signingConfigs + // On userdebug builds, you can use the testkey here to update the system app + val keystorePropertiesFile = project.file("keystore.properties") + if (keystorePropertiesFile.exists()) { + val keystoreProperties = Properties() + keystoreProperties.load(FileInputStream(keystorePropertiesFile)) + + signingConfigs { + create("release") { + keyAlias = keystoreProperties["keyAlias"] as String + keyPassword = keystoreProperties["keyPassword"] as String + storeFile = file(keystoreProperties["storeFile"] as String) + storePassword = keystoreProperties["storePassword"] as String + } + } + buildTypes.getByName("release").signingConfig = signingConfigs.getByName("release") + buildTypes.getByName("debug").signingConfig = signingConfigs.getByName("release") + } +} + +val aospDeps = fileTree(mapOf("include" to listOf("com.android.vcard.jar"), "dir" to "libs")) + +dependencies { + implementation(aospDeps) + + testImplementation(libs.kotlin.stdlib.jdk8) + testImplementation("junit:junit:${libs.versions.junit4.get()}") + testImplementation("io.mockk:mockk:${libs.versions.mockk.get()}") + + androidTestImplementation(libs.kotlin.stdlib.jdk8) + androidTestImplementation("androidx.test.ext:junit:1.1.5") + androidTestImplementation("androidx.test.espresso:espresso-core:${libs.versions.espresso.get()}") + androidTestImplementation("io.mockk:mockk-android:${libs.versions.mockk.get()}") +} diff --git a/gradle/dependencies.gradle b/gradle/dependencies.gradle deleted file mode 100644 index cbfa11a0..00000000 --- a/gradle/dependencies.gradle +++ /dev/null @@ -1,113 +0,0 @@ -ext { - // https://android.googlesource.com/platform/prebuilts/sdk/+/refs/tags/android-13.0.0_r3/current/androidx/Android.bp#3901 - ext.room_version = "2.4.0-alpha05" // 2.5.0-alpha01 in AOSP but needs testing - // https://android.googlesource.com/platform/external/protobuf/+/refs/tags/android-14.0.0_r1/java/pom.xml#7 - ext.protobuf_version = "3.21.7" - - // test dependencies below - these do not care about AOSP and can be freely updated - junit4_version = "4.13.2" - junit5_version = "5.10.0" // careful, upgrading this can change a Cipher's IV size in tests!? - mockk_version = "1.13.4" // newer versions require kotlin > 1.8.10 - espresso_version = "3.4.0" -} - -// To produce these binaries, in latest AOSP source tree, run -// $ m -ext.aosp_libs = fileTree(include: [ - // For more information about this module: - // https://android.googlesource.com/platform/frameworks/base/+/refs/tags/android-11.0.0_r3/Android.bp#507 - // framework_intermediates/classes-header.jar works for gradle build as well, - // but not unit tests, so we use the actual classes (without updatable modules). - // - // out/target/common/obj/JAVA_LIBRARIES/framework-minus-apex_intermediates/classes.jar - 'android.jar', - // out/target/common/obj/JAVA_LIBRARIES/core-libart.com.android.art_intermediates/classes.jar - 'libcore.jar', -], dir: "${rootProject.projectDir}/app/libs") - -ext.kotlin_libs = [ - std: [ - dependencies.create('org.jetbrains.kotlin:kotlin-stdlib') { - version { strictly "$aosp_kotlin_version" } - }, - dependencies.create('org.jetbrains.kotlin:kotlin-stdlib-jdk8') { - version { strictly "$aosp_kotlin_version" } - }, - dependencies.create('org.jetbrains.kotlin:kotlin-stdlib-common') { - version { strictly "$aosp_kotlin_version" } - }, - ], - coroutines: [ - dependencies.create('org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm') { - // https://android.googlesource.com/platform/external/kotlinx.coroutines/+/refs/tags/android-14.0.0_r1/CHANGES.md - version { strictly '1.6.4' } - }, - dependencies.create('org.jetbrains.kotlinx:kotlinx-coroutines-android') { - // https://android.googlesource.com/platform/external/kotlinx.coroutines/+/refs/tags/android-14.0.0_r1/CHANGES.md - version { strictly '1.6.4' } - }, - ], -] - -ext.std_libs = [ - androidx_core: [ - // https://android.googlesource.com/platform/prebuilts/sdk/+/refs/tags/android-14.0.0_r1/current/androidx/Android.bp#2420 - dependencies.create('androidx.core:core') { - version { strictly '1.9.0-alpha05' } // 1.9.0-alpha03 in AOSP but has SDK version issues - }, - // https://android.googlesource.com/platform/prebuilts/sdk/+/refs/tags/android-14.0.0_r1/current/androidx/Android.bp#2386 - dependencies.create('androidx.core:core-ktx') { - version { strictly '1.9.0-alpha05' } // 1.9.0-alpha03 in AOSP but has SDK version issues - }, - ], - // https://android.googlesource.com/platform/prebuilts/sdk/+/refs/tags/android-14.0.0_r1/current/androidx/Android.bp#2849 - androidx_fragment: dependencies.create('androidx.fragment:fragment-ktx') { - version { strictly '1.5.0-alpha03' } - }, - // https://android.googlesource.com/platform/prebuilts/sdk/+/refs/tags/android-14.0.0_r1/current/androidx/Android.bp#61 - androidx_activity: dependencies.create('androidx.activity:activity-ktx') { - version { strictly '1.5.0-alpha03' } - }, - // https://android.googlesource.com/platform/prebuilts/sdk/+/refs/tags/android-14.0.0_r1/current/androidx/Android.bp#4420 - androidx_preference: dependencies.create('androidx.preference:preference') { - version { strictly '1.2.0-alpha01' } - }, - // https://android.googlesource.com/platform/prebuilts/sdk/+/refs/tags/android-13.0.0_r3/current/androidx/Android.bp#3521 - androidx_lifecycle_viewmodel_ktx: dependencies.create('androidx.lifecycle:lifecycle-viewmodel-ktx') { - version { strictly '2.5.0-alpha03' } - }, - // https://android.googlesource.com/platform/prebuilts/sdk/+/refs/tags/android-14.0.0_r1/current/androidx/Android.bp#3279 - androidx_lifecycle_livedata_ktx: dependencies.create('androidx.lifecycle:lifecycle-livedata-ktx') { - version { strictly '2.5.0-alpha03' } - }, - // https://android.googlesource.com/platform/prebuilts/sdk/+/refs/tags/android-14.0.0_r1/current/androidx/Android.bp#2244 - androidx_constraintlayout: dependencies.create('androidx.constraintlayout:constraintlayout') { - version { strictly '2.2.0-alpha05' } - }, - // https://android.googlesource.com/platform/prebuilts/sdk/+/refs/tags/android-14.0.0_r1/current/androidx/Android.bp#2556 - androidx_documentfile: dependencies.create('androidx.documentfile:documentfile') { - version { strictly '1.1.0-alpha01' } // 1.1.0-alpha02 in AOSP but not released yet - }, - // https://android.googlesource.com/platform/prebuilts/sdk/+/refs/tags/android-14.0.0_r1/current/extras/material-design-x/Android.bp#15 - com_google_android_material: dependencies.create('com.google.android.material:material') { - version { strictly '1.7.0-alpha03' } - }, -] - -ext.lint_libs = [ - exceptions: 'com.github.thirdegg:lint-rules:0.1.0' -] - -ext.storage_libs = [ - androidx_room_runtime: dependencies.create('androidx.room:room-runtime') { - version { strictly "$room_version" } - }, - com_google_protobuf_javalite: dependencies.create('com.google.protobuf:protobuf-javalite') { - version { strictly "$protobuf_version" } - }, - // https://github.com/google/tink/releases - com_google_crypto_tink_android: dependencies.create('com.google.crypto.tink:tink-android') { - // careful with upgrading tink, so old backups continue to be decryptable - version { strictly '1.10.0' } - }, -] diff --git a/gradle/ktlint.gradle b/gradle/ktlint.gradle deleted file mode 100644 index 10a7cb05..00000000 --- a/gradle/ktlint.gradle +++ /dev/null @@ -1,11 +0,0 @@ -ktlint { - version = "0.42.1" - android = true - enableExperimentalRules = false - verbose = true - disabledRules = [ - "import-ordering", - "no-blank-line-before-rbrace", - "indent", - ] -} diff --git a/settings.gradle b/settings.gradle deleted file mode 100644 index 8725f6c5..00000000 --- a/settings.gradle +++ /dev/null @@ -1,32 +0,0 @@ -pluginManagement { - buildscript { - repositories { - mavenCentral() - maven { url = uri("https://storage.googleapis.com/r8-releases/raw") } - } - dependencies { - // https://issuetracker.google.com/issues/227160052#comment37 - // This can be removed when we switch to Android Gradle plugin 8.2. - classpath("com.android.tools:r8:8.2.28") - } - } - - repositories { - gradlePluginPortal() - google() - mavenCentral() - } -} -dependencyResolutionManagement { - repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) - repositories { - google() - mavenCentral() - maven { url 'https://jitpack.io' } - } -} -rootProject.name = 'Seedvault' -include ':app' -include ':contactsbackup' -include ':storage:lib' -include ':storage:demo' diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 00000000..93105a8b --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,44 @@ +pluginManagement { + buildscript { + repositories { + mavenCentral() + maven { + // https://issuetracker.google.com/issues/227160052#comment37 + // This can be removed when we switch to Android Gradle plugin 8.2. + setUrl(uri("https://storage.googleapis.com/r8-releases/raw")) + } + } + dependencies { + classpath("com.android.tools:r8:8.2.28") + } + } + + repositories { + gradlePluginPortal() + google() + mavenCentral() + } +} + +dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) + repositories { + google() + mavenCentral() + maven("https://jitpack.io") + } + versionCatalogs { + create("libs") { + from(files("build.libs.toml")) + } + create("plugins") { + from(files("build.plugins.toml")) + } + } +} + +rootProject.name = "Seedvault" +include(":app") +include(":contactsbackup") +include(":storage:lib") +include(":storage:demo") diff --git a/storage/demo/build.gradle b/storage/demo/build.gradle deleted file mode 100644 index 130a49d6..00000000 --- a/storage/demo/build.gradle +++ /dev/null @@ -1,76 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021 The Calyx Institute - * SPDX-License-Identifier: Apache-2.0 - */ - -plugins { - id 'com.android.application' - id 'com.google.protobuf' - id 'org.jetbrains.kotlin.android' - id 'org.jetbrains.kotlin.kapt' -} - -android { - namespace 'de.grobox.storagebackuptester' - compileSdk rootProject.ext.compileSdk - - defaultConfig { - applicationId "de.grobox.storagebackuptester" - minSdk rootProject.ext.minSdk - targetSdk rootProject.ext.targetSdk - versionCode 20 - versionName "0.9.7" - - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - testInstrumentationRunnerArguments disableAnalytics: 'true' - } - - buildTypes { - release { - minifyEnabled true - proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - } - } - compileOptions { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 - } - kotlinOptions { - jvmTarget = JavaVersion.VERSION_17.toString() - freeCompilerArgs += "-opt-in=kotlin.RequiresOptIn" - } - lint { - disable "DialogFragmentCallbacksDetector", - "InvalidFragmentVersionForActivityResult" - } - packagingOptions { - jniLibs { - excludes += ['META-INF/services/kotlin*'] - } - resources { - excludes += [ - 'META-INF/*.kotlin_module', - 'META-INF/androidx.*.version', - 'META-INF/services/kotlin*', - 'kotlin/internal/internal.kotlin_builtins' - ] - } - } -} - -dependencies { - implementation project(':storage:lib') - - implementation rootProject.ext.kotlin_libs.std - - implementation rootProject.ext.std_libs.androidx_core - // A newer version gets pulled in with AOSP via core, so we include fragment here explicitly - implementation rootProject.ext.std_libs.androidx_fragment - implementation rootProject.ext.std_libs.androidx_activity - implementation rootProject.ext.std_libs.androidx_lifecycle_viewmodel_ktx - implementation rootProject.ext.std_libs.androidx_lifecycle_livedata_ktx - implementation rootProject.ext.std_libs.androidx_constraintlayout - implementation rootProject.ext.std_libs.com_google_android_material - - implementation rootProject.ext.storage_libs.com_google_protobuf_javalite -} diff --git a/storage/demo/build.gradle.kts b/storage/demo/build.gradle.kts new file mode 100644 index 00000000..20c91b53 --- /dev/null +++ b/storage/demo/build.gradle.kts @@ -0,0 +1,83 @@ +/* + * SPDX-FileCopyrightText: 2021 The Calyx Institute + * SPDX-License-Identifier: Apache-2.0 + */ + +plugins { + id("com.android.application") + id("com.google.protobuf") + id("org.jetbrains.kotlin.android") + id("org.jetbrains.kotlin.kapt") +} + +android { + namespace = "de.grobox.storagebackuptester" + compileSdk = libs.versions.compileSdk.get().toInt() + + defaultConfig { + applicationId = "de.grobox.storagebackuptester" + minSdk = libs.versions.minSdk.get().toInt() + targetSdk = libs.versions.targetSdk.get().toInt() + versionCode = 20 + versionName = "0.9.7" + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + testInstrumentationRunnerArguments.clear() + testInstrumentationRunnerArguments.putAll(mapOf("disableAnalytics" to "true")) + } + + buildTypes { + getByName("release") { + isMinifyEnabled = true + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + } + } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_17.toString() + freeCompilerArgs += listOf("-opt-in=kotlin.RequiresOptIn") + } + + lintOptions { + disable("DialogFragmentCallbacksDetector", "InvalidFragmentVersionForActivityResult") + } + + packagingOptions { + jniLibs { + excludes += listOf("META-INF/services/kotlin*") + } + resources { + excludes += listOf( + "META-INF/*.kotlin_module", + "META-INF/androidx.*.version", + "META-INF/services/kotlin*", + "kotlin/internal/internal.kotlin_builtins" + ) + } + } +} + +dependencies { + implementation(project(":storage:lib")) + + implementation(libs.bundles.kotlin) + + implementation(libs.androidx.core) + // A newer version gets pulled in with AOSP via core, so we include fragment here explicitly + implementation(libs.androidx.fragment) + implementation(libs.androidx.activity) + implementation(libs.androidx.lifecycle.viewmodel.ktx) + implementation(libs.androidx.lifecycle.livedata.ktx) + implementation(libs.androidx.constraintlayout) + implementation(libs.google.material) + + implementation(libs.google.protobuf.javalite) +} diff --git a/storage/lib/build.gradle b/storage/lib/build.gradle deleted file mode 100644 index c3bd1c98..00000000 --- a/storage/lib/build.gradle +++ /dev/null @@ -1,106 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021 The Calyx Institute - * SPDX-License-Identifier: Apache-2.0 - */ - -plugins { - id 'com.android.library' - id 'com.google.protobuf' - id 'org.jetbrains.kotlin.android' - id 'org.jetbrains.kotlin.kapt' - id 'org.jetbrains.dokka' - id 'org.jlleitschuh.gradle.ktlint' -} - -android { - namespace 'org.calyxos.backup.storage' - compileSdk rootProject.ext.compileSdk - - defaultConfig { - minSdk rootProject.ext.minSdk - targetSdk rootProject.ext.targetSdk - - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - testInstrumentationRunnerArguments disableAnalytics: 'true' - - consumerProguardFiles "consumer-rules.pro" - } - - buildTypes { - all { - minifyEnabled true - proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - } - } - compileOptions { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 - } - kotlinOptions { - jvmTarget = JavaVersion.VERSION_17.toString() - languageVersion = "1.8" - freeCompilerArgs += '-opt-in=kotlin.RequiresOptIn' - freeCompilerArgs += '-Xexplicit-api=strict' - } - protobuf { - protoc { - if ("aarch64" == System.getProperty("os.arch")) { - // mac m1 - artifact = "com.google.protobuf:protoc:$protobuf_version:osx-x86_64" - } else { - // other - artifact = "com.google.protobuf:protoc:$protobuf_version" - } - } - generateProtoTasks { - all().each { task -> - task.builtins { - java { - option "lite" - } - } - } - } - } - lint { - disable "DialogFragmentCallbacksDetector", - "InvalidFragmentVersionForActivityResult", - "CheckedExceptions" - } -} - -kotlin { - explicitApi = 'strict' -} - -dependencies { - implementation rootProject.ext.kotlin_libs.std - - implementation rootProject.ext.std_libs.androidx_core - // A newer version gets pulled in with AOSP via core, so we include fragment here explicitly - implementation rootProject.ext.std_libs.androidx_fragment - implementation rootProject.ext.std_libs.androidx_activity - implementation rootProject.ext.std_libs.androidx_lifecycle_viewmodel_ktx - implementation rootProject.ext.std_libs.androidx_lifecycle_livedata_ktx - implementation rootProject.ext.std_libs.androidx_constraintlayout - implementation rootProject.ext.std_libs.androidx_documentfile - implementation rootProject.ext.std_libs.com_google_android_material - - implementation rootProject.ext.storage_libs.androidx_room_runtime - implementation rootProject.ext.storage_libs.com_google_protobuf_javalite - implementation rootProject.ext.storage_libs.com_google_crypto_tink_android - kapt('androidx.room:room-compiler') { - version { strictly "$room_version" } - } - - lintChecks rootProject.ext.lint_libs.exceptions - - testImplementation "junit:junit:$junit4_version" - testImplementation "io.mockk:mockk:$mockk_version" - testImplementation "org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version" - - androidTestImplementation 'androidx.test.ext:junit:1.1.5' - androidTestImplementation "androidx.test.espresso:espresso-core:$espresso_version" -} - -apply from: "${rootProject.rootDir}/gradle/ktlint.gradle" diff --git a/storage/lib/build.gradle.kts b/storage/lib/build.gradle.kts new file mode 100644 index 00000000..657c5f21 --- /dev/null +++ b/storage/lib/build.gradle.kts @@ -0,0 +1,107 @@ +import com.google.protobuf.gradle.id + +/* + * SPDX-FileCopyrightText: 2021 The Calyx Institute + * SPDX-License-Identifier: Apache-2.0 + */ +plugins { + id("com.google.protobuf") + id("org.jetbrains.kotlin.kapt") + id("org.jetbrains.dokka") + id("com.android.library") + kotlin("android") +} + +android { + namespace = "org.calyxos.backup.storage" + compileSdk = libs.versions.compileSdk.get().toInt() + + defaultConfig { + minSdk = libs.versions.minSdk.get().toInt() + targetSdk = libs.versions.targetSdk.get().toInt() + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + testInstrumentationRunnerArguments(mapOf("disableAnalytics" to "true")) + } + + buildTypes { + all { + isMinifyEnabled = true + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + } + } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_17.toString() + languageVersion = "1.8" + freeCompilerArgs += listOf( + "-opt-in=kotlin.RequiresOptIn", + "-Xexplicit-api=strict" + ) + } + + protobuf { + protoc { + if ("aarch64" == System.getProperty("os.arch")) { + // mac m1 + artifact = "com.google.protobuf:protoc:${libs.versions.protobuf.get()}:osx-x86_64" + } else { + // other + artifact = "com.google.protobuf:protoc:${libs.versions.protobuf.get()}" + } + } + generateProtoTasks { + all().forEach { task -> + task.builtins { + id("java") { + option("lite") + } + } + } + } + } + + lint { + checkReleaseBuilds = false + abortOnError = false + + disable.clear() + disable += setOf( + "DialogFragmentCallbacksDetector", + "InvalidFragmentVersionForActivityResult", + "CheckedExceptions" + ) + } +} + +dependencies { + implementation(libs.bundles.kotlin) + implementation(libs.androidx.core) + implementation(libs.androidx.fragment) + implementation(libs.androidx.activity) + implementation(libs.androidx.lifecycle.viewmodel.ktx) + implementation(libs.androidx.lifecycle.livedata.ktx) + implementation(libs.androidx.constraintlayout) + implementation(libs.androidx.documentfile) + implementation(libs.google.material) + implementation(libs.androidx.room.runtime) + implementation(libs.google.protobuf.javalite) + implementation(libs.google.tink.android) + + kapt(group = "androidx.room", name = "room-compiler", version = libs.versions.room.get()) + lintChecks(libs.thirdegg.lint.rules) + testImplementation("junit:junit:${libs.versions.junit4.get()}") + testImplementation("io.mockk:mockk:${libs.versions.mockk.get()}") + testImplementation("org.jetbrains.kotlin:kotlin-test-junit:${libs.versions.aosp.kotlin.get()}") + androidTestImplementation("androidx.test.ext:junit:1.1.5") + androidTestImplementation( + "androidx.test.espresso:espresso-core:${libs.versions.espresso.get()}" + ) +}