plugins { id("com.android.application") id("org.jetbrains.kotlin.plugin.compose") } android { namespace = "de.upapp" compileSdk = 37 defaultConfig { applicationId = "de.upapp" minSdk = 31 targetSdk = 37 versionCode = 1 versionName = "0.1.0" } // Without ANDROID_KEYSTORE, assembleRelease builds an unsigned APK. val keystore = providers.environmentVariable("ANDROID_KEYSTORE").orNull val releaseSigning = keystore?.let { signingConfigs.create("release") { storeFile = file(it) storePassword = providers.environmentVariable("ANDROID_KEYSTORE_PASSWORD").get() keyAlias = providers.environmentVariable("ANDROID_KEY_ALIAS").get() // PKCS12 has one password for the store and the key. keyPassword = storePassword } } buildTypes { release { signingConfig = releaseSigning } } buildFeatures { compose = true buildConfig = true } testOptions { unitTests.isReturnDefaultValues = true } packaging { resources.excludes += "META-INF/versions/9/OSGI-INF/MANIFEST.MF" resources.pickFirsts += "META-INF/LICENSE.md" } } dependencies { implementation(platform("androidx.compose:compose-bom:2026.09.00")) implementation("androidx.compose.material3:material3") implementation("androidx.compose.material:material-icons-core:1.7.8") implementation("androidx.activity:activity-compose:1.13.0") implementation("androidx.lifecycle:lifecycle-viewmodel-compose:2.11.0") // Conscrypt has no TLS_PSK_WITH_AES_128_CBC_SHA256, the car's only session cipher. implementation("org.bouncycastle:bctls-jdk18on:1.86.2") testImplementation("junit:junit:4.13.2") // android.jar only has org.json stubs. testImplementation("org.json:json:20260814") // Creates the test certificates for the registration handshake. testImplementation("org.bouncycastle:bcpkix-jdk18on:1.86") }