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

def build_versions = [:]

def kotlin_override = System.getenv("KOTLIN_OVERRIDE")
if (kotlin_override != null) {
    build_versions.kotlin = kotlin_override
    logger.warn("USING OVERRIDDEN KOTLIN GRADLE PLUGIN DEPENDENCY " + build_versions.kotlin)
} else {
    build_versions.kotlin = '1.3.41'
}
build_versions.lint = '26.5.0'
build_versions.dokka = '0.9.17-g002'

build_versions.studio = new Properties()
new File(buildscript.sourceFile.parentFile, "studio_versions.properties").withInputStream { build_versions.studio.load(it) }


rootProject.ext['build_versions'] = build_versions

def build_libs = [:]

def androidPluginVersionOverride = System.getenv("GRADLE_PLUGIN_VERSION")

if (androidPluginVersionOverride != null) {
    build_libs.gradle = 'com.android.tools.build:gradle:' + androidPluginVersionOverride
    logger.warn("USING OVERRIDDEN ANDROID GRADLE PLUGIN DEPENDENCY OF " + build_libs.gradle)
} else {
    // Keep gradle plugin version in sync with ub_supportlib-master manifest.
    build_libs.gradle = "com.android.tools.build:gradle:${build_versions.studio.agp}"
}

build_libs.lint = [
        core: "com.android.tools.lint:lint:${build_versions.lint}",
        api: "com.android.tools.lint:lint-api:${build_versions.lint}",
        tests: "com.android.tools.lint:lint-tests:${build_versions.lint}"
]

build_libs.error_prone_gradle = 'net.ltgt.gradle:gradle-errorprone-plugin:0.0.13'
build_libs.kotlin = [
        stdlib: "org.jetbrains.kotlin:kotlin-stdlib:${build_versions.kotlin}",
        gradle_plugin: "org.jetbrains.kotlin:kotlin-gradle-plugin:${build_versions.kotlin}"
]
build_libs.dex_member_list = "com.jakewharton.dex:dex-member-list:4.1.1"
build_libs.dokka_gradle = [
        "org.jetbrains.dokka:dokka-android-gradle-plugin:${build_versions.dokka}",
        "org.jetbrains.dokka:dokka-gradle-plugin:${build_versions.dokka}",
]

rootProject.ext['build_libs'] = build_libs
