Files
castarr/app/build.gradle.kts
be-nj b0b8f8801d
All checks were successful
Build TV app / build (push) Successful in 4m39s
Stop throwing out honest remotes, and mirror club menus to the phone
The rate limit charged every hello, not just failed ones. The phone remote
reconnects on any network hiccup, so five reconnects in a minute — entirely
normal — got it kicked with "zu viele Versuche". Only failed authentication
costs budget now, and a success clears the address.

The club menus existed only on the TV. The phone now receives them and
shows a chip per club next to Alle/Favoriten, listing the matching channels
with kick-off time instead of the usual now/next.

Settings: the club row showed an "An" pill although it can only ever
remove, which read like a toggle. It is a remove icon now.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-26 10:25:22 +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 = 34
versionName = "0.11.1"
}
// 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)
}