/*
 * 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 android.support.LibraryVersions
import android.support.SupportLibraryExtension

apply plugin: android.support.FlatfootAndroidLibraryPlugin

android {
    compileSdkVersion tools.current_sdk
    buildToolsVersion tools.build_tools_version

    defaultConfig {
        minSdkVersion flatfoot.min_sdk
        targetSdkVersion tools.current_sdk

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }

    buildTypes.all {
        consumerProguardFiles 'proguard-rules.pro'
    }

    testOptions {
        unitTests.returnDefaultValues = true
    }
}
dependencies {
    compile project(":lifecycle:runtime")
    compile project(":arch:common")
    compile project(":arch:runtime")
    compile libs.support.fragments, libs.support_exclude_config
    compile project(":lifecycle:common")

    testCompile project(":arch:core-testing")
    testCompile libs.junit
    testCompile libs.mockito_core

    androidTestImplementation libs.test_runner,      { exclude module: 'support-annotations' }
    androidTestImplementation libs.espresso_core,    { exclude module: 'support-annotations' }
    androidTestImplementation libs.support.app_compat, libs.support_exclude_config
}

createAndroidCheckstyle(project)

version = LibraryVersions.LIFECYCLES_EXT.toString()
supportLibrary {
    name 'Android Lifecycle Extensions'
    publish true
    inceptionYear '2017'
    description "Android Lifecycle Extensions"
    url SupportLibraryExtension.ARCHITECTURE_URL
}