/*
 * Copyright 2019 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/**
 * 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.SoftwareType

plugins {
    id("AndroidXPlugin")
    id("com.android.library")
    id("org.jetbrains.kotlin.android")
}

dependencies {
    api(libs.jspecify)
    api("androidx.lifecycle:lifecycle-common:2.1.0")
    api(libs.guavaListenableFuture)
    api(project(":camera:camera-core"))
    implementation("androidx.core:core:1.1.0")
    implementation(libs.autoValueAnnotations)
    implementation(libs.kotlinCoroutinesAndroid)
    implementation("androidx.concurrent:concurrent-futures-ktx:1.1.0")
    implementation("androidx.tracing:tracing-ktx:1.2.0")
    implementation("androidx.annotation:annotation-experimental:1.4.1")
    implementation("androidx.arch.core:core-common:2.2.0")
    implementation(libs.androidx.annotation)

    annotationProcessor(libs.autoValue)

    androidTestImplementation(libs.testExtJunit)
    androidTestImplementation(libs.testCore)
    androidTestImplementation(libs.testRunner)
    androidTestImplementation(libs.testRules)
    androidTestImplementation(libs.truth)
    androidTestImplementation(project(":camera:camera-testing")) {
        // Ensure camera-testing does not pull in androidx.test dependencies
        exclude(group:"androidx.test")
    }
    androidTestImplementation(libs.kotlinStdlib)
    androidTestImplementation(libs.kotlinCoroutinesAndroid)
    androidTestImplementation("androidx.annotation:annotation-experimental:1.4.1")
    androidTestImplementation("androidx.concurrent:concurrent-futures-ktx:1.1.0")
    androidTestImplementation(project(":internal-testutils-truth"))
    androidTestImplementation("org.jetbrains.kotlinx:atomicfu:0.13.1")
    androidTestImplementation(project(":camera:camera-camera2"))
    androidTestImplementation(project(":camera:camera-camera2-pipe-integration"))
    androidTestImplementation(project(":camera:camera-testing")) {
        // Ensure camera-testing does not pull in androidx.test dependencies
        exclude(group:"androidx.test")
    }
    androidTestImplementation("androidx.lifecycle:lifecycle-livedata-core:2.3.1")
    androidTestImplementation(libs.guavaAndroid)
    androidTestImplementation(libs.junit)
    androidTestImplementation(libs.kotlinCoroutinesCore)
    androidTestImplementation(libs.testMonitor)
    androidTestImplementation(project(":camera:camera-video"))

    testImplementation(libs.kotlinCoroutinesTest)
    testImplementation(libs.kotlinStdlib)
    testImplementation(libs.testCore)
    testImplementation(libs.testRunner)
    testImplementation(libs.truth)
    testImplementation("org.jetbrains.kotlinx:atomicfu:0.13.1")
    testImplementation(project(":internal-testutils-truth"))
    testImplementation(project(":camera:camera-testing")) {
        // Ensure camera-testing does not pull in androidx.test dependencies
        exclude(group:"androidx.test")
        // Ensure camera-camera2 is not pulled in as it may lead to manifest merge conflict
        exclude(module:"camera-camera2")
    }
    testImplementation("org.robolectric:annotations:4.14")
    testImplementation("org.robolectric:shadowapi:4.14")
    testImplementation("org.robolectric:shadows-framework:4.14")
    testImplementation(libs.guavaAndroid)
    testImplementation(libs.junit)
    testImplementation(libs.kotlinCoroutinesCore)
}

android {
    compileSdk = 35

    lint {
        enable.add("CameraXQuirksClassDetector")
    }
    namespace = "androidx.camera.lifecycle"
}

androidx {
    name = "Camera Lifecycle"
    type = SoftwareType.PUBLISHED_LIBRARY
    samples(project(":camera:camera-lifecycle:camera-lifecycle-samples"))
    inceptionYear = "2019"
    description = "Lifecycle components for the Jetpack Camera Library, a library providing a " +
            "consistent and reliable camera foundation that enables great camera driven " +
            "experiences across all of Android."
    enableRobolectric()
}
