/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 */
 
buildscript {
    repositories {
        mavenLocal()
        maven {url 'http://maven.aliyun.com/nexus/content/groups/public/'}
        mavenCentral()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.3'
    }
}

plugins {
    id "de.undercouch.download" version "3.2.0"
//    id "com.github.dcendents.android-maven" version "1.5"
}

subprojects {
    if(project.hasProperty('external_script')){
        for(item in external_script.split()) {
            apply from: item
        }
    }
    repositories {
        mavenLocal()
        if(project.hasProperty('external_repositories')){
            maven {
                url external_repositories
            }
        }
        maven {url 'http://maven.aliyun.com/nexus/content/groups/public/'}
        mavenCentral()
        jcenter()
        maven {
            url 'https://maven.google.com'
        }
    }
    buildscript {
        dependencies {
            classpath 'com.android.tools.build:gradle:2.3.3'
            classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.0'
            classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5'
        }
    }
    ext {
        compileSdkVersion=26
        buildToolsVersion="26.0.3"
        minSdkVersion=14
        targetSdkVersion=26
        supportLibVersion="26.0.2"
        fastjsonLibVersion="1.1.46.android"
        //Default value for buildCpp is true
        buildCpp = !project.hasProperty("buildCpp") || buildCpp.equals("true")
        //Default value for disableCov is false
        disableCov = project.hasProperty("disableCov") && disableCov.equals("true")
    }
}

//task clean(type: Delete) {
//    delete rootProject.buildDir
//}
