buildscript {
    repositories {
        mavenCentral()
        jcenter()
    }
    dependencies {
        // This introduces the Android plugin to make building Android
        // applications easier.
        classpath 'com.android.tools.build:gradle:1.3.0'
        // We are going to define a custom VDL service. The Vanadium
        // Gradle plugin makes that easier, so let's use that.
        classpath 'io.v:gradle-plugin:0.9'
        // Use the Android SDK manager, which will automatically download
        // the required Android SDK.
        classpath 'com.jakewharton.sdkmanager:gradle-plugin:0.12.0'
    }
}

// Make our lives easier by automatically downloading the appropriate Android SDK.
apply plugin: 'android-sdk-manager'
// It's an Android application.
apply plugin: 'com.android.application'

// It's going to use VDL.
apply plugin: 'io.v.vdl'


// Conditionally apply the google services plugin, depending on existence of the configuration file.
// Also, add conditional source folders as source directories.
// This is a workaround for not having conditional compilation in Java.
if (new File(projectDir, 'google-services.json').exists()) {
    apply plugin: 'com.google.gms.google-services'
    android.sourceSets.main.java.srcDir { 'src/conditional/ga_enabled' }
} else {
    android.sourceSets.main.java.srcDir { 'src/conditional/ga_disabled' }
}


repositories {
    mavenCentral()
    jcenter()
}

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.1"

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_7
        targetCompatibility JavaVersion.VERSION_1_7
    }

    defaultConfig {
        applicationId "io.v.android.apps.reader"
        minSdkVersion 22
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
        multiDexEnabled true
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    // Vanadium android-lib only supports armeabi-v7a.
    // The following block prevents this app from running in arm64-v8a mode.
    splits {
        abi {
            enable true
            reset()
            include 'armeabi-v7a'
            universalApk false
        }
    }
    packagingOptions {
        exclude 'META-INF/NOTICE.txt'
        exclude 'META-INF/LICENSE.txt'
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:design:23.0.1'
    compile 'com.android.support:appcompat-v7:23.0.1'
    compile 'com.android.support:cardview-v7:23.0.1'
    compile 'com.android.support:recyclerview-v7:23.0.1'
    compile 'com.google.android.gms:play-services-analytics:8.3.0'
    compile 'org.apache.commons:commons-csv:1.2'
    compile 'org.apache.commons:commons-io:1.3.2'
    compile 'io.v:vanadium-android:0.8'
    compile 'io.v:baku-toolkit:0.3.0'

    // Required by baku-toolkit.
    apk ('org.slf4j:slf4j-android:1.7.13')
}

vdl {
    inputPaths += new File(projectDir, '../../common').canonicalPath
    packageTranslations += 'vdl->io/v/android/apps/reader/vdl'
}

// The two tasks below are used for copying the pdf.js files into assets/pdfjs directory.
task generatePdfJsFiles(type: Exec) {
    workingDir '../../web'
    commandLine 'make', 'public/pdf-web-view.js'
}

task copyPdfJsFiles(type: Copy, dependsOn: 'generatePdfJsFiles') {
    from('../../web/public') {
        include 'pdf*'
    }

    into 'src/main/assets/pdfjs'
}

// These two tasks should run before 'preBuild' task
tasks['preBuild'].dependsOn('copyPdfJsFiles')


// To use the local version of vanadium-android library,
// use "-DuseLocalVanadiumLib" parameter in the gradle command.
if (System.getProperty('useLocalVanadiumLib') != null) {

    // NOTE: Make sure that the gradle wrapper version is 2.5 or higher, before using the dependency
    // substitution feature.
    configurations.all {
        resolutionStrategy {
            dependencySubstitution {
                substitute module('io.v:vanadium-android') with project(':android-lib')
            }
        }
    }

    // Copy the Vanadium native library to the correct location.
    def jiriRoot = new File(projectDir, '../../../../..').canonicalPath
    task copyVanadiumLib(type: Copy, dependsOn: ':android-lib:goBuildVanadiumLib') {
        logger.info(jiriRoot + '/release/go/pkg/android_arm_shared_shared/v.io/x/jni')
        from jiriRoot + '/release/go/pkg/android_arm_shared_shared/v.io/x/jni'
        into 'src/main/jniLibs/armeabi-v7a'
        include 'main.a'
        rename 'main.a', 'libv23.so'
    }

    tasks['preBuild'].dependsOn('copyVanadiumLib')
}

clean {
    delete 'src/main/jniLibs/armeabi-v7a/libv23.so'
}
