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 22
    buildToolsVersion "22.0.1"

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_7
        targetCompatibility JavaVersion.VERSION_1_7
    }

    defaultConfig {
        applicationId "io.v.android.apps.reader"
        minSdkVersion 22
        targetSdkVersion 22
        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:22.2.1'
    compile 'com.android.support:appcompat-v7:22.2.1'
    compile 'com.android.support:cardview-v7:22.2.1'
    compile 'com.android.support:recyclerview-v7:22.2.1'
    compile 'io.v:vanadium-android:0.3'
    compile 'com.google.android.gms:play-services-analytics:8.3.0'
    compile 'org.apache.commons:commons-csv:1.2'
}

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')
