// Top level gradle declarations

buildscript {
    repositories {
        jcenter()
        maven { url 'http://repo1.maven.org/maven2' }
        maven { url 'http://download.crashlytics.com/maven' }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.3.0'
        classpath 'com.crashlytics.tools.gradle:crashlytics-gradle:1.+'
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

// Module level gradle declarations

apply plugin: 'com.android.application'

apply plugin: 'crashlytics'

repositories {
    maven { url 'http://download.crashlytics.com/maven' }
}

android {
    compileSdkVersion 22
    buildToolsVersion "23.0.2"

    defaultConfig {
        applicationId "com.fairphone.fplauncher3"
        minSdkVersion 17
        targetSdkVersion 22
    }

    buildTypes {
        release {
            minifyEnabled true
            shrinkResources true
            proguardFiles 'proguard.flags'
    }

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

        // Move the tests to tests/java, tests/res, etc...
        instrumentTest.setRoot('tests')
        androidTest.setRoot('tests')
        
        // Move the build types to build-types/<type>
        // For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ...
        // This moves them out of them default location under src/<type>/... which would
        // conflict with src/ being used by the main source set.
        // Adding new build types or product flavors should be accompanied
        // by a similar customization.
        debug.setRoot('build-types/debug')
        release.setRoot('build-types/release')
    }

    dexOptions {
        incremental false
        preDexLibraries = false
    }
}

dependencies {
    compile 'com.android.support:support-v13:22.+'
    compile 'com.crashlytics.android:crashlytics:1.+'
    compile 'com.googlecode.libphonenumber:libphonenumber:6.+'
}
