/*
 * Copyright 2014 Google Inc. All rights reserved.
 *
 * 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 from: "../../commonHeader.gradle"
apply from: "../../commonLocalRepo.gradle"

apply plugin: 'com.android.application'

repositories {
    mavenCentral()
    flatDir {
        dirs 'libs'
    }
}

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.2"

    defaultConfig {
        minSdkVersion 14
        targetSdkVersion 21
    }

    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), file('proguard-project.txt')
        }
    }

    lintOptions {
        abortOnError false
    }

    aaptOptions {
        noCompress 'apk'
    }
}

dependencies {
    wearApp project(':Wearable')
    compile 'com.google.android.gms:play-services:6.1.71'
    compile 'com.android.support:support-v13:21.0.0'
    compile 'com.android.support:appcompat-v7:21.0.0'
    compile 'com.android.support:cardview-v7:21.0.0'
    compile 'com.google.code.gson:gson:2.1'
    compile('com.google.api-client:google-api-client:1.16.0-rc') {
        exclude group: 'xpp3', module: 'shared'
        exclude group: 'org.apache.httpcomponents', module: 'httpclient'
        exclude group: 'junit', module: 'junit'
        exclude group: 'com.google.android', module: 'android'
    }
    compile 'com.google.api-client:google-api-client-android:1.17.0-rc'
    compile 'com.google.apis:google-api-services-plus:v1-rev216-1.17.0-rc'
    compile 'com.github.japgolly.android:svg-android:2.0.6'
    compile fileTree(dir: 'libs', include: '*.jar')
    compile files('../third_party/glide/library/libs/glide-3.2.0a.jar')
    compile files('../third_party/basic-http-client/libs/basic-http-client-android-0.88.jar')

    // Google Maps Android API utility library
    compile('com.google.maps.android:android-maps-utils:0.4') {
        exclude group: "com.google.android.gms"
    }

    /* The two dependencies below are only required while we are using http
       Drive appdata. When we start using AppData through GMS,
       they should be removed. */
    compile 'com.google.http-client:google-http-client-gson:1.16.0-rc'
    compile 'com.google.apis:google-api-services-drive:v2-rev135-1.16.0-rc'
}
