import java.time.Instant import java.time.ZoneOffset import java.time.format.DateTimeFormatter plugins { alias(libs.plugins.android.application) alias(libs.plugins.kotlin.android) alias(libs.plugins.kotlin.compose) alias(libs.plugins.kotlin.serialization) alias(libs.plugins.hilt) alias(libs.plugins.ksp) } val commitEpoch = providers.exec { commandLine("git", "log", "-1", "--format=%ct") }.standardOutput.asText.get().trim().toLong() val commitTime = Instant.ofEpochSecond(commitEpoch).atZone(ZoneOffset.UTC) val dateVersionName = commitTime.format(DateTimeFormatter.ofPattern("yyyy.MM.dd.HHmm")) val dateVersionCode = (commitEpoch / 60).toInt() android { namespace = "com.parseable.android" compileSdk = 35 defaultConfig { applicationId = "com.parseable.android" minSdk = 26 targetSdk = 35 versionCode = dateVersionCode versionName = dateVersionName testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } signingConfigs { if (System.getenv("RELEASE_KEYSTORE_FILE") != null) { create("release") { storeFile = file(System.getenv("RELEASE_KEYSTORE_FILE")) storePassword = System.getenv("RELEASE_KEYSTORE_PASSWORD") keyAlias = System.getenv("RELEASE_KEY_ALIAS") keyPassword = System.getenv("RELEASE_KEY_PASSWORD") } } } buildTypes { release { isMinifyEnabled = true isShrinkResources = true signingConfig = signingConfigs.findByName("release") ?: signingConfigs.getByName("debug") proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" ) } debug { isMinifyEnabled = false applicationIdSuffix = ".debug" } } compileOptions { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 } kotlinOptions { jvmTarget = "17" } buildFeatures { compose = true buildConfig = true } testOptions { unitTests.isReturnDefaultValues = true } } ksp { arg("room.schemaLocation", "$projectDir/schemas") } dependencies { // Core Android implementation(libs.core.ktx) implementation(libs.lifecycle.runtime) implementation(libs.lifecycle.viewmodel.compose) implementation(libs.activity.compose) // Compose BOM implementation(platform(libs.compose.bom)) implementation(libs.compose.ui) implementation(libs.compose.ui.graphics) implementation(libs.compose.ui.tooling.preview) implementation(libs.compose.material3) implementation(libs.compose.material.icons) // Navigation implementation(libs.navigation.compose) // Hilt DI implementation(libs.hilt.android) ksp(libs.hilt.compiler) implementation(libs.hilt.navigation.compose) // Networking implementation(libs.okhttp) // Serialization implementation(libs.kotlinx.serialization.json) // DataStore for preferences implementation(libs.datastore.preferences) // Encrypted storage — alpha06 is the latest available; stable 1.1.0 has not shipped. // Fallback to 1.0.0 is not viable as it uses the deprecated MasterKeys API. implementation(libs.security.crypto) // Room database for favorites implementation(libs.room.runtime) implementation(libs.room.ktx) ksp(libs.room.compiler) // Coroutines implementation(libs.coroutines.android) // Logging implementation(libs.timber) // Testing testImplementation(libs.junit) testImplementation(libs.coroutines.test) testImplementation(libs.mockk) androidTestImplementation(libs.android.test.ext) androidTestImplementation(libs.espresso.core) androidTestImplementation(platform(libs.compose.bom)) androidTestImplementation(libs.compose.ui.test) debugImplementation(libs.compose.ui.tooling) debugImplementation(libs.compose.ui.test.manifest) }