plugins { id 'com.android.application' version '8.1.1' } dependencies { testImplementation "junit:junit:4.13.2" } android { namespace 'juloo.keyboard2' compileSdk 34 defaultConfig { applicationId "juloo.keyboard2" minSdk 11 targetSdkVersion 35 versionCode 42 versionName "1.29.1" } sourceSets { main { manifest.srcFile 'AndroidManifest.xml' java.srcDirs = ['srcs/juloo.keyboard2'] res.srcDirs = ['res', 'build/generated-resources'] assets.srcDirs = ['assets'] } test { java.srcDirs = ['test'] } } signingConfigs { // Debug builds will always be signed. If no environment variables are set, a default // keystore will be initialized by the task initDebugKeystore and used. This keystore // can be uploaded to GitHub secrets by following instructions in CONTRIBUTING.md // in order to always receive correctly signed debug APKs from the CI. debug { storeFile(System.env.DEBUG_KEYSTORE ? file(System.env.DEBUG_KEYSTORE) : file("debug.keystore")) storePassword(System.env.DEBUG_KEYSTORE_PASSWORD ? "$System.env.DEBUG_KEYSTORE_PASSWORD" : "debug0") keyAlias(System.env.DEBUG_KEY_ALIAS ? "$System.env.DEBUG_KEY_ALIAS" : "debug") keyPassword(System.env.DEBUG_KEY_PASSWORD ? "$System.env.DEBUG_KEY_PASSWORD" : "debug0") } release { if (System.env.RELEASE_KEYSTORE) { storeFile file(System.env.RELEASE_KEYSTORE) storePassword "$System.env.RELEASE_KEYSTORE_PASSWORD" keyAlias "$System.env.RELEASE_KEY_ALIAS" keyPassword "$System.env.RELEASE_KEY_PASSWORD" } } } buildTypes { release { minifyEnabled true shrinkResources true debuggable false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt') resValue "string", "app_name", "@string/app_name_release" signingConfig signingConfigs.release } debug { minifyEnabled false shrinkResources false debuggable true applicationIdSuffix ".debug" resValue "string", "app_name", "@string/app_name_debug" resValue "bool", "debug_logs", "true" signingConfig signingConfigs.debug } } // Name outputs after the application ID. android.applicationVariants.all { variant -> variant.outputs.all { outputFileName = "${applicationId}.apk" } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_7 targetCompatibility JavaVersion.VERSION_1_7 } lintOptions { // Translation are already checked by 'syncTranslations' disable 'MissingTranslation' } } tasks.register('buildKeyboardFont') { println "\nBuilding assets/special_font.ttf" mkdir "$buildDir" exec { workingDir "$projectDir/srcs/special_font" def svgFiles = workingDir.listFiles().findAll { it.isFile() && it.name.endsWith(".svg") } commandLine("fontforge", "-lang=ff", "-script", "build.pe", "$buildDir/special_font.ttf", *svgFiles) } copy { from "$buildDir/special_font.ttf" into "assets" } } tasks.register('genEmojis') { println "\nGenerating res/raw/emojis.txt" exec { workingDir = projectDir commandLine "python", "gen_emoji.py" } } tasks.withType(Test).configureEach { dependsOn 'genLayoutsList' dependsOn 'checkKeyboardLayouts' dependsOn 'syncTranslations' dependsOn 'compileComposeSequences' } tasks.register('genLayoutsList') { println "\nGenerating res/values/layouts.xml" exec { workingDir = projectDir commandLine "python", "gen_layouts.py" } } tasks.register('checkKeyboardLayouts') { println "\nChecking layouts" exec { def layouts = new File(projectDir, "srcs/layouts").listFiles().findAll { it.name.endsWith(".xml") } workingDir = projectDir commandLine("python", "check_layout.py", *layouts) standardOutput = new FileOutputStream("${projectDir}/check_layout.output") } } tasks.register('syncTranslations') { println "\nUpdating translations" exec { workingDir = projectDir commandLine "python", "sync_translations.py" } } tasks.register('compileComposeSequences') { def out = "srcs/juloo.keyboard2/ComposeKeyData.java" println "\nGenerating ${out}" exec { def sequences = new File(projectDir, "srcs/compose").listFiles().findAll { !it.name.endsWith(".py") && !it.name.endsWith(".md") } workingDir = projectDir commandLine("python", "srcs/compose/compile.py", *sequences) standardOutput = new FileOutputStream("${projectDir}/${out}") } } tasks.named("preBuild") { dependsOn += "initDebugKeystore" dependsOn += "copyRawQwertyUS" dependsOn += "copyLayoutDefinitions" } tasks.register('initDebugKeystore') { if (!file("debug.keystore").exists()) { println "Initializing default debug keystore" exec { // A shell script might be needed if this line requires input from the user commandLine "keytool", "-genkeypair", "-dname", "cn=d, ou=e, o=b, c=ug", "-alias", "debug", "-keypass", "debug0", "-keystore", "debug.keystore", "-keyalg", "rsa", "-storepass", "debug0", "-validity", "10000" } } } // latn_qwerty_us is used as a raw resource by the custom layout option. tasks.register('copyRawQwertyUS') { copy { from "srcs/layouts/latn_qwerty_us.xml" into "build/generated-resources/raw" } } tasks.register('copyLayoutDefinitions') { copy { from "srcs/layouts" include "*.xml" into "build/generated-resources/xml" } }