/*
 * 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.
 */
apply plugin: 'com.android.application'

buildscript {
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.5.2'
        classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.10'
    }
}

android {
    compileSdkVersion 29
    buildToolsVersion '29.0.2'

    compileOptions() {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    lintOptions {
        abortOnError false
    }

    buildTypes {
        debug {
            minifyEnabled false
        }
        release {
            minifyEnabled true
        }
    }

    defaultConfig {
        minSdkVersion 23
        resConfigs "en"
        targetSdkVersion 29
        versionCode 1
        versionName "1.0"
    }

    sourceSets {
        main {
            res.srcDirs = ['res', 'material_res', 'ratings/res']
            java.srcDirs = ['src', 'partner_support/src']
            manifest.srcFile 'AndroidManifest.xml'
        }
    }
}

allprojects {
    repositories {
        google()
        jcenter()
    }
}

dependencies {
    implementation      'androidx.appcompat:appcompat:1.1.0'
    implementation      'androidx.core:core:1.1.0'
    implementation      'androidx.palette:palette:1.0.0'
    implementation      'androidx.leanback:leanback:1.1.0-alpha02'
    implementation      'androidx.recyclerview:recyclerview:1.1.0'
    implementation      'androidx.recyclerview:recyclerview-selection:1.0.0'
    implementation      'androidx.tvprovider:tvprovider:1.0.0'

    annotationProcessor 'com.google.auto.factory:auto-factory:1.0-beta7'
    implementation      'com.google.auto.factory:auto-factory:1.0-beta7'
    annotationProcessor 'com.google.auto.value:auto-value:1.5.3'
    implementation      'com.google.auto.value:auto-value:1.5.3'
    implementation      'com.google.dagger:dagger:2.23'
    implementation      'com.google.dagger:dagger-android:2.23'
    annotationProcessor 'com.google.dagger:dagger-android-processor:2.23'
    annotationProcessor 'com.google.dagger:dagger-compiler:2.23'
    implementation      'com.google.guava:guava:28.1-jre'
    implementation      'com.google.protobuf:protobuf-javalite:3.11.0'

    implementation      project(':common')
}
