plugins { id 'com.android.application' id 'org.jetbrains.kotlin.android' } def getVersionCode = { def stdout = new ByteArrayOutputStream() try { exec { commandLine 'git', 'rev-list', '--count', 'HEAD' standardOutput = stdout errorOutput = new ByteArrayOutputStream() ignoreExitValue = true } def count = stdout.toString().trim() return count.isInteger() ? count.toInteger() : 1 } catch (ignored) { return 1 } } def signingPropertiesFile = rootProject.file('keystore.properties') def signingProperties = new Properties() if (signingPropertiesFile.exists()) { signingPropertiesFile.withInputStream(signingProperties.&load) } def readSigningValue = { String... keys -> keys.collect { key -> System.getenv(key) ?: signingProperties.getProperty(key) } .find { value -> value != null && !value.trim().isEmpty() } } def releaseKeystorePath = readSigningValue('CODEXMOBILE_STORE_FILE', 'CODEXMOBILE_KEYSTORE_FILE') def releaseKeystorePassword = readSigningValue('CODEXMOBILE_STORE_PASSWORD', 'CODEXMOBILE_KEYSTORE_PASSWORD') def releaseKeyAlias = readSigningValue('CODEXMOBILE_KEY_ALIAS') def releaseKeyPassword = readSigningValue('CODEXMOBILE_KEY_PASSWORD') def hasReleaseSigning = [releaseKeystorePath, releaseKeystorePassword, releaseKeyAlias, releaseKeyPassword].every { it } def releaseSigningHelp = '''Release signing is not configured. Provide these values either as environment variables or in keystore.properties: - CODEXMOBILE_STORE_FILE or CODEXMOBILE_KEYSTORE_FILE - CODEXMOBILE_STORE_PASSWORD or CODEXMOBILE_KEYSTORE_PASSWORD - CODEXMOBILE_KEY_ALIAS - CODEXMOBILE_KEY_PASSWORD ''' android { namespace 'dev.reversed.codexbarmobile' compileSdk 34 signingConfigs { if (hasReleaseSigning) { release { storeFile rootProject.file(releaseKeystorePath) storePassword releaseKeystorePassword keyAlias releaseKeyAlias keyPassword releaseKeyPassword } } } defaultConfig { applicationId 'dev.reversed.codexbarmobile' minSdk 26 targetSdk 34 versionCode getVersionCode() versionName '1.0.0' vectorDrawables.useSupportLibrary = true } buildTypes { debug { applicationIdSuffix '.debug' versionNameSuffix '-debug' } release { if (hasReleaseSigning) { signingConfig signingConfigs.release } minifyEnabled true shrinkResources true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } compileOptions { sourceCompatibility JavaVersion.VERSION_17 targetCompatibility JavaVersion.VERSION_17 } kotlinOptions { jvmTarget = '17' } buildFeatures { compose true } composeOptions { kotlinCompilerExtensionVersion '1.5.14' } packaging { resources { excludes += '/META-INF/{AL2.0,LGPL2.1}' } } } gradle.taskGraph.whenReady { graph -> def needsSignedRelease = graph.allTasks.any { task -> task.project == project && task.name.toLowerCase().contains('release') && !task.name.toLowerCase().contains('lint') && !task.name.toLowerCase().contains('unittest') && !task.name.toLowerCase().contains('signingreport') } if (needsSignedRelease && !hasReleaseSigning) { throw new GradleException(releaseSigningHelp) } } dependencies { implementation 'androidx.core:core-ktx:1.13.1' implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.8.4' implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.4' implementation 'androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4' implementation 'androidx.activity:activity-compose:1.9.2' implementation platform('androidx.compose:compose-bom:2024.06.00') implementation 'androidx.compose.ui:ui' implementation 'androidx.compose.ui:ui-tooling-preview' implementation 'androidx.compose.material3:material3' implementation 'androidx.compose.material:material-icons-extended' implementation 'androidx.security:security-crypto:1.1.0-alpha06' implementation 'com.google.errorprone:error_prone_annotations:2.28.0' implementation 'com.squareup.okhttp3:okhttp:4.12.0' implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.1' debugImplementation 'androidx.compose.ui:ui-tooling' }