/*
 * Copyright (C) 2021 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")
    id("kotlin-android")
}

dependencies {
    api(libs.kotlinStdlib)
    implementation('androidx.core:core:1.5.0')
    implementation('androidx.collection:collection:1.1.0')

    annotationProcessor(libs.nullaway)

    androidTestImplementation(libs.testExtJunit)
    androidTestImplementation(libs.testCore)
    androidTestImplementation(libs.testRunner)
    androidTestImplementation(libs.testRules)
    androidTestImplementation(libs.truth)
    androidTestImplementation(libs.kotlinStdlib)
    androidTestImplementation(libs.espressoCore, excludes.espresso)
    androidTestImplementation(libs.bundles.espressoContrib)
    androidTestImplementation(project(':navigation:navigation-fragment-ktx'))
    androidTestImplementation(project(':navigation:navigation-ui-ktx'))
    androidTestImplementation(project(':appcompat:appcompat'))
    androidTestImplementation(project(':internal-testutils-espresso'))
    androidTestImplementation(project(':internal-testutils-runtime'))
    androidTestImplementation(project(':internal-testutils-common'))
    androidTestImplementation('androidx.core:core-ktx:1.3.2')
    androidTestImplementation('androidx.constraintlayout:constraintlayout:2.0.1')
    androidTestImplementation('com.google.android.material:material:1.2.1')
}

android {
    namespace "androidx.metrics.performance"
}

androidx {
    name = "Metrics"
    type = LibraryType.PUBLISHED_LIBRARY
    inceptionYear = "2021"
    description = "Library for tracking and reporting various runtime metrics for applications"
    metalavaK2UastEnabled = true
    legacyDisableKotlinStrictApiMode = true
}
