Files
coco 723ce1af5c a
2026-07-03 15:12:48 +08:00

329 lines
9.9 KiB
Kotlin

import com.android.build.gradle.internal.api.BaseVariantOutputImpl
import org.jetbrains.kotlin.compose.compiler.gradle.ComposeFeatureFlag
import java.io.FileInputStream
import java.util.Properties
plugins {
alias(libs.plugins.androidApplication)
alias(libs.plugins.kotlinAndroid)
alias(libs.plugins.kspAndroid)
alias(libs.plugins.roomPlugin)
alias(libs.plugins.hiltAndroid)
alias(libs.plugins.baselineProfilePlugin)
alias(libs.plugins.kotlin.compose.compiler)
id("kotlin-parcelize")
alias(libs.plugins.kotlinSerialization)
}
android {
namespace = "com.dot.gallery"
compileSdk = 35
defaultConfig {
applicationId = "com.dot.gallery"
minSdk = 30
targetSdk = 35
versionCode = 31020
versionName = "3.1.0"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
vectorDrawables {
useSupportLibrary = true
}
base.archivesName.set("Gallery-${versionName}-$versionCode" + mapsApiApplicationPrefix)
}
lint.baseline = file("lint-baseline.xml")
signingConfigs {
create("release") {
storeFile = file("release_key.jks")
storePassword = System.getenv("SIGNING_STORE_PASSWORD")
keyAlias = System.getenv("SIGNING_KEY_ALIAS")
keyPassword = System.getenv("SIGNING_KEY_PASSWORD")
}
}
buildTypes {
getByName("debug") {
buildConfigField("String", "MAPS_TOKEN", getApiKey())
applicationIdSuffix = ".debug"
versionNameSuffix = "-debug"
manifestPlaceholders["appProvider"] = "com.dot.gallery.debug.media_provider"
buildConfigField("Boolean", "ALLOW_ALL_FILES_ACCESS", allowAllFilesAccess)
buildConfigField(
"String",
"CONTENT_AUTHORITY",
"\"com.dot.gallery.debug.media_provider\""
)
}
getByName("release") {
manifestPlaceholders += mapOf(
"appProvider" to "com.dot.gallery.media_provider"
)
isMinifyEnabled = true
isShrinkResources = true
setProguardFiles(
listOf(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
)
signingConfig = signingConfigs.getByName("release")
buildConfigField("Boolean", "ALLOW_ALL_FILES_ACCESS", allowAllFilesAccess)
buildConfigField("String", "MAPS_TOKEN", getApiKey())
buildConfigField("String", "CONTENT_AUTHORITY", "\"com.dot.gallery.media_provider\"")
}
create("staging") {
initWith(getByName("release"))
isMinifyEnabled = false
isShrinkResources = false
applicationIdSuffix = ".staging"
versionNameSuffix = "-staging"
manifestPlaceholders["appProvider"] = "com.dot.staging.debug.media_provider"
buildConfigField(
"String",
"CONTENT_AUTHORITY",
"\"com.dot.staging.debug.media_provider\""
)
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = "17"
freeCompilerArgs += "-Xcontext-receivers"
}
buildFeatures {
compose = true
buildConfig = true
}
composeCompiler {
featureFlags = setOf(
ComposeFeatureFlag.OptimizeNonSkippingGroups
)
includeSourceInformation = true
}
packaging {
resources {
excludes += "/META-INF/{AL2.0,LGPL2.1}"
}
}
room {
schemaDirectory("$projectDir/schemas/")
}
dependenciesInfo {
// Disables dependency metadata when building APKs.
includeInApk = false
}
flavorDimensions += listOf("abi")
productFlavors {
create("arm64-v8a") {
dimension = "abi"
versionCode = 4 + (android.defaultConfig.versionCode ?: 0) * 10
ndk.abiFilters.add("arm64-v8a")
}
create("armeabi-v7a") {
dimension = "abi"
versionCode = 3 + (android.defaultConfig.versionCode ?: 0) * 10
ndk.abiFilters.add("armeabi-v7a")
}
create("x86_64") {
dimension = "abi"
versionCode = 2 + (android.defaultConfig.versionCode ?: 0) * 10
ndk.abiFilters.add("x86_64")
}
create("x86") {
dimension = "abi"
versionCode = 1 + (android.defaultConfig.versionCode ?: 0) * 10
ndk.abiFilters.add("x86")
}
create("universal") {
dimension = "abi"
versionCode = 0 + (android.defaultConfig.versionCode ?: 0) * 10
ndk.abiFilters.addAll(listOf("x86", "x86_64", "armeabi-v7a", "arm64-v8a"))
}
}
applicationVariants.all {
outputs.forEach { output ->
(output as BaseVariantOutputImpl).outputFileName =
"Gallery-${versionName}-$versionCode-${productFlavors[0].name}" + mapsApiApplicationPrefix + ".apk"
}
}
}
dependencies {
runtimeOnly(libs.androidx.profileinstaller)
implementation(project(":libs:cropper"))
"baselineProfile"(project(mapOf("path" to ":baselineprofile")))
// Core
implementation(libs.androidx.core.ktx)
implementation(libs.androidx.appcompat)
// Core - Lifecycle
implementation(libs.androidx.lifecycle.runtime.ktx)
implementation(libs.compose.lifecycle.runtime)
// Compose
implementation(libs.compose.activity)
implementation(libs.compose.ui)
implementation(libs.compose.ui.graphics)
implementation(libs.compose.ui.tooling.preview)
implementation(libs.compose.material.icons.extended)
implementation(libs.androidx.graphics.shapes)
// Compose - Shimmer
implementation(libs.compose.shimmer)
// Compose - Material3
implementation(libs.compose.material3)
implementation(libs.compose.material3.window.size)
implementation(libs.androidx.adaptive)
implementation(libs.androidx.adaptive.layout)
implementation(libs.androidx.adaptive.navigation)
// Compose - Accompanists
implementation(libs.accompanist.permissions)
implementation(libs.androidx.navigation.compose)
implementation(libs.accompanist.drawablepainter)
// Android MDC - Material
implementation(libs.material)
// Kotlin - Coroutines
implementation(libs.kotlinx.coroutines.core)
runtimeOnly(libs.kotlinx.coroutines.android)
implementation(libs.kotlinx.serialization.json)
// Dagger - Hilt
implementation(libs.androidx.hilt.navigation.compose)
implementation(libs.dagger.hilt)
implementation(libs.androidx.hilt.common)
implementation(libs.androidx.hilt.work)
ksp(libs.dagger.hilt.compiler)
ksp(libs.androidx.hilt.compiler)
// Room
implementation(libs.room.runtime)
ksp(libs.room.compiler)
// Kotlin Extensions and Coroutines support for Room
implementation(libs.room.ktx)
// Coil
implementation(libs.jxl.coder.coil)
implementation(libs.avif.coder.coil)
// Sketch
implementation(libs.sketch.compose)
implementation(libs.sketch.view)
implementation(libs.sketch.animated.gif)
implementation(libs.sketch.animated.heif)
implementation(libs.sketch.animated.webp)
implementation(libs.sketch.extensions.compose)
implementation(libs.sketch.http.ktor)
implementation(libs.sketch.svg)
implementation(libs.sketch.video)
// Exo Player
implementation(libs.androidx.media3.exoplayer)
implementation(libs.androidx.media3.ui)
implementation(libs.androidx.media3.session)
implementation(libs.androidx.media3.exoplayer.dash)
implementation(libs.androidx.media3.exoplayer.hls)
implementation(libs.compose.video)
// Exif Interface
implementation(libs.androidx.exifinterface)
// Datastore Preferences
implementation(libs.datastore.prefs)
// Fuzzy Search
implementation(libs.fuzzywuzzy)
// Aire
implementation(libs.aire)
// Pinch to zoom
implementation(libs.pinchzoomgrid)
// Subsampling
implementation(libs.zoomimage.sketch)
// Splashscreen
implementation(libs.androidx.core.splashscreen)
// Jetpack Security
implementation(libs.androidx.security.crypto)
implementation(libs.androidx.biometric)
// Composables - Core
implementation(libs.core)
// Worker
implementation(libs.androidx.work.runtime.ktx)
// Composable - Scrollbar
implementation(libs.lazycolumnscrollbar)
// TensorFlow Lite
implementation(libs.tensorflow.lite)
implementation(libs.tensorflow.lite.task.vision)
implementation(libs.tensorflow.lite.gpu)
// Tests
testImplementation(libs.junit)
androidTestImplementation(libs.androidx.test.ext.junit)
debugImplementation(libs.compose.ui.tooling)
debugRuntimeOnly(libs.compose.ui.test.manifest)
}
val mapsApiApplicationPrefix: String
get() = if (getApiKey() == "\"DEBUG\"") {
"-nomaps"
} else {
""
}
fun getApiKey(): String {
val fl = rootProject.file("api.properties")
return try {
val properties = Properties()
properties.load(FileInputStream(fl))
properties.getProperty("MAPS_TOKEN")
} catch (e: Exception) {
"\"DEBUG\""
}
}
val allowAllFilesAccess: String
get() {
val fl = rootProject.file("app.properties")
return try {
val properties = Properties()
properties.load(FileInputStream(fl))
properties.getProperty("ALL_FILES_ACCESS")
} catch (e: Exception) {
"true"
}
}
@Suppress("UnstableApiUsage")
val gitHeadVersion: String
get() {
return providers.exec {
commandLine("git", "show", "-s", "--format=%h", "HEAD")
}.standardOutput.asText.get().trim()
}