/*
 * 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 androidx.build.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.lint
        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
