plugins { id 'com.android.application' version '8.2.2' id 'org.jetbrains.kotlin.android' version '2.0.0' id 'org.jetbrains.kotlin.plugin.compose' version '2.0.0' id 'org.jetbrains.kotlin.plugin.serialization' version '2.0.0' id 'com.android.library' version '8.2.2' apply false } def getVersionCode = { -> try { def stdout = new ByteArrayOutputStream() exec { commandLine 'git', 'rev-list', '--first-parent', '--count', 'master' standardOutput = stdout } return Integer.parseInt(stdout.toString().trim()) } catch (ignored) { project.logger.lifecycle("Failed to get rev-list count from git!") return -1; } } def getVersionName = { -> try { def stdout = new ByteArrayOutputStream() exec { commandLine 'git', 'describe', '--tags', '--dirty' standardOutput = stdout } return stdout.toString().trim() } catch (ignored) { project.logger.lifecycle("Failed to get version name tag from git!") return "0.0.0"; } } // TODO: Remove tasks.register('updateLocales', Exec) { commandLine 'bash', '-c', 'cd tools/make-keyboard-text-py && python3 src/generate.py' } preBuild.dependsOn updateLocales android { namespace 'org.futo.inputmethod.latin' compileSdk 34 // Required if using classes in android.test.runner useLibrary 'android.test.runner' // Required if using classes in android.test.base useLibrary 'android.test.base' // Required if using classes in android.test.mock useLibrary 'android.test.mock' defaultConfig { minSdk 24 targetSdk 34 versionName getVersionName() versionCode getVersionCode() applicationId 'org.futo.inputmethod.latin' testApplicationId 'org.futo.inputmethod.latin.tests' testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = false } signingConfigs { debug { storeFile file("java/shared.keystore") } } final def keystorePropertiesFile = rootProject.file("keystore.properties") def releaseSigning = signingConfigs.debug if (keystorePropertiesFile.exists()) { final def keystoreProperties = new Properties() keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) releaseSigning = signingConfigs.create("release") { keyAlias keystoreProperties['keyAlias'] keyPassword keystoreProperties['keyPassword'] storeFile rootProject.file(keystoreProperties['storeFile']) storePassword keystoreProperties['storePassword'] } } else { project.logger.lifecycle('keystore.properties not found, APK may not be signed') } final def crashReportPropertiesFile = rootProject.file("crashreporting.properties") final def crashReportProperties = new Properties() if (crashReportPropertiesFile.exists()) { crashReportProperties.load(new FileInputStream(crashReportPropertiesFile)) } else { project.logger.lifecycle('crashreporting.properties not found, crash reporting will be disabled') } buildTypes { debug { minifyEnabled false shrinkResources false signingConfig signingConfigs.debug } release { minifyEnabled true shrinkResources false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' signingConfig releaseSigning } buildTypes.each { if (crashReportPropertiesFile.exists()) { it.buildConfigField "boolean", "ENABLE_ACRA", crashReportProperties['acraEnabled'] it.buildConfigField "String", "ACRA_URL", crashReportProperties['acraUrl'] it.buildConfigField "String", "ACRA_USER", crashReportProperties['acraUser'] it.buildConfigField "String", "ACRA_PASSWORD", crashReportProperties['acraPassword'] } else { it.buildConfigField "boolean", "ENABLE_ACRA", "false" it.buildConfigField "String", "ACRA_URL", "\"\"" it.buildConfigField "String", "ACRA_USER", "\"\"" it.buildConfigField "String", "ACRA_PASSWORD", "\"\"" } } } flavorDimensions = ["buildType"] productFlavors { stable { dimension "buildType" buildConfigField "boolean", "IS_PLAYSTORE_BUILD", "false" buildConfigField "boolean", "UPDATE_CHECKING", "true" getIsDefault().set(true) buildConfigField "String", "PAYMENT_URL", "\"https://pay.futo.org/api/PaymentPortal?product=voiceinput&success=futo-keyboard%3a%2f%2flicense%2factivate\"" buildConfigField "String", "PAYMENT_PRICE", "\"~\$6.99\"" } playstore { dimension "buildType" applicationIdSuffix ".playstore" versionNameSuffix "-playstore" buildConfigField "boolean", "IS_PLAYSTORE_BUILD", "true" buildConfigField "boolean", "UPDATE_CHECKING", "false" buildConfigField "String", "PAYMENT_URL", "\"https://play.google.com/store/apps/details?id=org.futo.keyboardpayment\"" buildConfigField "String", "PAYMENT_PRICE", "\"~\$11.99\"" } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } sourceSets { main { res.srcDirs = ['java/res'] java.srcDirs = ['common/src', 'java/src'] manifest.srcFile 'java/AndroidManifest.xml' assets.srcDirs = ['java/assets'] } playstore { java.srcDirs = ['common/src', 'java/src', 'java/playstore/java'] manifest.srcFile 'java/playstore/AndroidManifest.xml' } stable { java.srcDirs = ['common/src', 'java/src', 'java/stable/java'] manifest.srcFile 'java/stable/AndroidManifest.xml' } androidTest { res.srcDirs = ['tests/res'] java.srcDirs = ['tests/src'] manifest.srcFile "tests/AndroidManifest.xml" } } lintOptions { checkReleaseBuilds false } aaptOptions { noCompress 'dict' } externalNativeBuild { ndkBuild { path 'native/jni/Android.mk' } } kotlinOptions { jvmTarget = '1.8' } buildFeatures { compose true viewBinding true mlModelBinding true buildConfig true } } dependencies { implementation 'androidx.core:core-ktx:1.13.1' implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.8.4' implementation 'androidx.lifecycle:lifecycle-runtime:2.8.4' implementation 'androidx.lifecycle:lifecycle-runtime-compose:2.8.4' implementation 'androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4' implementation 'androidx.activity:activity-compose:1.9.1' implementation platform('androidx.compose:compose-bom:2024.06.00') implementation 'androidx.compose.ui:ui' implementation 'androidx.compose.ui:ui-graphics' implementation 'androidx.compose.ui:ui-tooling-preview' implementation 'androidx.compose.material3:material3' implementation 'com.google.android.material:material:1.12.0' implementation 'androidx.appcompat:appcompat:1.7.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' implementation 'androidx.navigation:navigation-compose:2.7.7' implementation 'com.google.code.findbugs:jsr305:3.0.2' implementation 'androidx.datastore:datastore-preferences:1.1.1' implementation 'androidx.autofill:autofill:1.1.0' stableImplementation 'ch.acra:acra-mail:5.11.1' stableImplementation 'ch.acra:acra-dialog:5.11.1' implementation 'sh.calvin.reorderable:reorderable:2.2.0' implementation 'com.squareup.okhttp3:okhttp:4.11.0' implementation 'org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.1' implementation 'org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:1.7.1' def work_version = "2.9.0" implementation "androidx.work:work-runtime-ktx:$work_version" implementation "androidx.work:work-runtime:$work_version" implementation project(":voiceinput-shared") implementation "com.charleskorn.kaml:kaml:0.61.0" debugImplementation 'androidx.compose.ui:ui-tooling' debugImplementation 'androidx.compose.ui:ui-test-manifest' testImplementation 'junit:junit:4.13.2' androidTestImplementation "org.mockito:mockito-core:1.9.5" androidTestImplementation 'com.google.dexmaker:dexmaker:1.2' androidTestImplementation 'com.google.dexmaker:dexmaker-mockito:1.2' androidTestImplementation 'androidx.test.ext:junit:1.1.5' androidTestImplementation 'androidx.test:rules:1.5.0' androidTestImplementation 'androidx.test.uiautomator:uiautomator:2.2.0' androidTestImplementation 'androidx.annotation:annotation:1.0.0' } project.logger.lifecycle("versionCode = ${android.defaultConfig.versionCode}") project.logger.lifecycle("versionName = ${android.defaultConfig.versionName}")