/**
 * This file was created using the `create_project.py` script located in the
 * `<AndroidX root>/development/project-creator` directory.
 *
 * Please use that script when creating a new project, rather than copying an existing project and
 * modifying its settings.
 */
import androidx.build.LibraryType

plugins {
    id("AndroidXPlugin")
    id("com.android.library")
    id("kotlin-android")
    id("androidx.stableaidl")
}

dependencies {
    // Atomically versioned.
    constraints {
        implementation(project(":core:core-ktx"))
        implementation(project(":core:core-testing"))
    }

    api("androidx.annotation:annotation:1.8.0")
    api("androidx.annotation:annotation-experimental:1.4.0")
    api("androidx.lifecycle:lifecycle-runtime:2.6.2")
    api("androidx.versionedparcelable:versionedparcelable:1.1.1")
    implementation("androidx.collection:collection:1.0.0")
    implementation("androidx.concurrent:concurrent-futures:1.0.0")
    implementation("androidx.interpolator:interpolator:1.0.0")

    api(libs.kotlinStdlib)

    // We don't ship this as a public artifact, so it must remain a project-type dependency.
    annotationProcessor(projectOrArtifact(":versionedparcelable:versionedparcelable-compiler"))

    androidTestImplementation(libs.junit)
    androidTestImplementation(libs.kotlinStdlib)
    androidTestImplementation(libs.testExtJunit)
    androidTestImplementation(libs.testCore)
    androidTestImplementation(libs.testRunner)
    androidTestImplementation(libs.testRules)
    androidTestImplementation(libs.truth)
    androidTestImplementation(libs.espressoCore, excludes.espresso)
    androidTestImplementation(libs.mockitoCore, excludes.bytebuddy) // DexMaker has it"s own MockMaker
    androidTestImplementation(libs.testUiautomator)

    androidTestImplementation("androidx.lifecycle:lifecycle-runtime-testing:2.6.2")

    // Including both dexmakers allows support for all API levels plus final mocking support on
    // API 28+. The implementation is swapped based on the finality of the mock type. This
    // delegation is handled manually inside androidx.core.util.mockito.CustomMockMaker.
    androidTestImplementation(libs.dexmakerMockito, excludes.bytebuddy) // DexMaker has it"s own MockMaker
    androidTestImplementation(libs.dexmakerMockitoInline, excludes.bytebuddy) // DexMaker has it"s own MockMaker
    androidTestImplementation("androidx.appcompat:appcompat:1.1.0") {
        exclude group: "androidx.core", module: "core"
    }
    androidTestImplementation(project(":internal-testutils-runtime"), {
        exclude group: "androidx.core", module: "core"
    })
    androidTestImplementation(project(":internal-testutils-lifecycle"))
    androidTestImplementation(project(":internal-testutils-fonts"))
    androidTestImplementation(project(":internal-testutils-mockito"))

    testImplementation(libs.junit)
    testImplementation(libs.testExtJunit)
    testImplementation(libs.testCore)
    testImplementation(libs.testRunner)
    testImplementation(libs.truth)
    testImplementation(libs.robolectric)
}

android {
    buildFeatures {
        aidl = true
    }
    testOptions.unitTests.includeAndroidResources = true
    aaptOptions {
        noCompress "ttf"
    }
    buildTypes.configureEach {
        consumerProguardFiles "proguard-rules.pro"

        stableAidl {
            version 1
        }
    }

    packagingOptions {
        // Drop the file from external dependencies, preferring the local file inside androidTest
        pickFirsts = [
                "mockito-extensions/org.mockito.plugins.MockMaker",
                "mockito-extensions/org.mockito.plugins.StackTraceCleanerProvider"
        ]
    }
    namespace "androidx.core"
}

androidx {
    name = "Core"
    type = LibraryType.PUBLISHED_LIBRARY
    mavenVersion = LibraryVersions.CORE
    inceptionYear = "2015"
    description = "Provides backward-compatible implementations of Android platform APIs and " +
            "features."
    failOnDeprecationWarnings = false
    metalavaK2UastEnabled = true
    legacyDisableKotlinStrictApiMode = true
}
