Skip to content
Snippets Groups Projects
build.gradle 10.2 KiB
Newer Older
    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'
            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

abb128's avatar
abb128 committed
    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 {
abb128's avatar
abb128 committed
        minSdk 24
        targetSdk 34
        versionName getVersionName()
        versionCode getVersionCode()
abb128's avatar
abb128 committed
        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")
        }
abb128's avatar
abb128 committed
    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
abb128's avatar
abb128 committed
            signingConfig signingConfigs.debug
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
abb128's avatar
abb128 committed
            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"
abb128's avatar
abb128 committed
                it.buildConfigField "String", "ACRA_URL", "\"\""
                it.buildConfigField "String", "ACRA_USER", "\"\""
                it.buildConfigField "String", "ACRA_PASSWORD", "\"\""
    flavorDimensions = ["buildType"]

    productFlavors {
Aleksandras Kostarevas's avatar
Aleksandras Kostarevas committed
        unstable {
            dimension "buildType"
Aleksandras Kostarevas's avatar
Aleksandras Kostarevas committed
            applicationIdSuffix ".unstable"
            versionNameSuffix "-unstable"

            buildConfigField "boolean", "IS_PLAYSTORE_BUILD", "false"
            buildConfigField "boolean", "UPDATE_CHECKING", "true"
            buildConfigField "boolean", "UPDATE_CHECKING_NETWORK", "false"

Aleksandras Kostarevas's avatar
Aleksandras Kostarevas committed
            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\""
        }

Aleksandras Kostarevas's avatar
Aleksandras Kostarevas committed
        stable {
            dimension "buildType"
            buildConfigField "boolean", "IS_PLAYSTORE_BUILD", "false"
            buildConfigField "boolean", "UPDATE_CHECKING", "true"
            buildConfigField "boolean", "UPDATE_CHECKING_NETWORK", "false"

Aleksandras Kostarevas's avatar
Aleksandras Kostarevas committed
            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 "boolean", "UPDATE_CHECKING_NETWORK", "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']
Aleksandras Kostarevas's avatar
Aleksandras Kostarevas committed
        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'
        }

        unstable {
            java.srcDirs = ['common/src', 'java/src', 'java/stable/java']
            manifest.srcFile 'java/stable/AndroidManifest.xml'
            res.srcDirs = ['java/unstable/res']
        }

        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
    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'
    implementation 'androidx.window:window:1.3.0'
    stableImplementation 'ch.acra:acra-mail:5.11.1'
    stableImplementation 'ch.acra:acra-dialog:5.11.1'
    unstableImplementation 'ch.acra:acra-mail:5.11.1'
    unstableImplementation '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'

abb128's avatar
abb128 committed
    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'
abb128's avatar
abb128 committed
    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}")