plugins { alias(libs.plugins.androidApplication) alias(libs.plugins.jetbrainsKotlinAndroid) alias(libs.plugins.googleServices) } android { namespace 'com.vitorpamplona.amethyst' compileSdk 34 defaultConfig { applicationId "com.vitorpamplona.amethyst" minSdk 26 targetSdk 34 versionCode 362 versionName "0.85.3" buildConfigField "String", "RELEASE_NOTES_ID", "\"d8da33fd13d129d86c53564aedefafbe3716f007c520431be4a8e488d3925afb\"" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables { useSupportLibrary true } resourceConfigurations += [ 'ar', 'bn-rBD', 'cs', 'cy-rGB', 'da-rDK', 'de', 'el-rGR', 'en-rGB', 'eo', 'es', 'es-rES', 'es-rMX', 'es-rUS', 'et-rEE', 'fa', 'fi-rFI', 'fo-rFO', 'fr', 'fr-rCA', 'gu-rIN', 'hi-rIN', 'hr-rHR', 'hu', 'in', 'in-rID', 'it-rIT', 'iw-rIL', 'ja', 'kk-rKZ', 'ko-rKR', 'ks-rIN', 'ku-rTR', 'lt-rLT', 'ne-rNP', 'night', 'nl', 'nl-rBE', 'pcm-rNG', 'pl-rPL', 'pt-rBR', 'pt-rPT', 'ru', 'ru-rUA', 'sa-rIN', 'sl-rSI', 'so-rSO', 'sr-rSP', 'ss-rZA', 'sv-rSE', 'sw-rKE', 'sw-rTZ', 'ta', 'th', 'tr', 'uk', 'ur-rIN', 'uz-rUZ', 'vi-rVN', 'zh', 'zh-rCN', 'zh-rHK', 'zh-rSG', 'zh-rTW' ] } buildTypes { release { proguardFiles getDefaultProguardFile("proguard-android-optimize.txt"), 'proguard-rules.pro' minifyEnabled true resValue "string", "app_name", "@string/app_name_release" } debug { applicationIdSuffix '.debug' versionNameSuffix '-DEBUG' resValue "string", "app_name", "@string/app_name_debug" } create("benchmark") { initWith(getByName("release")) profileable true signingConfig signingConfigs.debug } } flavorDimensions = ["channel"] productFlavors { play { getIsDefault().set(true) dimension "channel" } fdroid { dimension "channel" } } splits { abi { enable true reset() include "x86", "x86_64", "arm64-v8a", "armeabi-v7a" universalApk true } } compileOptions { sourceCompatibility JavaVersion.VERSION_17 targetCompatibility JavaVersion.VERSION_17 } kotlinOptions { jvmTarget = '17' } buildFeatures { compose true buildConfig true } composeOptions { // Should match compose version : https://developer.android.com/jetpack/androidx/releases/compose-kotlin kotlinCompilerExtensionVersion "1.5.8" } packagingOptions { resources { excludes += ['/META-INF/{AL2.0,LGPL2.1}', '**/libscrypt.dylib'] } } lint { disable 'MissingTranslation' } testOptions { unitTests.returnDefaultValues = true } } dependencies { implementation platform(libs.androidx.compose.bom) implementation project(path: ':quartz') implementation project(path: ':commons') implementation libs.androidx.core.ktx implementation libs.androidx.activity.compose implementation libs.androidx.ui implementation libs.androidx.ui.graphics implementation libs.androidx.ui.tooling.preview // Needs this to open gallery / image upload implementation libs.androidx.fragment.ktx // Navigation implementation libs.androidx.navigation.compose // Observe Live data as State implementation libs.androidx.runtime.livedata // Material 3 Design implementation libs.androidx.material3 implementation libs.androidx.material.icons // Adaptive Layout / Two Pane implementation libs.androidx.material3.windowSize implementation libs.accompanist.adaptive // Lifecycle implementation libs.androidx.lifecycle.runtime.ktx implementation libs.androidx.lifecycle.runtime.compose implementation libs.androidx.lifecycle.viewmodel.compose implementation libs.androidx.lifecycle.livedata.ktx // Zoomable images implementation libs.zoomable // Biometrics implementation libs.androidx.biometric.ktx // Websockets API implementation libs.okhttp // Encrypted Key Storage implementation libs.androidx.security.crypto.ktx // view videos implementation libs.androidx.media3.exoplayer implementation libs.androidx.media3.exoplayer.hls implementation libs.androidx.media3.ui implementation libs.androidx.media3.session // important for proxy / tor implementation libs.androidx.media3.datasource.okhttp // Load images from the web. implementation libs.coil.compose // view gifs implementation libs.coil.gif // view svgs implementation libs.coil.svg // create blurhash implementation libs.trbl.blurhash // Permission to upload pictures: implementation libs.accompanist.permissions // For QR generation implementation libs.zxing implementation libs.zxing.embedded // Markdown //implementation "com.halilibo.compose-richtext:richtext-ui:0.16.0" //implementation "com.halilibo.compose-richtext:richtext-ui-material:0.16.0" //implementation "com.halilibo.compose-richtext:richtext-commonmark:0.16.0" // Markdown (With fix for full-image bleeds) implementation libs.markdown.ui implementation libs.markdown.ui.material3 implementation libs.markdown.commonmark // Language picker and Theme chooser implementation libs.androidx.appcompat // Local model for language identification playImplementation libs.google.mlkit.language.id // Google services model the translate text playImplementation libs.google.mlkit.translate // PushNotifications playImplementation platform(libs.firebase.bom) playImplementation libs.firebase.messaging //PushNotifications(FDroid) fdroidImplementation libs.unifiedpush // Charts implementation libs.vico.charts.core implementation libs.vico.charts.compose implementation libs.vico.charts.views implementation libs.vico.charts.m3 // GeoHash implementation libs.drfonfon.geohash // Waveform visualizer implementation libs.audiowaveform // Video compression lib implementation libs.abedElazizShe.image.compressor // Image compression lib implementation libs.zelory.video.compressor testImplementation libs.junit testImplementation libs.mockk androidTestImplementation platform(libs.androidx.compose.bom) androidTestImplementation libs.androidx.junit androidTestImplementation libs.androidx.junit.ktx androidTestImplementation libs.androidx.espresso.core debugImplementation platform(libs.androidx.compose.bom) debugImplementation libs.androidx.ui.tooling debugImplementation libs.androidx.ui.test.manifest } // https://gitlab.com/fdroid/wiki/-/wikis/HOWTO:-diff-&-fix-APKs-for-Reproducible-Builds#differing-assetsdexoptbaselineprofm-easy-to-fix // NB: Android Studio can't find the imports; this does not affect the // actual build since Gradle can find them just fine. import com.android.tools.profgen.ArtProfileKt import com.android.tools.profgen.ArtProfileSerializer import com.android.tools.profgen.DexFile project.afterEvaluate { tasks.each { task -> if (task.name.startsWith("compile") && task.name.endsWith("ReleaseArtProfile")) { task.doLast { outputs.files.each { file -> if (file.name.endsWith(".profm")) { println("Sorting ${file} ...") def version = ArtProfileSerializer.valueOf("METADATA_0_0_2") def profile = ArtProfileKt.ArtProfile(file) def keys = new ArrayList(profile.profileData.keySet()) def sortedData = new LinkedHashMap() Collections.sort keys, new DexFile.Companion() keys.each { key -> sortedData[key] = profile.profileData[key] } new FileOutputStream(file).with { write(version.magicBytes$profgen) write(version.versionBytes$profgen) version.write$profgen(it, sortedData, "") } } } } } } }