/* 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 {
        mavenCentral()
    }

    dependencies {
        // Switch the Android Gradle plugin version requirement depending on the
        // installed version of Gradle. This dependency is documented at
        // http://tools.android.com/tech-docs/new-build-system/version-compatibility
        // and https://issues.apache.org/jira/browse/CB-8143
        if (gradle.gradleVersion >= "2.2") {
            dependencies {
                classpath 'com.android.tools.build:gradle:1.0.0+'
            }
        } else if (gradle.gradleVersion >= "2.1") {
            dependencies {
                classpath 'com.android.tools.build:gradle:0.14.0+'
            }
        } else {
            dependencies {
                classpath 'com.android.tools.build:gradle:0.12.0+'
            }
        }
    }
}

apply plugin: 'android-library'

android {
    compileSdkVersion cordova.cordovaSdkVersion
    buildToolsVersion cordova.cordovaBuildToolsVersion
    publishNonDefault true

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_6
        targetCompatibility JavaVersion.VERSION_1_6
    }

    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            resources.srcDirs = ['src']
            aidl.srcDirs = ['src']
            renderscript.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        }
    }
}
