/*
 * Copyright (C) 2017 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

apply plugin: 'com.android.application'

ext {
    fontDir = project(':noto-emoji-compat').projectDir
}

dependencies {
    compile project(':support-emoji')
    compile project(':support-emoji-bundled')
    compile project(':support-emoji-appcompat')
}

android {
    compileSdkVersion project.ext.currentSdk

    defaultConfig {
        minSdkVersion 14
        targetSdkVersion project.ext.currentSdk
    }

    sourceSets {
        main.manifest.srcFile 'AndroidManifest.xml'
        main.java.srcDirs = ['src']
        main.res.srcDirs = ['res']
        main.assets.srcDirs = [new File(fontDir, "supported-emojis").getAbsolutePath()]
    }

    lintOptions {
        abortOnError true
        check 'NewApi'
    }

    signingConfigs {
        debug {
            // Use a local debug keystore to avoid build server issues.
            storeFile project.rootProject.init.debugKeystore
        }
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_7
        targetCompatibility JavaVersion.VERSION_1_7
    }
}