/*
 * 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'
buildscript {
    repositories {
        mavenCentral()
        google()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.1.4'
        classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.6'
    }
}
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
            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"
        }
    }
    compileOptions() {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

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

repositories {
    mavenCentral()
    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.guava:guava:26.0-android'
    implementation 'com.google.protobuf:protobuf-java:3.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'
}
protobuf {
    // Configure the protoc executable
    protoc {
        artifact = 'com.google.protobuf:protoc:3.0.0'

        plugins {
            javalite {
                // The codegen for lite comes as a separate artifact
                artifact = 'com.google.protobuf:protoc-gen-javalite:3.0.0'
            }
        }

        generateProtoTasks {
            all().each {
                task -> task.builtins {
                    remove java
                }
                task.plugins {
                    javalite {}
                }
            }
        }
    }
}