/*
 * 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.DacOptions

def currentJvmVersion = org.gradle.api.JavaVersion.current()
if (currentJvmVersion.getMajorVersion() != "8") {
  throw new Exception("Unsupported java version '" + currentJvmVersion.toString() + "'. Please install java 8.\n" +
"\n" +
"If you have already installed java 8, you can instruct Gradle to use it by setting the environment variable JAVA_HOME equal to its file path.")
}


buildscript {
    ext.supportRootFolder = project.projectDir
    apply from: 'buildSrc/repos.gradle'
    apply from: 'buildSrc/init.gradle'
    apply from: 'buildSrc/build_dependencies.gradle'
    init.setSdkInLocalPropertiesFile()
    repos.addMavenRepositories(repositories)

    dependencies {
        classpath build_libs.gradle
        classpath build_libs.jacoco
        classpath build_libs.jetifier
        classpath build_libs.kotlin.gradle_plugin
    }
}

repos.addMavenRepositories(repositories)

init.setupRepoOutAndBuildNumber()

init.configureSubProjects()

init.configureBuildOnServer()

init.setupRelease()

apply from: 'buildSrc/jetify.gradle'

init.enableDoclavaAndJDiff(this, new DacOptions("android/support", "SUPPORT_DATA"))

///// FLATFOOT START

///// FLATFOOT END
