Movies Database

Add Android SDK and JDK to version catalog

Each of the modules contains its own build.gradle.kts. There are several versions listed in these modules, and it's a good idea to keep them in sync. To do this, we'll add them to our version catalog and reference them in the build scripts.

First, we add the versions we want to use to the version catalog.

We can do something similar for the Java versions

show in full file gradle/libs.versions.toml
[versions]
// ...
ksp = "2.3.9"

compileSdk = "37"
targetSdk = "37"
minSdk = "24"

javaVersion = "VERSION_11"

[libraries]
// ...
[plugins]
// ...

Now we replace the hardcoded versions in app/build.gradle.kts, data/build.gradle.kts, and repository/build.gradle.kts. The changes in all three files will look the same.

show in full file app/build.gradle.kts
// ...
android {
    namespace = "com.androidbyexample.movies"
    compileSdk {
//      version = release(37)
        version = release((libs.versions.compileSdk.get().toInt()))
    }

    defaultConfig {
        applicationId = "com.androidbyexample.movies"
//      minSdk = 24
//      targetSdk = 37
        minSdk = libs.versions.minSdk.get().toInt()
        targetSdk = libs.versions.targetSdk.get().toInt()
        versionCode = 1
        versionName = "1.0"

        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
    }
    // ...
    }
    compileOptions {
//      sourceCompatibility = JavaVersion.VERSION_11
//      targetCompatibility = JavaVersion.VERSION_11
        sourceCompatibility = JavaVersion.valueOf(libs.versions.javaVersion.get())
        targetCompatibility = JavaVersion.valueOf(libs.versions.javaVersion.get())
    }
    buildFeatures {
        // ...
}
// ...

This helps ensure consistency and reduce maintenance burden over time.

At this point, nothing will visibly change in the application, but it should still build and run.


All code changes

CHANGED: app/build.gradle.kts
plugins {
    alias(libs.plugins.android.application)
    alias(libs.plugins.kotlin.compose)
    id("kotlin-parcelize")
}

android {
    namespace = "com.androidbyexample.movies"
compileSdk { // version = release(37) version = release((libs.versions.compileSdk.get().toInt())) } defaultConfig { applicationId = "com.androidbyexample.movies" // minSdk = 24 // targetSdk = 37 minSdk = libs.versions.minSdk.get().toInt() targetSdk = libs.versions.targetSdk.get().toInt() versionCode = 1 versionName = "1.0" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" }
buildTypes { release { optimization { enable = false } } }
compileOptions { // sourceCompatibility = JavaVersion.VERSION_11 // targetCompatibility = JavaVersion.VERSION_11 sourceCompatibility = JavaVersion.valueOf(libs.versions.javaVersion.get()) targetCompatibility = JavaVersion.valueOf(libs.versions.javaVersion.get()) }
buildFeatures { compose = true } } dependencies {
implementation(libs.androidx.navigation3.ui) implementation(libs.androidx.navigation3.runtime) implementation(libs.androidx.material3.adaptive.navigation3)
implementation(platform(libs.androidx.compose.bom)) implementation(libs.androidx.activity.compose) implementation(libs.androidx.compose.material3) implementation(libs.androidx.compose.ui) implementation(libs.androidx.compose.ui.graphics) implementation(libs.androidx.compose.ui.tooling.preview) implementation(libs.androidx.core.ktx) implementation(libs.androidx.lifecycle.runtime.ktx) testImplementation(libs.junit) androidTestImplementation(platform(libs.androidx.compose.bom)) androidTestImplementation(libs.androidx.compose.ui.test.junit4) androidTestImplementation(libs.androidx.espresso.core) androidTestImplementation(libs.androidx.junit) debugImplementation(libs.androidx.compose.ui.test.manifest) debugImplementation(libs.androidx.compose.ui.tooling) }
CHANGED: data/build.gradle.kts
plugins {
    alias(libs.plugins.android.library)
alias(libs.plugins.ksp)
} android { namespace = "com.androidbyexample.movies.data" compileSdk { // version = release(37) version = release(libs.versions.compileSdk.get().toInt()) } defaultConfig { // minSdk = 24 minSdk = libs.versions.minSdk.get().toInt() testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles("consumer-rules.pro") } compileOptions { // sourceCompatibility = JavaVersion.VERSION_11 // targetCompatibility = JavaVersion.VERSION_11 sourceCompatibility = JavaVersion.valueOf(libs.versions.javaVersion.get()) targetCompatibility = JavaVersion.valueOf(libs.versions.javaVersion.get()) } } dependencies {
implementation(libs.room.runtime) implementation(libs.room.ktx) ksp(libs.room.compiler)
implementation(libs.androidx.appcompat) implementation(libs.androidx.core.ktx) implementation(libs.material) testImplementation(libs.junit) androidTestImplementation(libs.androidx.espresso.core) androidTestImplementation(libs.androidx.junit) }
CHANGED: gradle/libs.versions.toml
[versions]
agp = "9.2.1"
coreKtx = "1.19.0"
junit = "4.13.2"
junitVersion = "1.3.0"
espressoCore = "3.7.0"
lifecycleRuntimeKtx = "2.11.0"
activityCompose = "1.13.0"
kotlin = "2.4.0"
composeBom = "2026.06.01"
navigation = "1.1.4"
material3AdaptiveNav3 = "1.3.0-rc01"
appcompat = "1.7.1"
material = "1.14.0"

room = "2.8.4" ksp = "2.3.9"
compileSdk = "37" targetSdk = "37" minSdk = "24" javaVersion = "VERSION_11"
[libraries] androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } junit = { group = "junit", name = "junit", version.ref = "junit" } androidx-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junitVersion" } androidx-espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espressoCore" } androidx-lifecycle-runtime-ktx = { group = "androidx.lifecycle", name = "lifecycle-runtime-ktx", version.ref = "lifecycleRuntimeKtx" } androidx-activity-compose = { group = "androidx.activity", name = "activity-compose", version.ref = "activityCompose" } androidx-compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "composeBom" } androidx-compose-ui = { group = "androidx.compose.ui", name = "ui" } androidx-compose-ui-graphics = { group = "androidx.compose.ui", name = "ui-graphics" } androidx-compose-ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling" } androidx-compose-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview" } androidx-compose-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" } androidx-compose-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4" } androidx-compose-material3 = { group = "androidx.compose.material3", name = "material3" } androidx-navigation3-runtime = { module = "androidx.navigation3:navigation3-runtime", version.ref = "navigation" } androidx-navigation3-ui = { module = "androidx.navigation3:navigation3-ui", version.ref = "navigation" } androidx-material3-adaptive-navigation3 = { group = "androidx.compose.material3.adaptive", name = "adaptive-navigation3", version.ref = "material3AdaptiveNav3" } androidx-appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" } material = { group = "com.google.android.material", name = "material", version.ref = "material" }
room-runtime = { group = "androidx.room", name = "room-runtime", version.ref = "room" } room-ktx = { group = "androidx.room", name = "room-ktx", version.ref = "room" } room-compiler = { group = "androidx.room", name = "room-compiler", version.ref = "room" }
[plugins] android-application = { id = "com.android.application", version.ref = "agp" } kotlin-compose = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } android-library = { id = "com.android.library", version.ref = "agp" }
ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" }
CHANGED: repository/build.gradle.kts
plugins {
    alias(libs.plugins.android.library)
}

android {
    namespace = "com.androidbyexample.movies.repository"
    compileSdk {
//      version = release(37)
        version = release(libs.versions.compileSdk.get().toInt())
    }

    defaultConfig {
//      minSdk = 24
        minSdk = libs.versions.minSdk.get().toInt()

        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
        consumerProguardFiles("consumer-rules.pro")
    }
    compileOptions {
//      sourceCompatibility = JavaVersion.VERSION_11
//      targetCompatibility = JavaVersion.VERSION_11
        sourceCompatibility = JavaVersion.valueOf(libs.versions.javaVersion.get())
        targetCompatibility = JavaVersion.valueOf(libs.versions.javaVersion.get())
    }

}

dependencies {
    implementation(libs.androidx.appcompat)
    implementation(libs.androidx.core.ktx)
    implementation(libs.material)
    testImplementation(libs.junit)
    androidTestImplementation(libs.androidx.espresso.core)
    androidTestImplementation(libs.androidx.junit)
}