/*
 * 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 android.support.dependencies.DependenciesKt.*

plugins {
    id("SupportAndroidLibraryPlugin")
}

dependencies {
    api(project(":support-fragment"))
    api(project(":appcompat-v7"))

    implementation(TEST_RUNNER)
    implementation(ESPRESSO_CORE)
    implementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
    implementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
    implementation(JUNIT)
}

android {
    lintOptions {
        disable 'InvalidPackage' // Lint is unhappy about junit package
    }
}

supportLibrary {
    legacySourceLocation = true
}