Le nom change, et pas seulement à l'écran : identifiant d'application, paquet Kotlin, dépôt et dossier d'enregistrements suivent, pour qu'il ne subsiste pas deux noms selon l'endroit où l'on regarde. Android traite le nouvel identifiant comme une application distincte : une installation en 1.5.0 ne se mettra pas à jour seule et devra être remplacée. C'est le prix d'un renommage complet, assumé plutôt que contourné. Les enregistrements déjà faits ne sont pas perdus, étant dans le stockage partagé, et le scan continue d'écarter l'ancien dossier pour ne pas les compter deux fois. L'icône fournie est détournée de son fond blanc avant d'être déclinée : posée telle quelle, le masque du système aurait redécoupé un badge qui l'est déjà et laissé du blanc sur les bords. La couleur de fond est échantillonnée dans l'image, non choisie au jugé. La page À propos dit enfin ce que l'application fait, ce qu'elle garantit, avec quoi elle est construite et qui en répond. Sa version vient du manifeste et son journal du CHANGELOG du dépôt : ni l'un ni l'autre ne peut dériver. La licence n'étant pas déclarée, la pastille le signale en rouge au lieu d'en inventer une.
115 lines
4.3 KiB
Kotlin
115 lines
4.3 KiB
Kotlin
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<Copy>("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")
|
|
}
|