diff --git a/Android/build.gradle.kts b/Android/build.gradle.kts index cf4ec2c6..29be38f8 100644 --- a/Android/build.gradle.kts +++ b/Android/build.gradle.kts @@ -8,15 +8,21 @@ plugins { alias(libs.plugins.kotlinter) } -val keystore = Properties() - .also { it.load(FileInputStream(project.file("keystore.properties"))) } +val keystoreFile = project.file("keystore.properties") +val keystore = Properties().apply { + if (keystoreFile.exists()) { + FileInputStream(keystoreFile).use(::load) + } +} +val hasReleaseSigning = listOf("storeFile", "storePassword", "keyAlias", "keyPassword") + .all { keystore[it] != null } android { - compileSdk = 35 + compileSdk = 36 defaultConfig { applicationId = "com.conradkramer.wallet.android" minSdk = 28 - targetSdk = 35 + targetSdk = 36 versionCode = 1 versionName = "0.1" } @@ -32,7 +38,11 @@ android { getByName("release") { isMinifyEnabled = true isShrinkResources = true - signingConfig = signingConfigs.getByName("release") + signingConfig = if (hasReleaseSigning) { + signingConfigs.getByName("release") + } else { + signingConfigs.getByName("debug") + } proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" diff --git a/Shared/build.gradle.kts b/Shared/build.gradle.kts index 92b987d1..12dc82fe 100644 --- a/Shared/build.gradle.kts +++ b/Shared/build.gradle.kts @@ -1,7 +1,6 @@ import app.cash.sqldelight.core.capitalize import com.android.build.gradle.internal.scope.ProjectInfo.Companion.getBaseName import org.jetbrains.kotlin.gradle.dsl.JvmTarget -import org.jetbrains.kotlin.gradle.plugin.mpp.BitcodeEmbeddingMode import org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask import org.jmailen.gradle.kotlinter.tasks.FormatTask import org.jmailen.gradle.kotlinter.tasks.LintTask @@ -30,6 +29,7 @@ kotlin { languageSettings.apply { optIn("kotlin.experimental.ExperimentalObjCName") optIn("kotlin.experimental.ExperimentalForeignApi") + optIn("kotlin.time.ExperimentalTime") } } @@ -135,7 +135,7 @@ kotlin { } android { - compileSdk = 35 + compileSdk = 36 sourceSets["main"].manifest.srcFile("src/androidMain/AndroidManifest.xml") defaultConfig { minSdk = 28 @@ -162,8 +162,14 @@ dependencies { .forEach { add(it, libs.koin.ksp) } } -project.tasks.withType(KotlinCompilationTask::class.java).configureEach { - if(name != "kspCommonMainKotlinMetadata") { +tasks.withType>().configureEach { + if (name != "kspCommonMainKotlinMetadata") { + dependsOn("kspCommonMainKotlinMetadata") + } +} + +tasks.configureEach { + if (name.startsWith("ksp") && name != "kspCommonMainKotlinMetadata") { dependsOn("kspCommonMainKotlinMetadata") } } diff --git a/Shared/src/commonMain/kotlin/com/conradkramer/wallet/indexing/CoinbaseIndexer.kt b/Shared/src/commonMain/kotlin/com/conradkramer/wallet/indexing/CoinbaseIndexer.kt index e752bb55..6dd88000 100644 --- a/Shared/src/commonMain/kotlin/com/conradkramer/wallet/indexing/CoinbaseIndexer.kt +++ b/Shared/src/commonMain/kotlin/com/conradkramer/wallet/indexing/CoinbaseIndexer.kt @@ -8,8 +8,10 @@ import com.conradkramer.wallet.sql.Database import io.github.oshai.kotlinlogging.KLogger import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch -import kotlinx.datetime.Clock +import kotlin.time.Clock +import kotlin.time.ExperimentalTime +@OptIn(ExperimentalTime::class) internal class CoinbaseIndexer( private val scope: CoroutineScope, private val currencyCode: Currency.Code, diff --git a/docs/GETTING_STARTED.md b/docs/GETTING_STARTED.md index feb4d9c7..c11e2174 100644 --- a/docs/GETTING_STARTED.md +++ b/docs/GETTING_STARTED.md @@ -46,3 +46,25 @@ Open the Xcode project (`Apple/Wallet.xcodeproj`) and build and run the app usin In order to build for Android, you will need to download [Android Studio](https://developer.android.com/studio). Open the repository in Android Studio and build and run the app using the `Android` configuration. + +If you are building from the command line (for example to run `./gradlew test` or `./gradlew :Android:assembleRelease`), install +the Android command-line tools and point the build at them via `ANDROID_SDK_ROOT`: + +```bash +mkdir -p "$HOME/android-sdk" +cd "$HOME/android-sdk" +curl -L -o commandlinetools-linux.zip \ + https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip +unzip commandlinetools-linux.zip -d cmdline-tools-temp +mkdir -p cmdline-tools/latest +mv cmdline-tools-temp/cmdline-tools/* cmdline-tools/latest/ +rm -rf cmdline-tools-temp commandlinetools-linux.zip + +export ANDROID_SDK_ROOT="$HOME/android-sdk" +yes | "$ANDROID_SDK_ROOT"/cmdline-tools/latest/bin/sdkmanager --licenses +"$ANDROID_SDK_ROOT"/cmdline-tools/latest/bin/sdkmanager \ + "platform-tools" "platforms;android-36" "build-tools;35.0.0" +``` + +With the SDK installed, set `ANDROID_SDK_ROOT` in your shell before invoking Gradle so that the Android plugins can locate the +platform and build tools. diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index c3df42da..a33c136b 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,29 +1,29 @@ [versions] -android = "8.8.0" -androidx-appcompat = "1.7.0" +android = "8.13.0" +androidx-appcompat = "1.7.1" androidx-biometric = "1.4.0-alpha02" -androidx-activity = "1.10.0" -androidx-navigation = "2.8.6" -bouncycastle = "1.80" -compose-foundation = "1.7.7" -compose-material3 = "1.3.1" -compose-ui = "1.7.7" -material = "1.12.0" -dbtools-room = "7.0.1" +androidx-activity = "1.11.0" +androidx-navigation = "2.9.5" +bouncycastle = "1.82" +compose-foundation = "1.7.8" +compose-material3 = "1.4.0" +compose-ui = "1.7.8" +material = "1.13.0" +dbtools-room = "8.3.0" java = "21" -koin = "4.0.2" -koin-annotations = "2.0.0-RC1" -kotlin = "2.1.10" -kotlin-logging = "7.0.3" -kotlinx-coroutines = "1.10.1" -kotlinx-datetime = "0.6.1" -kotlinx-serialization = "1.8.0" -kotlinter = "5.0.1" -ksp = "2.1.10-1.0.29" -ktor = "3.0.3" -sqldelight = "2.0.2" -sl4f-android = "2.0.16-0" -native-coroutines = "1.0.0-ALPHA-38" +koin = "4.1.1" +koin-annotations = "2.2.0" +kotlin = "2.2.20" +kotlin-logging = "7.0.13" +kotlinx-coroutines = "1.10.2" +kotlinx-datetime = "0.7.1" +kotlinx-serialization = "1.9.0" +kotlinter = "5.2.0" +ksp = "2.2.20-2.0.4" +ktor = "3.3.1" +sqldelight = "2.1.0" +sl4f-android = "2.0.17-0" +native-coroutines = "1.0.0-ALPHA-47" [libraries] koin-core = { module = "io.insert-koin:koin-core", version.ref = "koin" } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 24bca4bb..913ff557 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Fri Jan 31 13:57:31 PST 2025 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists