/*
 * Copyright (C) 2016 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
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_7
        targetCompatibility JavaVersion.VERSION_1_7
    }
}

dependencies {
    api project(":room:common")
    api project(":persistence:db-framework")
    api project(":persistence:db")
    api project(":arch:runtime")
    provided project(":paging:common")
    provided project(":lifecycle:runtime")
    provided project(":lifecycle:extensions")
    compile libs.support.core_utils, libs.support_exclude_config

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

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

createAndroidCheckstyle(project)

android.libraryVariants.all { variant ->
    def name = variant.buildType.name
    def suffix = name.capitalize()
    project.tasks.create(name: "jar${suffix}", type: Jar){
        dependsOn variant.javaCompile
        from variant.javaCompile.destinationDir
        destinationDir new File(project.buildDir, "libJar")
    }
}

version = LibraryVersions.ROOM.toString()
supportLibrary {
    name 'Android Room-Runtime'
    publish true
    inceptionYear '2017'
    description "Android Room-Runtime"
    url SupportLibraryExtension.ARCHITECTURE_URL
}