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.minSdkVersion
        targetSdkVersion project.targetSdkVersion
        versionCode 20
        versionName "0.20.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
    }
    aaptOptions {
        noCompress 'wasm'
    }
}


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

    compile project(':commons')
    compile project(':weex_sdk')
    //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.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.google.zxing:core:3.3.3'

    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.24.2.4'
    //compile project(":weex_inspector")

    // Bind actions to effects. See https://alibaba.github.io/bindingx/
    compile 'com.alibaba.android:bindingx-core:1.1.1.2@aar'
    compile 'com.alibaba.android:bindingx_weex_plugin:1.1.1@aar'
}

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