/*
 * Copyright (C) 2017 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.LibraryVersions
import androidx.build.Publish

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

dependencies {
    api("androidx.annotation:annotation:1.1.0")
    api("androidx.core:core:1.1.0-rc01")

    androidTestImplementation(OKHTTP_MOCKWEBSERVER)
    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
    androidTestImplementation(ANDROIDX_TEST_CORE)
    androidTestImplementation(ANDROIDX_TEST_RUNNER)
    androidTestImplementation(ANDROIDX_TEST_RULES)
    androidTestImplementation(project(":concurrent:concurrent-futures"))

    // Hamcrest matchers:
    androidTestImplementation(ESPRESSO_CONTRIB, libs.exclude_for_espresso)
}

ext {
    webviewBoundaryInterfacesDir = project(':webview-support-interfaces').projectDir
}

android {
    sourceSets {
        // Allow compiling the WebView support library boundary interfaces from this project.
        main.java.srcDirs += new File(webviewBoundaryInterfacesDir, "src").getAbsolutePath()
    }

    buildTypes.all {
        consumerProguardFiles new File(webviewBoundaryInterfacesDir, "proguard.flags") , 'proguard-rules.pro'
    }
}

androidx {
    name = "WebView Support Library"
    publish = Publish.SNAPSHOT_AND_RELEASE
    mavenVersion = LibraryVersions.WEBKIT
    mavenGroup = LibraryGroups.WEBKIT
    inceptionYear = "2017"
    description = "The WebView Support Library is a static library you can add to your Android application in order to use android.webkit APIs that are not available for older platform versions."
    trackRestrictedAPIs = false
}
