import org.jetbrains.kotlin.gradle.dsl.JvmTarget import org.jetbrains.kotlin.gradle.dsl.KotlinVersion plugins { alias libs.plugins.android.application alias libs.plugins.compose alias libs.plugins.hilt alias libs.plugins.kotlin.android alias libs.plugins.kotlin.parcelize alias libs.plugins.kotlin.serialization alias libs.plugins.ksp alias libs.plugins.rust.android } apply from: 'capacitor.build.gradle' android { namespace "app.affine.pro" compileSdk rootProject.ext.compileSdkVersion ndkVersion = new File(sdkDirectory, "ndk").listFiles().sort().last().name defaultConfig { applicationId "app.affine.pro" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" aaptOptions { // Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps. // Default: https://android.googlesource.com/platform/frameworks/base/+/282e181b58cf72b6ca770dc7ca5f91f135444502/tools/aapt/AaptAssets.cpp#61 ignoreAssetsPattern '!.svn:!.git:!.ds_store:!*.scc:.*:!CVS:!thumbs.db:!picasa.ini:!*~' } ndk { abiFilters 'arm64-v8a' } } buildFeatures { compose true buildConfig true viewBinding true } buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } debug { minifyEnabled false debuggable true } } flavorDimensions = ['chanel'] productFlavors { stable { buildConfigField 'String', 'BASE_URL', '"https://app.affine.pro"' resValue 'string', 'host', '"app.affine.pro"' } canary { buildConfigField 'String', 'BASE_URL', '"https://affine.fail"' resValue 'string', 'host', '"affine.fail"' } } compileOptions { sourceCompatibility JavaVersion.VERSION_21 targetCompatibility JavaVersion.VERSION_21 } } repositories { flatDir { dirs '../capacitor-cordova-android-plugins/src/main/libs', 'libs' } } dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') implementation project(':capacitor-android') implementation project(':capacitor-cordova-android-plugins') implementation project(':service') implementation libs.androidx.appcompat implementation libs.androidx.browser implementation libs.timber implementation libs.hilt.android.core ksp libs.hilt.compiler def composeBom = platform(libs.androidx.compose.bom) implementation composeBom implementation libs.androidx.activity.compose implementation libs.androidx.compose.foundation.layout implementation libs.androidx.compose.material3 implementation libs.androidx.compose.material.icons.extended implementation libs.androidx.compose.runtime.livedata implementation libs.androidx.compose.ui.tooling.preview implementation libs.androidx.compose.ui.util implementation libs.androidx.compose.ui.viewbinding implementation libs.androidx.compose.ui.googlefonts implementation libs.androidx.lifecycle.viewModelCompose implementation libs.androidx.lifecycle.runtime.compose implementation libs.androidx.navigation.compose debugImplementation composeBom debugImplementation libs.androidx.compose.ui.test.manifest debugImplementation libs.androidx.compose.ui.tooling implementation libs.androidx.coordinatorlayout implementation libs.androidx.core.ktx implementation libs.androidx.core.splashscreen implementation libs.androidx.navigation.fragment implementation libs.androidx.navigation.ui.ktx implementation libs.apollo.runtime implementation (libs.jna) { artifact { type = 'aar' } } implementation libs.kotlinx.coroutines.android implementation libs.kotlinx.serialization.json def okhttpBom = platform(libs.okhttp.bom) implementation okhttpBom implementation libs.okhttp implementation libs.okhttp.coroutines implementation libs.okhttp.logging implementation libs.okhttp.sse testImplementation libs.junit androidTestImplementation libs.androidx.junit androidTestImplementation libs.androidx.espresso.core } try { def servicesJSON = file('google-services.json') if (servicesJSON.text) { apply plugin: 'com.google.gms.google-services' } } catch (Exception ignored) { logger.info("google-services.json not found, google-services plugin not applied. Push Notifications won't work") } cargo { module = "../../../../mobile-native" libname = "affine_mobile_native" targets = ["arm64"] pythonCommand = "python3" targetDirectory = "../../../../../../target" apiLevel = 28 targetIncludes = ["libaffine_mobile_native.so"] profile = "release" } kotlin { compilerOptions { apiVersion = KotlinVersion.KOTLIN_2_1 languageVersion = KotlinVersion.KOTLIN_2_1 jvmTarget = JvmTarget.JVM_21 } } afterEvaluate { // The `cargoBuild` task isn't available until after evaluation. android.applicationVariants.configureEach { variant -> def productFlavor = "" variant.productFlavors.each { productFlavor += "${it.name.capitalize()}" } def buildType = "${variant.buildType.name.capitalize()}" tasks["generate${productFlavor}${buildType}Assets"].dependsOn(tasks["cargoBuild"]) } } android.applicationVariants.configureEach { variant -> def t = tasks.register("generate${variant.name.capitalize()}UniFFIBindings", Exec) { workingDir "${project.projectDir}" // Runs the bindings generation, note that you must have uniffi-bindgen installed and in your PATH environment variable commandLine 'cargo', 'run', '--bin', 'uniffi-bindgen', 'generate', '--library', "${buildDir}/rustJniLibs/android/arm64-v8a/libaffine_mobile_native.so", '--language', 'kotlin', '--out-dir', "${project.projectDir}/src/main/java" dependsOn("cargoBuild") } variant.javaCompileProvider.get().dependsOn(t) } tasks.whenTaskAdded { task -> if ((task.name == 'javaPreCompileDebug' || task.name == 'javaPreCompileRelease')) { task.dependsOn 'cargoBuild' } }