import java.util.Properties plugins { id("com.android.application") id("org.jetbrains.kotlin.android") id("org.jetbrains.kotlin.plugin.compose") id("org.jetbrains.kotlin.plugin.serialization") } android { namespace = "fr.tuxgyver.noxely" compileSdk = 36 defaultConfig { applicationId = "fr.tuxgyver.noxely" minSdk = 26 targetSdk = 35 // Le fichier VERSION est la seule source de vérité : le Makefile et la publication // Gitea lisent le même, et versionCode s'en déduit pour rester monotone. val appVersion = rootProject.file("VERSION").readText().trim() val (major, minor, patch) = appVersion.split(".").map(String::toInt) versionName = appVersion versionCode = major * 10000 + minor * 100 + patch // Le dépôt de publication est privé : la vérification des mises à jour a besoin d'un // jeton en lecture seule, lu depuis un fichier local ignoré par git, jamais codé en dur. val updateTokenFile = rootProject.file("update-token.properties") val updateToken = if (updateTokenFile.exists()) { Properties().apply { updateTokenFile.inputStream().use { load(it) } } .getProperty("giteaUpdateToken", "") } else { "" } buildConfigField("String", "GITEA_UPDATE_TOKEN", "\"$updateToken\"") buildConfigField("String", "UPDATE_API", "\"https://git.tuxtech.fr/api/v1/repos/tuxgyver/Noxely\"") } buildTypes { release { isMinifyEnabled = false proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") val keystore = rootProject.file("keystore.properties") if (keystore.exists()) { val props = Properties().apply { keystore.inputStream().use { load(it) } } signingConfig = signingConfigs.create("release") { storeFile = rootProject.file(props.getProperty("storeFile")) storePassword = props.getProperty("storePassword") keyAlias = props.getProperty("keyAlias") keyPassword = props.getProperty("keyPassword") enableV2Signing = true enableV3Signing = true } } } } compileOptions { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 } kotlinOptions { jvmTarget = "17" } buildFeatures { compose = true buildConfig = true } packaging { resources { excludes += "/META-INF/{AL2.0,LGPL2.1}" } } } /** Le journal affiché dans « À propos » est celui du dépôt, pas une copie qui dériverait. */ val copyChangelog = tasks.register("copyChangelogToAssets") { from(rootProject.file("CHANGELOG.md")) into(layout.projectDirectory.dir("src/main/assets")) } tasks.named("preBuild") { dependsOn(copyChangelog) } dependencies { implementation(platform("androidx.compose:compose-bom:2025.10.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("androidx.compose.material:material-icons-extended") debugImplementation("androidx.compose.ui:ui-tooling") implementation("androidx.core:core-ktx:1.15.0") implementation("androidx.activity:activity-compose:1.9.3") implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.8.7") implementation("androidx.lifecycle:lifecycle-viewmodel-compose:2.8.7") implementation("androidx.lifecycle:lifecycle-runtime-compose:2.8.7") implementation("androidx.navigation:navigation-compose:2.8.4") // Lecture, session média et cache hors connexion. implementation("androidx.media3:media3-exoplayer:1.11.1") implementation("androidx.media3:media3-session:1.11.1") implementation("androidx.media3:media3-ui:1.11.1") implementation("androidx.media3:media3-exoplayer-workmanager:1.11.1") implementation("androidx.work:work-runtime-ktx:2.10.0") implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3") implementation("io.coil-kt:coil-compose:2.7.0") testImplementation("junit:junit:4.13.2") }