import java.util.Properties plugins { alias(libs.plugins.android.application) alias(libs.plugins.kotlin.android) alias(libs.plugins.kotlin.compose) alias(libs.plugins.kotlin.serialization) alias(libs.plugins.ksp) } // Release signing is optional: the keystore and its credentials live outside the // repository. Point to a properties file with GALO_KEYSTORE_PROPERTIES (or place // keystore.properties next to this build file, git-ignored). Without it the // release configuration still resolves, producing an unsigned APK. val keystorePropertiesFile: File = (System.getenv("GALO_KEYSTORE_PROPERTIES")?.let(::file)) ?: rootProject.file("keystore.properties") val keystoreProperties = Properties().apply { if (keystorePropertiesFile.exists()) { keystorePropertiesFile.inputStream().use { load(it) } } } val hasReleaseSigning = keystoreProperties.getProperty("storeFile") != null android { namespace = "com.galo.android" compileSdk = 35 defaultConfig { applicationId = "com.galo.android" minSdk = 28 targetSdk = 35 versionCode = 1 versionName = "0.1.0" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunnerArguments["clearPackageData"] = "true" } signingConfigs { if (hasReleaseSigning) { create("release") { storeFile = file(keystoreProperties.getProperty("storeFile")) storePassword = keystoreProperties.getProperty("storePassword") keyAlias = keystoreProperties.getProperty("keyAlias") keyPassword = keystoreProperties.getProperty("keyPassword") } } } buildTypes { debug { applicationIdSuffix = ".debug" } release { isMinifyEnabled = false isShrinkResources = false proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro", ) signingConfig = signingConfigs.findByName("release") } } compileOptions { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 } kotlinOptions { jvmTarget = "17" } buildFeatures { compose = true } packaging { resources { excludes += "/META-INF/{AL2.0,LGPL2.1}" } } testOptions { unitTests { isIncludeAndroidResources = true } execution = "ANDROIDX_TEST_ORCHESTRATOR" } } // Unit tests run against the debug variant only. The Compose test activity comes // from `ui-test-manifest`, a debug-only dependency, so the release variant's merged // manifest has no activity for `createComposeRule` to launch. The test sources are // variant-agnostic, so running them once (on debug) covers the same ground without // shipping a test activity in the release manifest. androidComponents { beforeVariants(selector().withBuildType("release")) { variant -> variant.enableUnitTest = false } } dependencies { implementation(libs.androidx.core.ktx) implementation(libs.androidx.activity.compose) implementation(libs.androidx.lifecycle.runtime.ktx) implementation(libs.androidx.lifecycle.viewmodel.compose) implementation(libs.androidx.lifecycle.runtime.compose) implementation(libs.androidx.navigation.compose) implementation(libs.kotlinx.coroutines.android) implementation(libs.kotlinx.serialization.json) implementation(platform(libs.androidx.compose.bom)) implementation(libs.androidx.compose.ui) implementation(libs.androidx.compose.ui.graphics) implementation(libs.androidx.compose.ui.tooling.preview) implementation(libs.androidx.compose.material3) implementation(libs.androidx.compose.material.icons.extended) debugImplementation(libs.androidx.compose.ui.tooling) debugImplementation(libs.androidx.compose.ui.test.manifest) implementation(libs.okhttp) implementation(libs.okhttp.sse) implementation(libs.okhttp.logging) implementation(libs.coil.compose) implementation(libs.coil.video) implementation(libs.androidx.room.runtime) implementation(libs.androidx.room.ktx) ksp(libs.androidx.room.compiler) implementation(libs.androidx.work.runtime.ktx) implementation(libs.androidx.datastore.preferences) implementation(libs.androidx.media3.exoplayer) implementation(libs.androidx.media3.ui) implementation(libs.androidx.media3.common) implementation(libs.androidx.exifinterface) implementation(libs.androidx.security.crypto) testImplementation(libs.junit) testImplementation(libs.kotlinx.coroutines.test) testImplementation(libs.okhttp.mockwebserver) testImplementation(libs.robolectric) testImplementation(libs.androidx.test.core) testImplementation(libs.androidx.test.ext.junit) testImplementation(libs.androidx.room.testing) testImplementation(libs.androidx.work.testing) testImplementation(platform(libs.androidx.compose.bom)) testImplementation(libs.androidx.compose.ui.test.junit4) testImplementation(libs.androidx.compose.ui.test.manifest) androidTestImplementation(libs.androidx.test.ext.junit) androidTestImplementation(libs.androidx.test.espresso.core) androidTestImplementation(libs.androidx.test.runner) androidTestImplementation(libs.okhttp) androidTestImplementation(libs.kotlinx.coroutines.test) androidTestImplementation(platform(libs.androidx.compose.bom)) androidTestImplementation(libs.androidx.compose.ui.test.junit4) androidTestUtil(libs.androidx.test.orchestrator) }