/*
 * Copyright (C) 2018 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.
 */


/*
 * Experimental gradle configuration.  This file may not be up to date.
 */

buildscript {
    repositories {
        mavenCentral()
        google()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.1.4'
        classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.6'
    }
}
apply plugin: 'com.android.application'
android {
    compileSdkVersion 28
    buildToolsVersion '28.0.3'
    dexOptions {
        preDexLibraries = false
        additionalParameters=['--core-library']
        javaMaxHeapSize "6g"
    }
    android {
        defaultConfig {
            resConfigs "en"
        }
    }
    defaultConfig {
        minSdkVersion 23
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        debug {
            minifyEnabled false
        }
        release {
            minifyEnabled true
        }
    }
    compileOptions() {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    sourceSets {
        main {
            res.srcDirs = ['res', 'material_res']
            java.srcDirs = ['src', 'partner_support/src']
            manifest.srcFile 'AndroidManifest.xml'
        }
    }
}

repositories {
    mavenCentral()
    jcenter()
    google()
}

dependencies {
    implementation 'androidx.appcompat:appcompat:1.0.2'
    implementation 'androidx.palette:palette:1.0.0'
    implementation 'androidx.leanback:leanback:1.0.0'
    implementation "androidx.tvprovider:tvprovider:1.0.0"
    implementation "androidx.recyclerview:recyclerview:1.0.0"
    implementation "androidx.recyclerview:recyclerview-selection:1.0.0"
    implementation "androidx.palette:palette:1.0.0"

    implementation 'com.google.dagger:dagger:2.18'
    implementation 'com.google.dagger:dagger-android:2.18'
    annotationProcessor 'com.google.dagger:dagger-compiler:2.18'
    annotationProcessor 'com.google.dagger:dagger-android-processor:2.18'

    /*Not building with  latest one (1.6.3)*/
    annotationProcessor 'com.google.auto.value:auto-value:1.5.4'
    implementation 'com.google.auto.value:auto-value:1.5.4'
    implementation 'javax.inject:javax.inject:1'
    implementation 'com.google.guava:guava:26.0-android'
    implementation project(':common')
}