/*
 * 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.library'
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 28
        versionCode 1
        versionName "1.0"
    }

    buildTypes {
        debug {
            minifyEnabled false
            buildConfigField "boolean", "AOSP", "true"
            buildConfigField "boolean", "ENG", "true"
            buildConfigField "boolean", "NO_JNI_TEST", "false"
        }
        release {
            minifyEnabled true
            buildConfigField "boolean", "AOSP", "true"
            buildConfigField "boolean", "ENG", "false"
            buildConfigField "boolean", "NO_JNI_TEST", "false"
        }
    }

    sourceSets {
        main {
            res.srcDirs = ['res']
            java.srcDirs = ['src']
            java {
                exclude '**/BuildConfig.java'
            }
            manifest.srcFile 'AndroidManifest.xml'
            proto {
                srcDir 'src/com/android/tv/common/compat/internal'
            }
            proto {
                srcDir 'src/com/android/tv/common/flags/proto'
            }
        }
    }
}

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

    implementation      'com.google.android.exoplayer:exoplayer:r1.5.16'
    implementation      'com.google.android.exoplayer:exoplayer-core: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      'com.google.guava:guava:28.1-jre'
    implementation      'com.google.protobuf:protobuf-javalite:3.11.0'
}

protobuf {
    protoc {
        artifact = 'com.google.protobuf:protoc:3.11.0'
    }
    generateProtoTasks {
        all().each { task ->
            task.builtins {
                java {
                    option "lite"
                }
            }
        }
    }
}
