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

android {
    compileSdkVersion 29
    buildToolsVersion '29.0.2'

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

    lintOptions {
        abortOnError false
    }

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

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

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

dependencies {
    implementation      'androidx.leanback:leanback:1.1.0-alpha02'
    implementation      'androidx.palette:palette:1.0.0'
    implementation      'androidx.tvprovider:tvprovider:1.0.0'

    implementation      'com.google.android.exoplayer:exoplayer-ui:2.10.1'
    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      project(':common')
    implementation      project(':tuner')
}
