/*
 * Copyright (C) 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.ApkCopyHelperKt

plugins {
    id("AndroidXPlugin")
    id("com.android.application")
    id("kotlin-android")
}

android {
    defaultConfig {
        applicationId "androidx.camera.integration.extensions"
        minSdkVersion 21
        versionCode 1
        multiDexEnabled true
    }

    buildTypes {
        release {
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            testProguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    namespace "androidx.camera.integration.extensions"
}

dependencies {
    // Internal library
    implementation(project(":camera:camera-camera2"))
    implementation(project(':camera:camera-camera2-pipe-integration'))
    implementation(project(":camera:camera-extensions"))
    implementation(project(":camera:camera-lifecycle"))
    implementation(project(":camera:camera-view"))
    implementation(project(":camera:camera-video"))

    // Android Support Library
    api(libs.constraintLayout)
    implementation(libs.kotlinStdlib)
    implementation("androidx.appcompat:appcompat:1.2.0")
    implementation("androidx.activity:activity-ktx:1.2.0")
    implementation("androidx.concurrent:concurrent-futures:1.1.0")
    implementation("androidx.concurrent:concurrent-futures-ktx:1.1.0")
    implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.3.1")
    implementation("androidx.test.espresso:espresso-idling-resource:3.1.0")

    // Guava
    implementation(libs.guavaAndroid)
    implementation(libs.guavaListenableFuture)
    implementation("androidx.viewpager2:viewpager2:1.0.0")

    // Align dependencies in debugRuntimeClasspath and debugAndroidTestRuntimeClasspath.
    androidTestImplementation("androidx.annotation:annotation-experimental:1.4.0")
    androidTestImplementation(project(":concurrent:concurrent-futures"))
    androidTestImplementation(project(":concurrent:concurrent-futures-ktx"))

    androidTestImplementation(libs.testExtJunit)
    androidTestImplementation(libs.testCore)
    androidTestImplementation(libs.testRunner)
    androidTestImplementation(libs.testRules)
    androidTestImplementation(libs.testUiautomator)
    androidTestImplementation(libs.truth)
    androidTestImplementation("androidx.test.espresso:espresso-core:3.3.0")
    androidTestImplementation(project(":camera:camera-testing")) {
        // Ensure camera-testing does not pull in androidx.test dependencies
        exclude(group:"androidx.test")
    }
    androidTestImplementation(project(":internal-testutils-runtime"))
    androidTestCompileOnly(project(":camera:camera-extensions-stub"))

    // Testing resource dependency for manifest
    debugImplementation(project(":camera:camera-testing")) {
        // Ensure camera-testing does not pull in androidx.test dependencies
        exclude(group:"androidx.test")
    }
    debugImplementation(libs.testCore)
}

// Copy apks to dist/apks as they are used outside of androidx test infrastructure
ApkCopyHelperKt.setupAppApkCopy(project, "debug")
ApkCopyHelperKt.setupTestApkCopy(project)

androidx {
    deviceTests {
        // These tests only work on devices that ship extensions
        // and androidx test infrastructure has no such devices b/284404606
        enabled = false
    }
}
