Deux bugs signalés à l'usage, et la distribution hors magasin qui manquait. LibriVox ne renvoyait jamais rien : l'API cherche les titres en correspondance exacte sauf préfixe « ^ », et les auteurs sur le seul nom de famille. Les trois critères sont interrogés en parallèle et dédoublonnés, et un 404 « aucun résultat » n'est plus confondu avec une panne. Les téléchargements Internet Archive échouaient pour trois raisons distinctes : éléments en accès restreint répondant 401, filtre limité aux seuls .mp3/.mp4, et choix du premier fichier plutôt que du plus petit dérivé. La taille de chaque résultat est désormais affichée avant sélection, ce qui distingue une chanson d'une émission de 500 Mo. L'application étant distribuée hors magasin, elle surveille elle-même les releases du dépôt, télécharge l'APK en Wi-Fi et propose l'installation, qui reste un geste de l'utilisateur comme Android l'impose.
108 lines
4.0 KiB
Kotlin
108 lines
4.0 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.cachette"
|
|
compileSdk = 36
|
|
|
|
defaultConfig {
|
|
applicationId = "fr.tuxgyver.cachette"
|
|
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/Cachette\"")
|
|
}
|
|
|
|
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}"
|
|
}
|
|
}
|
|
}
|
|
|
|
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")
|
|
}
|