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

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

android {
    compileSdk = 35
    buildTypes.configureEach {
        consumerProguardFiles "proguard-rules.pro"
    }
    namespace = "androidx.appsearch"
}

dependencies {
    api(libs.jspecify)
    api("androidx.annotation:annotation:1.1.0")
    api(libs.guavaListenableFuture)
    api(libs.autoServiceAnnotations)

    implementation("androidx.collection:collection:1.4.2")
    implementation("androidx.concurrent:concurrent-futures:1.0.0")
    implementation("androidx.core:core:1.9.0")

    annotationProcessor(project(":appsearch:appsearch-compiler"))

    androidTestAnnotationProcessor(project(":appsearch:appsearch-compiler"))
    androidTestImplementation(project(":appsearch:appsearch-builtin-types"))
    androidTestImplementation(project(":appsearch:appsearch-local-storage"))
    androidTestImplementation(project(":appsearch:appsearch-platform-storage"))
    androidTestImplementation(project(":appsearch:appsearch-play-services-storage"))
    androidTestImplementation(project(":appsearch:appsearch-test-util"))
    // Needed to check if PlayServicesAppSearch throws ApiException.
    androidTestImplementation("com.google.android.gms:play-services-basement:18.1.0", {
        exclude group: "androidx.core", module: "core"
    })
    androidTestImplementation(libs.testCore)
    androidTestImplementation(libs.testRules)
    androidTestImplementation(libs.truth)
    androidTestImplementation(libs.junit)
    // This dependency is unused by the test implementation, but it's here to validate that
    // icing's jarjar'ing of the Protobuf_lite doesn't conflict with external dependencies.
    androidTestImplementation(libs.protobufLite)
}

androidx {
    name = "AppSearch"
    type = LibraryType.PUBLISHED_LIBRARY
    inceptionYear = '2019'
    description = 'AndroidX AppSearch - App Indexing'
}
