/*
 * Copyright (C) 2015 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
 */

apply plugin: 'android-library'

archivesBaseName = 'preference-v7'

dependencies {
    compile project(':support-v4')
    compile project(':support-appcompat-v7')
    compile project(':support-recyclerview-v7')
}

android {
    compileSdkVersion 'current'

    sourceSets {
        main.manifest.srcFile 'AndroidManifest.xml'
        main.java.srcDir 'src'
        main.res.srcDir 'res'
        main.assets.srcDir 'assets'
        main.resources.srcDir 'src'

        // this moves src/instrumentTest to tests so all folders follow:
        // tests/java, tests/res, tests/assets, ...
        // This is a *reset* so it replaces the default paths
        androidTest.setRoot('tests')
        androidTest.java.srcDir 'tests/src'
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_7
        targetCompatibility JavaVersion.VERSION_1_7
    }

    lintOptions {
        // TODO: fix errors and reenable.
        abortOnError false
    }

    buildTypes.all {
        consumerProguardFiles 'proguard-rules.pro'
    }
}

uploadArchives {
    repositories {
        mavenDeployer {
            repository(url: uri(rootProject.ext.supportRepoOut)) {
            }

            pom.project {
                name 'Android Support Preference v7'
                description "Android Support Preference v7"
                url 'http://developer.android.com/tools/extras/support-library.html'
                inceptionYear '2015'

                licenses {
                    license {
                        name 'The Apache Software License, Version 2.0'
                        url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
                        distribution 'repo'
                    }
                }

                scm {
                    url "http://source.android.com"
                    connection "scm:git:https://android.googlesource.com/platform/frameworks/support"
                }
                developers {
                    developer {
                        name 'The Android Open Source Project'
                    }
                }
            }
        }
    }
}
