Movies Database

Module Dependencies

Now we need to tell the modules how they depend on each other.

flowchart LR
    subgraph User Interface Layer
    ui[Module: app\n]
    end
    ui --> repo
    subgraph Data Layer
    repo[Module: repository]
    ds[Module: data]
    repo --> ds
    end

We set up these dependencies by using implementation project(":xyz") in our dependencies.

  • Add the data module as a dependency in the repository module
  • Add the repository module as a dependency in the app module
show in full file repository/build.gradle.kts
// ...

dependencies {
    implementation(project(":data"))

    implementation(libs.androidx.core.ktx)
    // ...
}
show in full file app/build.gradle.kts
// ...

dependencies {
    implementation(project(":repository"))

    implementation(libs.androidx.core.ktx)
    // ...
}

Dependencies can be specified as implementation dependencies or api dependencies.

Implementation dependencies are only available within the module that declares them. API dependencies become part of the API of the current module and are made available to any module that depends on the current module.

Normally, you should choose the implementation dependency type so modules can hide their implementation dependencies. This also improves build speed, as changes to implementation dependencies are not inherited, and won't trigger a rebuild of modules that depend on the current module.


All code changes

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

android { namespace = "com.androidbyexample.compose.movies" compileSdk = libs.versions.compileSdk.get().toInt() defaultConfig { applicationId = "com.androidbyexample.compose.movies" minSdk = libs.versions.minSdk.get().toInt() targetSdk = libs.versions.targetSdk.get().toInt()
versionCode = 1 versionName = "1.0" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { isMinifyEnabled = false proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" ) } }
compileOptions { sourceCompatibility = JavaVersion.valueOf(libs.versions.javaVersion.get()) targetCompatibility = JavaVersion.valueOf(libs.versions.javaVersion.get()) } kotlinOptions { jvmTarget = libs.versions.jvmTarget.get() }
buildFeatures { compose = true } } dependencies {
implementation(project(":repository"))
implementation(libs.androidx.core.ktx) implementation(libs.androidx.lifecycle.runtime.ktx) implementation(libs.androidx.activity.compose) implementation(platform(libs.androidx.compose.bom)) implementation(libs.androidx.ui) implementation(libs.androidx.ui.graphics) implementation(libs.androidx.ui.tooling.preview) implementation(libs.androidx.material3) testImplementation(libs.junit) androidTestImplementation(libs.androidx.junit) androidTestImplementation(libs.androidx.espresso.core) androidTestImplementation(platform(libs.androidx.compose.bom)) androidTestImplementation(libs.androidx.ui.test.junit4) debugImplementation(libs.androidx.ui.tooling) debugImplementation(libs.androidx.ui.test.manifest) }
CHANGED: repository/build.gradle.kts
plugins {
    alias(libs.plugins.android.library)
    alias(libs.plugins.kotlin.android)
}

android {
    namespace = "com.androidbyexample.compose.movies.repository"
    compileSdk = libs.versions.compileSdk.get().toInt()

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

        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
        consumerProguardFiles("consumer-rules.pro")
    }

    buildTypes {
        release {
            isMinifyEnabled = false
            proguardFiles(
                getDefaultProguardFile("proguard-android-optimize.txt"),
                "proguard-rules.pro"
            )
        }
    }
    compileOptions {
        sourceCompatibility = JavaVersion.valueOf(libs.versions.javaVersion.get())
        targetCompatibility = JavaVersion.valueOf(libs.versions.javaVersion.get())
    }
    kotlinOptions {
        jvmTarget = libs.versions.jvmTarget.get()
    }
}

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