plugins {
    id "com.github.hierynomus.license" version "0.14.0"
}

apply plugin: 'com.android.application'

android {
    compileSdkVersion project.compileSdkVersion
    buildToolsVersion project.buildToolsVersion

    defaultConfig {
        applicationId "com.alibaba.weex"
        minSdkVersion project.appMinSdkVersion
        targetSdkVersion project.targetSdkVersion
        versionCode 17
        versionName "0.19.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        multiDexEnabled true
        ndk{
            abiFilters "armeabi-v7a","armeabi","x86"
        }
    }
    applicationVariants.all { variant ->
        variant.outputs.each { output ->
            def outputFile = output.outputFile
            if (outputFile != null && outputFile.name.equals('app-debug.apk')) {
                def fileName = outputFile.name.replace("app-debug.apk", "playground.apk")
                output.outputFile = new File(outputFile.parent, fileName)
            }
        }
    }
    signingConfigs {
        debug {
            storeFile file("tools/weex.jks")
            storePassword "123456"
            keyAlias "weex"
            keyPassword "123456"
        }
    }
    buildTypes {
        debug {
            jniDebuggable true
            debuggable true
        }
    }
    sourceSets {
        main {
            jniLibs.srcDir(['libs'])
            java {
                srcDirs = ["src/main/java", "src/main/java_zxing"];
            }
        }
    }
    lintOptions {
        abortOnError false
    }

    packagingOptions {
        exclude 'LICENSE.txt'
    }
    testOptions {
        reportDir = "$project.buildDir/test/report"
    }
    dexOptions {
        preDexLibraries false
    }

}


dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    androidTestCompile "com.android.support:support-annotations:${project.supportLibVersion}"
    androidTestCompile 'junit:junit:4.12'
    androidTestCompile 'org.awaitility:awaitility:3.0.0'
    androidTestCompile 'org.awaitility:awaitility-proxy:3.0.0'
    androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2'
    androidTestCompile('com.android.support.test.espresso:espresso-contrib:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
        exclude group: 'com.android.support', module: 'support-v4'
        exclude group: 'com.android.support', module: 'design'
        exclude group: 'com.android.support', module: 'appcompat-v7'
        exclude group: 'com.android.support', module: 'recyclerview-v7'
    })
    androidTestCompile 'com.android.support.test:runner:0.5'
    androidTestCompile 'com.squareup.picasso:picasso:2.5.2'
    androidTestCompile 'org.hamcrest:hamcrest-library:1.3'
    androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2'
    /*source dependency*/

    debugCompile project(path: ':commons', configuration: 'debug')
    releaseCompile project(path: ':commons', configuration: 'release')

    debugCompile project(path: ':weex_sdk', configuration: 'debug')
    releaseCompile project(path: ':weex_sdk', configuration: 'release')

    //https://github.com/weexteam/weex-analyzer-android
    //Weex-Analyzer provides several convenient tools such as Memory Monitor
    // to optimize your application. It's not available by default,you can
    // set WXAnalyzerDelegate#DEBUG==true to enable it
    debugCompile 'com.taobao.android:weex_analyzer:0.1.0.5'


    compile 'com.taobao.android:dexposed:0.1.8'
    compile 'com.loopj.android:android-async-http:1.4.9@aar'
    compile 'com.facebook.fresco:fresco:0.12.0+'
    compile 'com.facebook.fresco:animated-gif:0.12.0'

    compile 'com.squareup.okhttp:okhttp:2.3.0'
    compile 'com.squareup.okhttp:okhttp-ws:2.3.0'
    compile 'com.squareup.okio:okio:1.0.1'
    compile "com.alibaba:fastjson:${project.fastjsonLibVersion}"
    compile "com.android.support:support-v4:${project.supportLibVersion}"
    compile "com.android.support:appcompat-v7:${project.supportLibVersion}"
    compile "com.android.support:design:${project.supportLibVersion}"
    compile "com.android.support:support-annotations:${project.supportLibVersion}"
    compile 'com.jakewharton.scalpel:scalpel:1.1.2'
    compile 'com.taobao.android.weex_inspection:urlconnection_interceptor:1.0.0'
    compile 'com.android.support.test.espresso:espresso-idling-resource:2.2.2'
    compile 'com.taobao.android:weex_inspector:0.18.10'
    //compile project(":weex_inspector")
}

if(file('../../license/LICENSE').exists()){
    license {
        header = file('../../license/LICENSE')
        excludes(["com/google/zxing/**/*.java","**/*.xml"])
    }
    preBuild.dependsOn licenseFormat
}
