[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" }