/*
 * Copyright (C) 2018 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")
    implementation(project(":collection:collection"))

    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
    androidTestImplementation(ANDROIDX_TEST_CORE)
    androidTestImplementation(ANDROIDX_TEST_RUNNER)
    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy)
    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy)
    androidTestAnnotationProcessor (project(":remotecallback:remotecallback-processor"))
}

android {
    buildTypes.all {
        consumerProguardFiles("proguard-rules.pro")
    }
}

androidx {
    name = "Remote Callback"
    publish = Publish.SNAPSHOT_AND_RELEASE
    mavenGroup = LibraryGroups.REMOTECALLBACK
    inceptionYear = "2018"
    description = "Wraps PendingIntents in a friendly and easier way to handle remote callbacks"
    failOnDeprecationWarnings = false
}
