import java.io.FileInputStream import java.util.Properties plugins { alias(libs.plugins.android.application) alias(libs.plugins.kotlin.compose) alias(libs.plugins.kotlin.serialization) alias(libs.plugins.firebase.crashlytics.gradle) // alias(libs.plugins.paparazzi) — temporarily disabled until compatible version is available } android { namespace = "com.kordant.android" compileSdk { version = release(36) { minorApiLevel = 1 } } defaultConfig { applicationId = "com.kordant.android" minSdk = 26 targetSdk = 36 versionCode = 1 versionName = "1.0" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" buildConfigField("String", "API_BASE_URL", "\"http://10.0.2.2:3000\"") buildConfigField("String", "API_STAGING_URL", "\"https://staging.api.kordant.com\"") buildConfigField("String", "API_PRODUCTION_URL", "\"https://api.kordant.com\"") // Resource config for supported languages (reduces APK size) // resourceConfigurations.addAll(listOf("en")) } // Load signing configuration from key.properties // This file is NOT committed — see key.properties.template val keystorePropertiesFile = rootProject.file("key.properties") val keystoreProperties = Properties() if (keystorePropertiesFile.exists()) { keystoreProperties.load(FileInputStream(keystorePropertiesFile)) } signingConfigs { create("release") { if (keystoreProperties.isNotEmpty()) { storeFile = file(keystoreProperties["storeFile"] as String) storePassword = keystoreProperties["storePassword"] as String keyAlias = keystoreProperties["keyAlias"] as String keyPassword = keystoreProperties["keyPassword"] as String } } } buildTypes { debug { isMinifyEnabled = false buildConfigField("String", "API_BASE_URL", "\"http://10.0.2.2:3000\"") applicationIdSuffix = ".debug" versionNameSuffix = "-debug" } release { // Enable R8 code shrinking, resource shrinking, and obfuscation isMinifyEnabled = true isShrinkResources = true proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" ) buildConfigField("String", "API_BASE_URL", "\"https://api.kordant.com\"") // Signing config for release builds // Requires key.properties (see key.properties.template) signingConfig = signingConfigs.getByName("release") } } flavorDimensions += "environment" productFlavors { create("dev") { dimension = "environment" applicationIdSuffix = ".dev" versionNameSuffix = "-dev" buildConfigField("String", "API_BASE_URL", "\"http://10.0.2.2:3000\"") } create("prod") { dimension = "environment" buildConfigField("String", "API_BASE_URL", "\"https://api.kordant.com\"") } } compileOptions { sourceCompatibility = JavaVersion.VERSION_11 targetCompatibility = JavaVersion.VERSION_11 } buildFeatures { compose = true buildConfig = true } lint { baseline = file("lint-baseline.xml") abortOnError = false } packaging { resources { excludes += "/META-INF/{AL2.0,LGPL2.1}" excludes += "META-INF/versions/9/previous-compilation-data.bin" } } // Resource config for supported languages (reduces APK size) androidResources { localeFilters += "en" } testOptions { unitTests { isIncludeAndroidResources = true } } // Resources directory for screenshot golden images sourceSets { getByName("test") { resources { setSrcDirs(listOf("src/test/screenshots")) } } } } // Paparazzi screenshot testing configuration // FIXME: Paparazzi plugin not available in all environments // paparazzi { // theme = "android:style/Theme.Material.Light.NoActionBar" // renderMode = "SHRINK" // } dependencies { implementation(libs.androidx.core.ktx) implementation(libs.androidx.lifecycle.runtime.ktx) implementation(libs.androidx.activity.compose) implementation(libs.androidx.navigation.compose) 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.material3.adaptive.navigation.suite) implementation(libs.androidx.compose.material.icons.core) implementation(libs.androidx.paging.runtime) implementation(libs.androidx.paging.compose) implementation(libs.coil.compose) implementation(libs.lottie.compose) implementation(libs.androidx.security.crypto) implementation(libs.androidx.biometric) implementation(libs.androidx.datastore.preferences) implementation(libs.okhttp) implementation(libs.okhttp.logging.interceptor) implementation(libs.gson) implementation(libs.play.services.auth) implementation(libs.play.integrity) implementation(libs.retrofit) implementation(libs.retrofit.kotlinx.serialization.converter) implementation(libs.kotlinx.serialization.json) implementation(libs.work.runtime.ktx) implementation(platform(libs.firebase.bom)) implementation(libs.firebase.messaging) implementation(libs.firebase.crashlytics) debugImplementation("androidx.profileinstaller:profileinstaller:1.4.1") implementation("androidx.profileinstaller:profileinstaller:1.4.1") testImplementation(libs.junit) testImplementation(libs.kotlinx.coroutines.test) testImplementation(libs.truth) testImplementation(libs.okhttp.mockwebserver) testImplementation(libs.work.testing) androidTestImplementation(libs.androidx.junit) androidTestImplementation(libs.androidx.espresso.core) androidTestImplementation(platform(libs.androidx.compose.bom)) androidTestImplementation(libs.androidx.compose.ui.test.junit4) androidTestImplementation(libs.benchmark.macro.junit4) debugImplementation(libs.androidx.compose.ui.tooling) debugImplementation(libs.androidx.compose.ui.test.manifest) }