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

import static androidx.build.dependencies.DependenciesKt.*
import androidx.build.LibraryGroups
import androidx.build.Publish

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

android {
    defaultConfig {
        minSdkVersion 28
        multiDexEnabled true
    }
}

dependencies {
    api(JUNIT)
    api(KOTLIN_STDLIB)
    api("androidx.annotation:annotation:1.1.0")
    implementation(project(":benchmark:benchmark-common"))
    implementation(project(":benchmark:benchmark-perfetto"))
    implementation(ANDROIDX_TEST_EXT_JUNIT)
    implementation(ANDROIDX_TEST_UIAUTOMATOR)
    // Get rid of this dependency eventually
    implementation(GUAVA_ANDROID)
    implementation("com.android:collector-device-lib-platform:0.1.0")
    implementation("com.android:collector-device-lib:0.1.0")
    implementation("com.android:collector-helper-utilities:0.1.0")
    implementation("com.android:jank-helper:0.1.0")
    implementation("com.android:memory-helper:0.1.0")
    implementation("com.android:perfetto-helper:0.1.0")
    implementation("com.android:platform-test-composers:0.1.0")
    implementation("com.android:power-helper:0.1.0")
    implementation("com.android:simpleperf-helper:0.1.0")
    implementation("com.android:statsd-helper:0.1.0")
    implementation("com.android:system-metric-helper:0.1.0")
    implementation("com.android:test-composers:0.1.0")
    implementation("com.android:platform-test-rules:0.1.0")
    implementation("com.android:microbenchmark-device-lib:0.1.0")

    androidTestImplementation("androidx.test:rules:1.3.0")
    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
    androidTestImplementation(ANDROIDX_TEST_CORE)
    androidTestImplementation(ANDROIDX_TEST_RUNNER)
    androidTestImplementation(ESPRESSO_CORE)
    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy)
    // DexMaker has it"s own MockMaker
    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy)
    // DexMaker has it"s own MockMaker
}

androidx {
    name = "Android Benchmark - Macrobenchmark"
    publish = Publish.NONE
    mavenGroup = LibraryGroups.BENCHMARK
    inceptionYear = "2020"
    description = "Android Benchmark - Macrobenchmark"
}

// Define a task dependency so the app is installed before we run macro benchmarks.
tasks.getByPath(':benchmark:benchmark-macro:connectedCheck')
        .dependsOn(
                tasks.getByPath(
                        ':benchmark:integration-tests:macrobenchmark-target:installRelease'
                )
        )
