Files
castarr/app/build.gradle.kts
be-nj 7ad7f5172e
Some checks failed
Build TV app / build (push) Failing after 2s
Club shortcut: a rail group for "where is my club on tonight"
Adds an optional rail entry per club that lists every channel whose EPG
mentions the club within the next three hours, with the matching kick-off
instead of the usual Now/Next. Only sport and free-to-air groups are
scanned (NFL excluded), so the scan stays cheap and quiet.

Which clubs appear is a per-TV setting: the signed-in viewer's own club is
on by default, and every club can be switched on or off under Einstellungen
-> Vereinsmenüs, so a household can follow more than one.

Crests are trademarks, so the icon is a plain shield in the club colours.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-26 02:47:06 +02:00

107 lines
3.3 KiB
Kotlin

plugins {
id("com.android.application")
id("org.jetbrains.kotlin.android")
id("org.jetbrains.kotlin.plugin.compose")
}
android {
namespace = "dev.castarr.tv"
compileSdk = 35
defaultConfig {
applicationId = "dev.castarr.tv"
minSdk = 26
targetSdk = 35
versionCode = 26
versionName = "0.10.0"
}
// Release signing from environment (see ~/.keys/castarr-release.env on the
// build host); unsigned release build when unset.
val storeFileEnv = System.getenv("CASTARR_STORE_FILE")
if (storeFileEnv != null) {
signingConfigs {
create("release") {
storeFile = file(storeFileEnv)
storePassword = System.getenv("CASTARR_STORE_PASSWORD")
keyAlias = System.getenv("CASTARR_KEY_ALIAS")
keyPassword = System.getenv("CASTARR_STORE_PASSWORD")
}
}
}
buildTypes {
release {
isMinifyEnabled = true
proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro")
if (storeFileEnv != null) {
signingConfig = signingConfigs.getByName("release")
}
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = "17"
allWarningsAsErrors = true
}
// Global layout rule: everything test-related lives under tests/.
sourceSets {
getByName("test") {
java.setSrcDirs(listOf("../tests/unit"))
}
}
testOptions {
unitTests.all {
it.reports.junitXml.outputLocation.set(file("../tests/runs/junit"))
it.reports.html.outputLocation.set(file("../tests/runs/junit-html"))
}
}
buildFeatures {
compose = true
buildConfig = true
}
lint {
// Media3's UI classes are @UnstableApi; the opt-in lint check would
// otherwise fail release builds.
disable += "UnsafeOptInUsageError"
}
}
dependencies {
implementation("androidx.core:core-ktx:1.15.0")
implementation(platform("androidx.compose:compose-bom:2024.10.01"))
implementation("androidx.activity:activity-compose:1.9.3")
implementation("androidx.compose.ui:ui")
implementation("androidx.compose.foundation:foundation")
implementation("androidx.tv:tv-material:1.0.0")
implementation("androidx.compose.material3:material3")
implementation("androidx.lifecycle:lifecycle-runtime-compose:2.8.7")
implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.8.7")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.9.0")
implementation("androidx.media3:media3-exoplayer:1.4.1")
implementation("androidx.media3:media3-exoplayer-hls:1.4.1")
implementation("androidx.media3:media3-ui:1.4.1")
implementation("androidx.media3:media3-session:1.4.1")
implementation("org.nanohttpd:nanohttpd:2.3.1")
implementation("org.nanohttpd:nanohttpd-websocket:2.3.1")
implementation("com.google.zxing:core:3.5.3")
implementation("io.coil-kt:coil-compose:2.7.0")
testImplementation("junit:junit:4.13.2")
}
// Full JDK for javac via toolchain (host may only have a JRE); resolved by
// the foojay convention plugin in settings.
kotlin {
jvmToolchain(17)
}