All checks were successful
Build TV app / build (push) Successful in 2m55s
Issue #1's fix gave accepted sockets a read deadline so idle connections could no longer pin threads — but NanoHTTPD's 5 s default also applies to the long-lived WebSocket, and pings only ran every 8 s. The remote was therefore dropped roughly five seconds into every session, right after a command or two, with no close frame. The deadline stays (that was the point) but is now 40 s, comfortably above the ping interval, so pongs keep an active session alive while a truly idle socket still gets reaped. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
107 lines
3.3 KiB
Kotlin
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 = 35
|
|
versionName = "0.11.2"
|
|
}
|
|
|
|
// 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)
|
|
}
|