libs.versions.toml
[versions]
# Toolchain — bump as new stable releases land and re-sync.
agp = "8.7.3"
kotlin = "2.0.21"
ksp = "2.0.21-1.0.28"
hilt = "2.52"
compileSdk = "35"
minSdk = "26"
targetSdk = "35"
# AndroidX / Compose
coreKtx = "1.15.0"
appcompat = "1.7.0"
lifecycle = "2.8.7"
activityCompose = "1.9.3"
composeBom = "2024.11.00"
tvFoundation = "1.0.0-alpha11"
tvMaterial = "1.0.0"
navigationCompose = "2.8.4"
hiltNavigationCompose = "1.2.0"
media3 = "1.5.0"
room = "2.6.1"
datastore = "1.1.1"
# UPnP — jUPnP 3.0.3 (maintained fork of the abandoned Cling project).
# Published to Maven Central, unlike Cling. Requires Jetty 9.4.x for its HTTP transport
# (jUPnP's AndroidUpnpServiceConfiguration pins the AsyncServletStreamServer built on Jetty);
# we pin 9.4.48 because that's what jupnp upstream builds/tests against, and we're on minSdk 26
# so the 9.4.14 ceiling older projects hit for minSdk 21 doesn't apply.
jupnp = "3.0.3"
jetty = "9.4.48.v20220622"
slf4j = "2.0.16"
# Image loading + HTTP + kotlinx
coil = "3.0.2"
okhttp = "4.12.0"
kotlinxCoroutines = "1.9.0"
kotlinxSerialization = "1.7.3"
# Cast (play flavor only)
castFramework = "22.1.0"
mediaRouter = "1.7.0"
carApp = "1.7.0-rc01"
androidxMedia = "1.7.0"
[libraries]
androidx-core-ktx = { module = "androidx.core:core-ktx", version.ref = "coreKtx" }
androidx-appcompat = { module = "androidx.appcompat:appcompat", version.ref = "appcompat" }
androidx-lifecycle-runtime-ktx = { module = "androidx.lifecycle:lifecycle-runtime-ktx", version.ref = "lifecycle" }
androidx-lifecycle-viewmodel-compose = { module = "androidx.lifecycle:lifecycle-viewmodel-compose", version.ref = "lifecycle" }
androidx-activity-compose = { module = "androidx.activity:activity-compose", version.ref = "activityCompose" }
compose-bom = { module = "androidx.compose:compose-bom", version.ref = "composeBom" }
compose-ui = { module = "androidx.compose.ui:ui" }
compose-ui-graphics = { module = "androidx.compose.ui:ui-graphics" }
compose-ui-tooling-preview = { module = "androidx.compose.ui:ui-tooling-preview" }
compose-ui-tooling = { module = "androidx.compose.ui:ui-tooling" }
compose-material3 = { module = "androidx.compose.material3:material3" }
compose-material-icons-extended = { module = "androidx.compose.material:material-icons-extended" }
androidx-tv-foundation = { module = "androidx.tv:tv-foundation", version.ref = "tvFoundation" }
androidx-tv-material = { module = "androidx.tv:tv-material", version.ref = "tvMaterial" }
androidx-navigation-compose = { module = "androidx.navigation:navigation-compose", version.ref = "navigationCompose" }
androidx-hilt-navigation-compose = { module = "androidx.hilt:hilt-navigation-compose", version.ref = "hiltNavigationCompose" }
hilt-android = { module = "com.google.dagger:hilt-android", version.ref = "hilt" }
hilt-compiler = { module = "com.google.dagger:hilt-android-compiler", version.ref = "hilt" }
media3-exoplayer = { module = "androidx.media3:media3-exoplayer", version.ref = "media3" }
media3-session = { module = "androidx.media3:media3-session", version.ref = "media3" }
media3-ui = { module = "androidx.media3:media3-ui", version.ref = "media3" }
media3-datasource-okhttp = { module = "androidx.media3:media3-datasource-okhttp", version.ref = "media3" }
room-runtime = { module = "androidx.room:room-runtime", version.ref = "room" }
room-ktx = { module = "androidx.room:room-ktx", version.ref = "room" }
room-compiler = { module = "androidx.room:room-compiler", version.ref = "room" }
datastore-preferences = { module = "androidx.datastore:datastore-preferences", version.ref = "datastore" }
jupnp-core = { module = "org.jupnp:org.jupnp", version.ref = "jupnp" }
jupnp-support = { module = "org.jupnp:org.jupnp.support", version.ref = "jupnp" }
jupnp-android = { module = "org.jupnp:org.jupnp.android", version.ref = "jupnp" }
jetty-server = { module = "org.eclipse.jetty:jetty-server", version.ref = "jetty" }
jetty-servlet = { module = "org.eclipse.jetty:jetty-servlet", version.ref = "jetty" }
jetty-client = { module = "org.eclipse.jetty:jetty-client", version.ref = "jetty" }
# jUPnP logs through SLF4J; slf4j-jdk14 routes to java.util.logging which Android does implement,
# so logs surface via logcat without extra config.
slf4j-api = { module = "org.slf4j:slf4j-api", version.ref = "slf4j" }
slf4j-jdk14 = { module = "org.slf4j:slf4j-jdk14", version.ref = "slf4j" }
coil-compose = { module = "io.coil-kt.coil3:coil-compose", version.ref = "coil" }
coil-network-okhttp = { module = "io.coil-kt.coil3:coil-network-okhttp", version.ref = "coil" }
coil-gif = { module = "io.coil-kt.coil3:coil-gif", version.ref = "coil" }
okhttp = { module = "com.squareup.okhttp3:okhttp", version.ref = "okhttp" }
kotlinx-coroutines-android = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-android", version.ref = "kotlinxCoroutines" }
kotlinx-serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "kotlinxSerialization" }
# Cast — play flavor only. Referenced from the play sourceSet's dependencies block.
play-services-cast-framework = { module = "com.google.android.gms:play-services-cast-framework", version.ref = "castFramework" }
androidx-mediarouter = { module = "androidx.mediarouter:mediarouter", version.ref = "mediaRouter" }
androidx-car-app = { module = "androidx.car.app:app", version.ref = "carApp" }
androidx-media = { module = "androidx.media:media", version.ref = "androidxMedia" }
[plugins]
android-application = { id = "com.android.application", version.ref = "agp" }
kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
kotlin-compose = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" }
kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" }
ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" }
hilt = { id = "com.google.dagger.hilt.android", version.ref = "hilt" }