import com.android.build.api.dsl.ApplicationDefaultConfig import java.util.Locale plugins { id("local.app") } android { val catalogs = extensions.getByType() val libs = catalogs.named("libs") namespace = "com.igorwojda.showcase" compileSdk = libs.findVersion("compileSdk").get().toString().toInt() defaultConfig { minSdk = libs.findVersion("minSdk").get().toString().toInt() testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } defaultConfig { applicationId = "com.igorwojda.showcase" versionCode = 1 versionName = "0.0.1" // SemVer (Major.Minor.Patch) minSdk = 28 testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" multiDexEnabled = true vectorDrawables { useSupportLibrary = true } buildConfigFieldFromGradleProperty("apiBaseUrl") buildConfigFieldFromGradleProperty("apiToken") } buildTypes { getByName("release") { isMinifyEnabled = false proguardFiles("proguard-android.txt", "proguard-rules.pro") } } @Suppress("UnstableApiUsage") buildFeatures { viewBinding = true buildConfig = true compose = true } composeOptions { kotlinCompilerExtensionVersion = libs.findVersion("kotlinCompilerExtensionVersion").get().toString() } compileOptions { sourceCompatibility = JavaVersion.VERSION_11 targetCompatibility = JavaVersion.VERSION_11 } kotlinOptions { jvmTarget = JavaVersion.VERSION_11.toString() } @Suppress("UnstableApiUsage") testOptions { unitTests.isReturnDefaultValues = true } } dependencies { // Syntax utilizes Gradle TYPESAFE_PROJECT_ACCESSORS feature implementation(projects.featureAlbum) implementation(projects.featureProfile) implementation(projects.featureFavourite) } /* Takes value from Gradle project property and sets it as Android build config property eg. apiToken variable present in the settings.gradle file will be accessible as BuildConfig.GRADLE_API_TOKEN in the app. */ fun ApplicationDefaultConfig.buildConfigFieldFromGradleProperty(gradlePropertyName: String) { val propertyValue = project.properties[gradlePropertyName] as? String checkNotNull(propertyValue) { "Gradle property $gradlePropertyName is null" } val androidResourceName = "GRADLE_${gradlePropertyName.toSnakeCase()}".uppercase(Locale.getDefault()) buildConfigField("String", androidResourceName, propertyValue) } fun String.toSnakeCase() = this.split(Regex("(?=[A-Z])")).joinToString("_") { it.lowercase(Locale.getDefault()) }