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

def supportRoot = ext.supportRootFolder
if (supportRoot == null) {
    throw new RuntimeException("variable supportRootFolder is not set. you must set it before" +
            " including this script")
}

apply from: "${supportRoot}/buildSrc/unbundled_check.gradle"

def checkoutRoot = "${ext.supportRootFolder}/../.."
ext.repos = new Properties()
ext.repos.prebuiltsRoot = "${checkoutRoot}/prebuilts"

ext.repoNames = ["${repos.prebuiltsRoot}/androidx/internal",
                 "${repos.prebuiltsRoot}/androidx/external",]

/**
 * Adds maven repositories to the given repository handler.
 */
def addMavenRepositories(RepositoryHandler handler) {
    repoNames.each { repo ->
        handler.maven {
            url repo
        }
    }
    if (System.getenv("ALLOW_PUBLIC_REPOS") != null || (isUnbundledBuild(ext.supportRootFolder))) {
        handler.mavenCentral()
        handler.jcenter()
        handler.google()
        handler.maven {
            url "https://plugins.gradle.org/m2/"
        }
    }
    def androidPluginRepoOverride = System.getenv("GRADLE_PLUGIN_REPO")
    if (androidPluginRepoOverride != null) {
        handler.maven {
            url androidPluginRepoOverride
        }
    }
}

ext.repos.addMavenRepositories = this.&addMavenRepositories
